当前位置:文档之家› 计网协议5和协议6程序设计报告

计网协议5和协议6程序设计报告

程序设计报告(2011/2012学年第一学期)题目:数据链路层滑动窗口协议的设计与实现专业网络工程学生姓名朱瑞霖、李小明学生学号 09211517 、 09211524日期 2011-12-01一、实验内容和实验目的利用所学数据链路层原理,自己设计一个滑动窗口协议,在仿真环境下编程实现有噪音信道环境下两站点之间无差错双工通信。

信道模型为8000bps 全双工卫星信道,信道传播时延270毫秒,信道误码率为10-5,信道提供字节流传输服务,网络层分组长度固定为256字节。

通过该实验,进一步巩固和深刻理解数据链路层误码检测的CRC 校验技术,以及滑动窗口的工作机理。

滑动窗口机制的两个主要目标:(1) 实现有噪音信道环境下的无差错传输;(2)充分利用传输信道的带宽。

在程序能够稳定运行并成功实现第一个目标之后,运行程序并检查在信道没有误码和存在误码两种情况下的信道利用率。

为实现第二个目标,提高滑动窗口协议信道利用率,需要根据信道实际情况合理地为协议配置工作参数,包括滑动窗口的大小和重传定时器时限以及ACK 搭载定时器的时限。

这些参数的设计,需要充分理解滑动窗口协议的工作原理并利用所学的理论知识,经过认真的推算,计算出最优取值,并通过程序的运行进行验证。

通过该实验提高同学的编程能力和实践动手能力,体验协议软件在设计上各种问题和调试难度,设计在运行期可跟踪分析协议工作过程的协议软件,巩固和深刻理解理论知识并利用这些知识对系统进行优化,对实际系统中的协议分层和协议软件的设计与实现有基本的认识。

二、实验环境Window操作系统下,Microsoft Visual C++ 6.0 集成化开发环境。

三、实验分工协议5主要由李小明完成,协议6主要由朱瑞霖完成,两协议的测试以及部分参数的设定、测试由两人共同完成。

实验报告由李小明和朱瑞霖共同整理完成。

四、软件设计1、数据结构分析(a)协议五#define inc(k)if(k<MAX_SEQ)k++;else k=0inc宏定义了窗口更新函数,按循环式前进更新。

#define DATA_TIMER 2800DATA_TIMER定义了超时重发的定时器时间#MAX_SEQ 7MAX_SEQ定义了最大窗口序列#pragma comment(lib,"Protocol.lib")该句用来导入静态链接库Protocol.libtypedef struct{unsigned char kind; /* FRAME_DATA */unsigned char ack; //ACK numberunsigned char seq; //seq bumber unsigned char data[PKT_LEN]; //净荷域unsigned int padding; //存放CRC 校验和 }frame;int between(unsigned char a,unsigned char b,unsigned char c)判断帧有没有在当前窗口中static void put_frame(unsigned char *frame, int len)在帧上计算添加校验和,再发送至物理层static void send_data_frame(void)将帧传递给物理层传送,并开始计时器计时2、算法流程图(b)协议六#define MAX_SEQ 31MAX_SEQ 定义了最大窗口序列 #define DATA_TIMER 3800DATA_TIMER 定义了超时重发的定时器时间 #define ACK_TIMER 1100ACK_TIMER 定义了ACK 定时器超时重发时间 #define NR_BUFS 16start switchNETWORK_L AYER_READYPHYSICAL_LAY ER_READYFRAME_RE CEIVEDDATA_TI MEOUTACK_TIM EOUTget_p acket send_da ta_frame inc breakbreak breakbreak breakphl_re ady = 1resend one framesend ack framestop_t imer frame_ex pected? start_ack_timer Y N(nbuffered < MAX_SEQ && phl_readyenable_netw ork_layer(); disable_net work_layer();Y NNR_BUFS定义了缓冲#define inc(k)if(k<MAX_SEQ)k++;else k=0inc宏定义了窗口更新函数,按循环式前进更新。

帧结构定义如下:typedef struct FRAME {unsigned char kind;seq_nr ack;seq_nr seq;packet data;unsigned int padding;}Frame;为了体现出网络层数据包与帧结构的不同,对帧结构进行再次封装。

不过由于程序没用到网络层方面的东西,因此网络层包结构只包含帧结构字段,不包含其他字段。

其定义如下:typedef struct{unsigned char info[PKT_LEN];}packet;PKT_LEN帧结构最大长度。

#pragma comment(lib,"Protocol.lib")该句用来导入静态链接库Protocol.libbool no_nak=true;该全局变量用来判断表示没有NAK,可以用来提高发送效率。

static int phl_ready = 0;静态变量用来标示物理层状态,物理层Ready用phl_ready=1表示,未准备好用0表示。

Event表示到达事件类型,arg打印日志时候库函数用到,len用来保存返回的包长度。

int event,arg,len=0;帧变量r定义如下:Frame r;其他定义。

seq_nr next_frame_to_send;seq_nr ack_expected;seq_nr frame_expected;seq_nr too_far;seq_nr nbuffered;packet out_buf[NR_BUFS];packet in_buf[NR_BUFS];bool arrived[NR_BUFS];next_frame_to_send标示下一个要发送的帧的序列号。

ack_expected标示下一个要接受的ack序列号。

frame_expected标示下一个要接受的帧的序列号。

too_far用做判断。

nbuffered定义当前Buffer位置,防止越界,超过NR_BUFS长度时限制从网络层接收包。

out_buf和in_buf分别表示out包和in包缓冲。

其最大值均标示为NR_BUFS。

arrived一维数组用用来表示Arrived情况,到达为1,否则为0.2、模块结构分析static int between(seq_nr a,seq_nr b,seq_nr c);判断序列号是否在窗口内。

static void send_data();根据发送数据类型是“FRAME_DATA”,“FRAME_NAK”,“FRAME_ACK”来发送不同的数据,函数参数参考程序源码,在此不列出。

static void put_frame(unsigned char *frame, int len)进行CRC校验,同时添加特定的标识字段然后上交给网络层。

3、算法流程(见下页)五、实验测试Go-back-N性能测试记录表序号命令说明运行时间(秒)效率(%) 备注A B1 datalink audatalink bu 无误码信道数据传输1800 52 70.5 发送窗口大小7、定时器时长28002 datalink adatalink b 站点A分组层平缓方式发出数据,站点B周期性交替“发送100秒,停发100秒”1800 41.5 57.5 同上3 datalink afudatalink bfu 无误码信道,站点A和站点B的分组层都洪水式产生分组1800 96.9 96.9 同上4 datalink afdatalink bf 站点A/B的分组层都洪水式产生分组1800 74.5 74.7 同上5 datalink af –ber1e-4datalink bf –ber1e-4 站点A/B的分组层都洪水式产生分组,线路误码率设为10-41800 25.8 26.2 同上6 datalink adatalink b 站点A分组层平缓方式发出数据,站点B周期性交替“发送100秒,停发100秒”1800 27.1 43.4 定时器时长设为2000第一组测试(最优:窗口大小MAX_SEQ=7、定时器DATA_TIMER=2800)(1)、au&bu(2)a&b(3)afu&bfu(4)af&bf(5) af&bf 误码率为1e-4第二组测试(窗口大小MAX_SEQ=7、定时器DATA_TIMER=2000) (6)a&b 窗口大小7、定时器时长2000SLECTIVE REPEAT性能测试记录表序号命令说明运行时间(秒)效率(%) 备注A B1 Slective auSlective bu 无误码信道数据传输1800 53.3 96.97发送窗口大小16、DATA_TIMER=3800ACK_TIMER=11002 Slective aSlective b 站点A分组层平缓方式发出数据,站点B周期性交替“发送100秒,停发100秒”1800 52.3 94.0 同上3 Slective afuSlective bfu 无误码信道,站点A和站点B的分组层都洪水式产生分组1800 96.9796.97同上4 Slective afSlective bf 站点A/B的分组层都洪水式产生分组1800 95.0 94.6 同上5 Slective af –ber1e-4Slective bf –ber1e-4 站点A/B的分组层都洪水式产生分组,线路误码率设为10-41800 60.6 59.5 同上6 Slective aSlective b 站点A分组层平缓方式发出数据,站点B周期性交替“发送100秒,停发100秒”1800 46.5 85.5 发送窗口大小16、DATA_TIMER=2000ACK_TIMER=11007 Slective aSlective b 站点A分组层平缓方式发出数据,站点B周期性交替“发送100秒,停发100秒”1800 52 70.5 发送窗口大小16、DATA_TIMER=5000ACK_TIMER=1100第一组测试(当前最大窗口数是MAX_SEQ=31,即发送窗口为NR_BUFS=(MAX_SEQ+1)/2=16,发送数据帧定时器时长为DATA_TIMER=3800,ACK 等待定时器时长为ACK_TIMER=1100。

相关主题