计算机网络滑动窗口协议实验报告目录一、实验内容和实验环境描述(2)1.实验内容(2)2.实验目的(2)3.实验环境(2)二、协议设计(3)三、软件设计(4)Part A 选择重传协议1.数据结构(4)2.模块结构(6)3.算法流程(7)Part B gobackn协议1.数据结构(8)2.模块结构(9)3.算法流程(10)四、实验结果分析(11)五、探究问题(13)六、实验总结与心得体会(14)一、实验内容和实验环境描述1.实验内容利用所学数据链路层原理,自己设计一个滑动窗口协议,在仿真环境下编程实现有噪音信道环境下两站点之间无差错双工通信。
信道模型为8000bps全双工卫星信道,信道传播时延270毫秒,信道误码率为10−5,信道提供字节流传输服务,网络层分组长度固定为 256 字节。
2.实验目的通过该实验,进一步巩固和深刻理解数据链路层误码检测的CRC校验技术,以及滑动窗口的工作机理。
滑动窗口机制的两个主要目的:(1)实现有噪音信道环境下的无差错传输;(2)充分利用传输信道的带宽。
在程序能够稳定运行并成功实现第一个目标之后,运行程序并检查在信道没有误码和存在误码两种情况下的信道利用率。
为实现第二个目标,提高滑动窗口协议信道利用率,需要根据信道实际情况合理地为协议配置工作参数,包括滑动窗口的大小和重传定时器时限以及 ACK 搭载定时器的时限。
3.实验环境Windows10环境PC机Microsoft Visual Studio 2017集成开发环境二、协议设计本次试验主要设计数据链路层,实验中分别设计了gobackn协议与选择重传协议。
主要涉及到的层次结构是物理层、数据链路层、网络层。
物理层:为数据链路层提供的服务为8000bps,270ms传播延时,10−5误码率的字节流传输通道。
数据链路层利用接口函数send_frame()和 recv_frame()从物理层发送和接收一帧。
网络层:利用数据链路层提供的“可靠的分组传输”服务,在站点A与站点B之间交换长度固定为256 字节的数据分组。
网络层把产生的分组交付数据链路层,并接受数据链路层提交来的数据分组。
数据链路层:通过 get_packet()函数从网络层得到一个分组,将之组装成帧,向物理层发送,启动计时器;进行适当的流量控制;数据帧经信道传送给接收方;接收方数据链路层终止定时器(或启动ack定时器),判断数据是否出错,若正确的话,是否为欲接受数据。
若所受到的数据帧是期待接受的数据帧,则通过put_packet()函数将其缓冲区内缓存的数据依序提交给网络层。
可靠通信的实现:通过捎带确认来完成可靠的数据通信。
在选择重传协议中:1)出现信道误码导致收帧出错时,若未发送过该帧的NAK则接收方发NAK帧要求发送方重传;若已经发送过NAK,则等待定时器超时后发送方重发;2)当收到的帧位于接收窗口内,但不是接收窗口下边界的一帧时,将该帧进行缓存,待窗口下边界的帧到来后依序递交给网络层;3)接收方无数据传送导致发送方无法收到捎带确认时,接收方ACK定时器超时,构造ACK帧单独传送。
在gobackn协议中:1)出现信道误码导致收帧出错时,等待定时器超时后发送方重发;2)当收到的帧不是期望收到的数据帧时,不做处理,等待定时器超时后发送方重发;3)接收方无数据传送导致发送方无法收到捎带确认时,接收方ACK定时器超时,构造ACK帧单独传送。
三、软件设计PartA.选择重传协议1.数据结构1)帧结构定义:typedefstruct{unsignedchar kind; //类型FRAME_DATA、FRAME_ACK、FRAME_NAKseq_nr ack; //ack序号seq_nr seq; //帧序号packet data; //数据域unsignedint padding; //填充部分保存CRC校验和}frame;各类帧格式如下DATA Frame+=========+========+========+===============+========+| KIND(1) | SEQ(1) | ACK(1) | DATA(240~256) | CRC(4) |+=========+========+========+===============+========+ACK Frame+=========+========+========+| KIND(1) | ACK(1) | CRC(4) |+=========+========+========+NAK Frame+=========+========+========+| KIND(1) | ACK(1) | CRC(4) |+=========+========+========+2)全局变量定义bool no_nak = true; //nak发送标志staticint phl_ready = 0; //物理层就绪标志3)常量定义帧类型:#define FRAME_DATA 1#define FRAME_ACK 2#define FRAME_NAK 3发生事件类型:#define NETWORK_LAYER_READY 0#define PHYSICAL_LAYER_READY 1#define FRAME_RECEIVED 2#define DATA_TIMEOUT 3#define ACK_TIMEOUT 4其他内容:#define MAX_SEQ 15 //序号最大值#define DATA_TIMER 3850 //数据帧超时时间#define ACK_TIMER 1000 // ack超时时间#define NR_BUFS 8 //滑动窗口大小4)主函数变量定义seq_nr ack_expected;//发送窗口下边界seq_nr next_frame_to_send; //发送窗口上边界seq_nr frame_expected;//接收窗口下边界seq_nr too_far;//接收窗口上边界seq_nr nbuffered;//缓冲区内未上交的帧数目packet in_buf[NR_BUFS];//接收缓冲区packet out_buf[NR_BUFS];//发送缓冲区bool arrived[NR_BUFS]; //标志缓冲区是否空闲或该帧是否到达int i;//i计数变量int arg, len = 0; //len帧长度arg获得事件相关信息frame r;//数据帧int event;//事件类型2.模块结构1)子函数定义及功能介绍a)staticint between(seq_nr a, seq_nr b, seq_nr c)功能:判断某一帧是否落在窗口内参数:a、c分别为上下边界,b为需要判断的序号b)staticvoid put_frame(unsignedchar *frame, int len)功能:计算校验和后添加至帧尾,并向物理层发送参数:frame指示需要计算的校验和的帧len表示该帧的长度c)staticvoid send_data(unsignedchar fk, seq_nr frame_nr,seq_nr frame_expected, packet buffer[])功能:向物理层发送数据帧参数:fk表示发送帧的类型frame frame_nr 表示将要发送的帧的序号frame_expected 表示接收窗口的下边界buffer[] 表示发送方缓冲区2)子函数之间的调用关系c)调用b)进行帧的发送,其余函数之间无调用关系3.算法流程PartB.gobackn协议1.数据结构1)帧结构定义:typedefstruct{unsignedchar kind; //类型FRAME_DATA、FRAME_ACK、FRAME_NAKseq_nr ack; //ack序号seq_nr seq; //帧序号packet data; //数据域unsignedint padding; //填充部分保存CRC校验和}frame;各类帧格式如下DATA Frame+=========+========+========+===============+========+| KIND(1) | SEQ(1) | ACK(1) | DATA(240~256) | CRC(4) |+=========+========+========+===============+========+ACK Frame+=========+========+========+| KIND(1) | ACK(1) | CRC(4) |+=========+========+========+NAK Frame+=========+========+========+| KIND(1) | ACK(1) | CRC(4) |+=========+========+========+2)全局变量定义staticint phl_ready = 0; //物理层就绪标志3)常量定义帧类型:#define FRAME_DATA 1#define FRAME_ACK 2#define FRAME_NAK 3发生事件类型:#define NETWORK_LAYER_READY 0#define PHYSICAL_LAYER_READY 1#define FRAME_RECEIVED 2#define DATA_TIMEOUT 3#define ACK_TIMEOUT 4其他内容:#define MAX_SEQ7 //序号最大值#define DATA_TIMER2400 //数据帧超时时间#define ACK_TIMER500 // ack超时时间4)主函数变量定义int event, arg;//event事件类型 arg获得事件相关信息frame f;//数据帧int len = 0; //len帧长度int i;//i计数变量seq_nr next_frame_to_send; //发送窗口上边界seq_nr ack_expected;//发送窗口下边界seq_nr frame_expected;//接收窗口值packet buffer[MAX_SEQ + 1];//数据帧缓存区seq_nr nbuffered;//缓冲区内未上交的帧数目2.模块结构1)子函数定义及功能介绍a)staticint between(seq_nr a, seq_nr b, seq_nr c)功能:判断某一帧是否落在窗口内参数:a、c分别为上下边界,b为需要判断的序号b)staticvoid put_frame(unsignedchar *frame, int len)功能:计算校验和后添加至帧尾,并向物理层发送参数:frame指示需要计算的校验和的帧len表示该帧的长度c)staticvoid send_data_frame(unsignedchar fk, seq_nr frame_nr,seq_nr frame_expected, packet buffer[])功能:向物理层发送数据帧参数:fk表示发送帧的类型frame frame_nr 表示将要发送的帧的序号frame_expected 表示接收窗口的边界buffer[] 表示发送方缓冲区d)staticvoid send_ack_frame(unsignedchar fk, seq_nr frame_nr,seq_nr frame_expected, packet buffer[])功能:向物理层发送ack帧参数:fk表示发送帧的类型frame frame_nr 表示将要发送的帧的序号,此时为0frame_expected 表示接收窗口的边界buffer[] 表示发送方缓冲区2)子函数之间的调用关系d)与d)调用b)进行帧的发送,其余函数之间无调用关系3.算法流程四、实验结果分析1.描述你所实现的协议软件是否实现了有误码信道环境中无差错传输功能。