数据链路层滑动窗口协议的设计与实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据链路层滑动窗口协议的设计与实现实验报告

一、实验任务及内容

利用所学数据链路层原理,设计一个滑动窗口协议并在仿真环境下编程实现有噪音信道环境下的可靠的双工通信。信道模型为8000bps 全双工卫星信道,信道传播时延270 毫秒,信道误码率为10-5,信道提供字节流传输服务,网络层分组长度在240~256字节范围。

(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 以太网校验和生成多项式相同。生成多项式为:

x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x1+1

校验和附加在数据帧尾部,接受方用带校验和的数据来逻辑除以生成多项式,余数为零则数据无误码,反之有误码等待发送方重传。

可靠通信和误码控制方案:

通过捎带确认来完成可靠的数据通信;出现信道误码导致收帧出错时,接受方丢弃所有后续帧,此时发送方长久接受不到确认信息,引发定时器超时后发送方重发;接受方无数据传送导致发送方无法收到捎带确认时,接受方确认定时器超时,构造一确认帧单独传送。

三、软件设计

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

本次实验我们对go-back-N协议进行了编写,描述如下:

1.数据结构:

typedefenum {false,true} 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_send; // MAX_SEQ > 1; used for outbound stream, and

initianize next frame going out ack_expected; // oldest frame as yet unacknowledged, and

initianize next ack expected inbound frame_expected; // next frame expected on inbound stream, and

initialize number of frame expected

inbound

buffer[MAX_SEQ+1]; // buffers for the outbound stream nbuffered; // output 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.算法流程:画出流程图,描述算法的主要流程。

相关文档
最新文档