数据链路层滑动窗口协议的设计与实现实验报告。
一、实验任务及内容。
利用所学数据链路层原理,设计一个滑动窗口协议并在**环境下编程实现有噪音信道环境下的可靠的双工通信。信道模型为8000bps 全双工卫星信道,信道传播时延270 毫秒,信道误码率为10-5,信道提供字节流传输服务,网络层分组长度在240~节范围。
1) 实现有噪音信道环境下的无差错传输。
2) 运行程序并检查在信道没有误码和存在误码两种情况下的信道利用率。
3) 提高滑动窗口协议信道利用率,根据信道实际情况合理地为协议配置工作参数,包括滑动窗口的大小和重传定时器时限以及ack 搭载定时器的时限。
实验环境。windows 7环境pc机,microsoft visual c++ 6.0 集成化开发环境。
二、协议设计。
协议的分层结构及层服务:
包括物理层,数据链路层和网络层三层。
该实验主要设计数据链路层协议,为实现有噪声环境下高信道利用率传输,我们采用回退n帧(go back n)技术的协议。发送方窗口大小为31;通过捎带确认来完成可靠的数据通信;出现信道误码导致收帧出错时,接受方丢弃所有后续帧,待定时器超时后发送方重发。
该层提供服务:从网络层接受要发送的数据包,将之分拆成数据帧;按一定的成帧方案完成分帧,加校验码,加ack等操作;进行适当的流量判断和拥塞控制;启动定时器将之传递给物理层。数据帧经信道传送给接受方,接受方数据链路层执行与成帧相逆的操作;处理ack信息,终止定时器(或启动ack定时器,ack成帧传送);判断是否为欲接受数据,数据是否出错,提交给网络层。
退回n步工作原理示意图:
实验所形成帧(成帧方案):
data framen
| kind(1) |ack(1) |seq(1) |data(240~256) |crc(4) |
ack frame
| kind(1) |ack(1) |crc(4) |
nak frame
| kind(1) |ack(1) |crc(4) |
crc校验和的多项式定义:
本次实验采用的crc校验方案为crc-32,与ieee802.3 以太网校验和生成多项式相同。生成多项式为:
校验和附加在数据帧尾部,接受方用带校验和的数据来逻辑除以生成多项式,余数为零则数据无误码,反之有误码等待发送方重传。
可靠通信和误码控制方案:
通过捎带确认来完成可靠的数据通信;出现信道误码导致收帧出错时,接受方丢弃所有后续帧,此时发送方长久接受不到确认信息,引发定时器超时后发送方重发;接受方无数据传送导致发送方无法收到捎带确认时,接受方确认定时器超时,构造一确认帧单独传送。
三、软件设计。
给出程序的数据结构,模块之间的调用关系和功能,程序流程。
本次实验我们对go-back-n协议进行了编写,描述如下:
1. 数据结构:
typedefenum boolean;//bloolean type
typedef unsigned char seq_nr;//sequence or ack numbers
typedef unsigned char packet[pkt_len];/用数组存放数据。
* frame kind */
#define data 1
#define ack 2
#define nak 3
static intphl_ready物理层状态。
next_frame_to_sendmax_seq > 1; used for outbound stream, and initianize next frame going out
ack_expectedoldest frame as yet unacknowledged, and initianize next ack expected inbound
frame_expectednext frame expected on inbound stream, and initialize number of frame expected inbound
buffer[max_seq+1buffers for the outbound stream
nbufferedoutput buffers currently in use, and
initially no packets are buffered
bufferlen[max_seq+1]//bufferlen 存储每个buffer中数据的有效长度。
typedefstruct帧结构。
unsigned char kind;
seq_nrack;
seq_nrseq;
packetinfo;
unsigned char crc[4];
frame;
2. 模块结构:给出程序中所设计的子程序完成的功能,子程序每个参数的意义。
a)static boolean between (seq_nra,seq_nrb,seq_nr c)//判断b是否是在a、c之间的帧。
b)static void put_frame(unsigned char *frame, intlen)//crc编码并向物理层发送。
c)send_data(unsigned char kind,seq_nrframe_nr,seq_nrframe_expected,packet buffer,intdlen)生成帧。
d)int main主函数,分为五个事件。
1) network_layer_ready,事件发生后从网络层读数据,成帧;若当前物理层可用,发送。
2) physical_layer_ready,事件发生后,若有未发送的帧,发送,否则置物理层状态为可用。
3) data_incoming,事件发生后,来了arg个字节的数据,每接受一个数据,判断是否为帧尾;若为帧尾,提取一帧,去掉填充,进行校验;若校验结果正确,处理ack,然后处理数据。接受完arg个字节,跳出。
4) ack_timeout,事件发生后,产生一个不含数据的ack帧,等待直到物理层有效,发送。
5) data_timeout,事件发生后,重发ack_expected和next_frame_to_send之间的帧。
3. 算法流程:画出流程图,描述算法的主要流程。
四、实验结果分析。
1) 描述你所实现的协议软件是否实现了误码信道环境中无差错传输功能。
此协议软件实现了误码信道环境中无差错传输功能。
2) 程序的健壮性。
在较低误码率的信道条件下,该程序运行平稳,未出现任何差错,健壮性良好,在高误码率的信道条件下,程序运行有时会出现中断,但大多数时候均运行超过二十分钟以上,故本程序健壮性良好,但仍有值得改进之处。
3)协议参数的选取:
滑动窗口的大小为7,重传定时器的时限2000,ack 搭载定时器的时限为300。
在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值。
滑动窗口大小的选择直接涉及到信道利用率和数据拥塞的问题;若太小,会导致信道空闲,利用率很低;若太大,数据发送过快,会造成接受方数据链路层来不及处理,数据物理层及信道发生拥塞现象导致数据丢失,出错率增大,重传率高。8000kbps的信道发送节的帧需要 256*8/8000 = 256ms (256+270*2)/256 = 最大窗口应该7就行了。
重传定时器的大小由发送速率、信道时延及接受方的发送频率等确定,太小会频繁重发,太大也会降低信道利用率。结合多项测试最终定为2000ms。
ack搭载定时器的时限由本站的发送频率决定,一方面,为了节省带宽应该尽量搭载使用。另一方面当本站长时间无数据发送时应该尽量早点发送ack帧。经过数项测试,定位300ms。
4)理论分析:
无差错条件下分组层能获得的最大信道利用率应该是256/262*100%=97.7,而在误码率为1e-5的情况下应为256/262(1+262*8*0.00001)=95.5。
第三章数据链路层作业
3 02数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。答 链路管理。帧定界流量控制差错控制将数据和控制信息区分开透明传输寻址。可靠的链路层的优点和缺点取决于所应用的环境 对于干扰严重的信道,可靠的链路层可以将重传范围约束在局部链路,防止全网络的传输效率受损 对...