当前位置:文档之家› gobackn协议实验报告

gobackn协议实验报告

一个数据帧如图所示:其中有效数据和校验码可能含有转义字符。

(3) 帧中各个字段的定义和编码,计算CRC校验和的多项式定义帧的定义编码:帧中的第一比特为开头FLAG,第二比特是帧的类型,共定义了{data,ack,nak} frame_kind三种类型,用枚举常量表述,第三比特是顺序编码,用于确定到达帧的顺序,第四比特是ACK捎带确认讯息,记录了当前已收到帧的确认情况,这是数据帧的头部。

若为数据帧,从第五比特开始为网路层的数据,到网路层包裹信息结束后,接上4比特的CRC校验讯息,后有一结束字符FLAG表明该帧结束。

CRC校验数:CRC校验数据由函数crc32()产生,函数crc32()返回一个32位整数为数据生成CRC-32校验和,并且把这 32比特校验和附在数据字节之后。

多项式定义:采用的CRC校验方案为CRC-32,生成多项式为:x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x1+1校验和附加在数据帧尾部,接受方用带校验和的数据来逻辑除以生成多项式,余数为零则数据无误码,反之有误码等待发送方重传。

(4) 协议工作时两个站点之间信息交换的过程控制,尤其是发生误码条件下的控制方案协议工作时,两个站点通过互发数据包交换数据,而控制讯息则稍带在数据讯息中传递,当遇到超时情况时,则主动发送空数据包以提供讯息。

当出现帧丢失时,如收到帧的序号有跳跃,或者出现CRC校验出错丢弃了某帧,会主动发送NAK否定帧,提示重传,接收方丢弃所有的后续帧。

若长期未产生放送消息,则出现ACK超时事件,主动发送ACK帧提示确认,对方收到确认后,滑动窗口继续发送,若一直未收到确认讯息,则出现数据帧超时事件,发送方会自动重发未确认帧。

11.3 软件设计给出程序的数据结构,模块之间的调用关系和功能,程序流程。

(1)数据结构:数据结构是整个程序的要点之一,程序维护者充分了解数据结构就可以对主要算法和处理流程有个基本的理解。

描述程序中自定义结构体中各成员的用途,定义的全局变量和主函数中的变量的变量名和变量所起的作用。

采用字符数组结构来存放数据帧:typedef unsigned char seq_nr;typedef unsigned char packet[PKT_LEN];typedef unsigned char frame_kind;typedef struct FRAME {frame_kind kind; /* FRAME_DATA */seq_nr ack;seq_nr seq;packet info;unsigned int padding;} frame;其中:frame kind 是帧的类型。

Ack 捎带确认数据帧是否正确传到Seq 是数据帧传输的序号info是帧传输的内容Padding是帧经过CRC校验之后所添加的内容定义的全局变量:static int phl_ready 表示物理层的状态int out_buffer_len[MAX_SEQ + 1] 从网络层得到的数据包的长度主函数中的变量的变量名和变量:int event 接收方等待的发生事件int arg 物理层到达的字数packet buffer[MAX_SEQ+1]; 发送方的数据包缓存区seq_nr nbuffered 当前帧号seq_nr next_frame_to_send 下一个要发送的帧的序号seq_nr ack_expected 期望收到的确认seq_nr frame_expected; 期望接收到对方的帧的编号frame r; 变量帧(2)模块结构:给出程序中所设计的子程序所完成的功能,子程序每个参数的意义。

给出子程序之间的程序调用关系图。

函数between(seq_nr a,seq_nr b,seq_nr c)用于判断收到的ACK序号是否在发送窗口内。

a 为下限,b为ack序号,c为上限。

函数send_to_physical(unsigned char *out_buf, int slen)用字符填充方式将帧发送到物理层函数recv_from_physical(unsigned char *in_buf, int arg)用于从物理层接收一个字节并做处理函数send_data_frame(frame_kind fk, seq_nr frame_nr, seq_nr frame_expected, packet buffer) 用于发送从网络层得到的数据函数调用图为:主函数mainbetween send_to_phys recv_from_ph send_data_fram(3) 算法流程:画出流程图,描述算法的主要流程。

11.4 实验结果分析(1)描述所实现的协议软件是否实现了有误码信道环境中无差错传输功能。

能实现协议软件是否实现了有误码信道环境中无差错传输功能,采用了CRC校验和重传技术是错误得以被发现和纠正。

(2) 程序的健壮性如何,能否可靠地长时间运行。

程序健壮性较好,在高负荷和高误码率等条件下均能工作。

在较低误码率的信道条件下,该程序运行平稳,没有出现任何差错,健壮性良好,在高误码率的信道条件下,程序运行有时会出现中断,但大多数时候运行时间较长,故本程序健壮性良好。

(3) 协议参数的选取:滑动窗口的大小,重传定时器的时限, ACK 搭载定时器的时限,这些参数是怎样确定的?根据信道特性数据,分组层分组的大小,以及你的滑动窗口机制,给出定量分析,详细列举出选择这些参数值的具体原因。

本次实验中物理层提供了一种字节流传输服务,为了成帧,使用了字节填充技术。

分组长度为240~256字节。

滑动窗口的大小:该参数的选择直接涉及到信道利用率和数据拥塞的问题;若太小,会导致信道利用率很低,信道中长时间没有数据传送;若太大,数据发送过快,会造成接受方数据链路层来不及处理,数据物理层及信道发生拥塞现象导致数据丢失,出错率增大。

在go_back_n协议中(假设接受方一直有数据发送,即无ack定时器超时现象),滑动窗口的大小M,信道传输时延a,发送速率c,帧大小f在满足如下关系时信道利用率(M*(f/c)/[2a+2(f/c)])接近100%:M>=[2a+2*(f/c)]/(f/c);由于实际数据传送很可能在某段时间类接受方无数据反送,涉及ack帧单独传送问题,故一般信道利用率不可能达到100%,但M的选择至少要满足公式。

至于防止M过大的问题,可通过实际测试的结果分析来得到合适的M值。

最终,我们选择M值为31,效果较好。

重传定时器的时限:该参数的选择涉及到重传的相应时间,若改时间选择过大,则会导致重传等待的时间过久,若时间选择过小,则将导致较为频繁的重传,这两种情况均将导致信道利用率的下降,经过实际检测,当wait_time设为1700ms时,效果较好。

Ack搭载定时器的时限:若该值选择较小,则将导致频繁重传ack帧,虽然我们在程序中将ack帧的长度设定为8(最小长度),但频繁的重传仍将降低信道利用率;若将该值设置过大,则发送方将长时间得不到ack确认信号,严重时将导致重传,降低利用率。

经过实际测试,ack_time选择为240-300ms内,效果较好。

(5) 理论分析:根据所设计的滑动窗口工作机制(Go-Back-N),推导出在无差错信道环境下分组层能获得的最大信道利用率;推导出在有误码条件下重传操作及时发生等理想情况下分组层能获得的最大信道利用率。

给出理论推导过程。

理论推导的目的是得到信道利用率的极限数据。

为了简化有误码条件下的最大利用率推导过程,可以对问题模型进行简化,比如:假定超时重传的数据帧的回馈ACK 帧可以100%正确传输,但是简化问题分析的这些假设必须不会对整个结论产生较大的误差。

由于需要携带帧讯息,因此最大的信息利用率为约为96.2%,由于信道的最大比特率为8000bps,可得出每传输一个字节耗时1ms,每帧的附加讯息固定为10,耗时10ms,若出现转义字符,则可能增加时间,在ESC/FLAG模式中传输的平均250个字符需要两倍的传输空间即极限值500,此时的信道利用率的极限值是49%,若平均每个错帧重传10次,利用率将下降为40%。

(6) 实验结果分析:你的程序运行实际达到了什么样的效率,比对理论推导给出的结论,有没有差距?给出原因。

有没有改进的办法?如果没有时间把这些方法付诸编程实施,介绍你的方案。

实验所得的结果是无差错条件下分组层能获得的最大信道利用率对于A是50%,对于B是100%。

(7) 存在的问题:在“表3 性能测试记录表”中给出了7 种测试方案,在测试中你的程序有没有失败,或者,虽未失败,但表现出来的性能仍有差距,你的程序中还存在哪些问题?在误码率不同的情况下所执行程序的结果截图如下:当参数为u的运行结果:无参数时运行结果为:参数为fu的运行结果:参数为f的的运行结果如下:当参数为fs时的运行结果如下:该图参数为afs:该图参数为bfs:当参数为fle的运行结果:该图的参数为afle该图的参数为bfle当参数为fl时的运行效果如下:当参数为f –ber 1e-7时的运行效果:当参数为f –ber 5e-5时程序运行效果如下:该程序存在的主要问题就在于会反复重传未被确认的帧,造成了信道资源的浪费,这可以在实验的结果中看出,在进行较长时间的运行后,信道流量水平趋于平稳,此时的数据和理论之大致相当,说明所确认的问题确实是症结所在。

只要能限制其反复重传,就能提高信道利用率。

11.5 研究和探索的问题前面列出的“可研究和探索的问题”,有哪些问题你有了答案或者自己的见解?给出你的结论,并详细阐述你的理由或见解。

1. CRC 校验能力CRC校验码的检错能力很强,它除了能检查出离散错外,还能检查出突发错,CRC校验码具有以下检错能力:CRC校验码能检查出全部单个错;CRC校验码能检查出全部离散的二位错;CRC校验码能检查出全部奇数个错;CRC校验码能检查出全部长度小于或等于K位的突发错;CRC校验码能以[1-(1/2)K-1]的概率检查出长度为(K+1)位的突发错。

2. 软件测试方面的问题(1)验证所完成的程序能否在各种情况下都能够正确工作,是软件测试环节的主要目的。

(2)表3 中列出了七种测试方案,设计这么多种测试方案的目的是检测此程序在不同信道条件下的传输性能。

-u是测试成帧方案的效率。

无参数时模拟在实际线路中,不连续的收发时的传输性能。

-f 用于测试信道满负荷时的传输性能。

-l,-e,-s用于测试在特殊情境下传输性能。

-ber可以改变误码率,从而检验无差错传输的健壮性及性能。

11.6 实验总结和心得体会如果一切100%顺利,编辑的程序一次编译就通过,运行一次就正确,那么完成本次实验的代码编写和调试工作大约需要4~6 个小时。

相关主题