数据链路层_ARQ协议_指导

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

•任务

1. 同学编写数据链路层通信协议,由《发送端程序》和《接收端程

序》实现,确保数据可靠传输;

2. 总结实验过程(实验报告,左侧装订):方案、编程、调试、

结果、分析、结论。

•成绩评定

1.若完全实现无差错传输(无丢失、无差错、不重叠、不乱序、...)且实验报

告出色,5分;

2.若完成部分无差错传输,依据实验结果定成绩,3~4分;

3.若没有完成基本的传输任务,依据实验结果定成绩,1~2分;

4.没有进行实验和无实验报告者,0分;

•实验环境

1.Windows 9x/NT/2000/XP/2003

2.TCP/IP协议

•同学程序

1.认真复习数据链路层容,熟悉编程语言C、C++和WINDOWS程序设计技术(查

阅参考书);

2.开发工具:Visual C++ 6.0、Visual Basic 6.0、C++ Builder、Java、C#、

Turbo C/C++或其它;

3.程序示例:理想信道的《发送端程序》和《接收端程序》(含源码VC6.0);

1.ARQ基本协议1:_引入检错和应答帧

2.ARQ基本协议2:_引入超时计时器

3.ARQ基本协议3:_引入数据帧携带发送序号0~1

4.ARQ基本协议4:_引入确认帧携带发送序号0~1

5.ARQ基本协议5:_引入应答帧含有校验码

6.ARQ基本协议6:_引入数据帧和确认帧含有发送序号0~7,Ws=1,Ws=1

7.下载: ARQ基本协议1~6及数字信道仿真程序

4.示例实验指导

•协议设计建议

-协议中不考虑成帧

1.数据帧和应答帧以字节为单位;

2.数据帧:低4位D3~D0为数据段(取值0000B~1001B,即0~9),最高位为

校验位(D7),发送序号段:D6~D4;

3.应答帧:确认帧ACK:低4位D3~D0取值1111B(FH),否认帧NAK:低4位

D3~D0取值1110B(EH),发送序号段:D6~D4;

4.按上述定义,发送序号个数最大为8;实际使用时,可自行选取发送序号个数

2或4,甚至不使用。

-协议中考虑成帧

1.参见授课讲义和教材的相关容;

2.数据帧:帧头+发送序号+数据段+校验段+帧尾;

3.应答帧:帧头+发送序号+校验段+帧尾;

-协议方案提示

1.基本ARQ协议;否认帧不必携带出错数据帧的发送序号。

2.连续ARQ协议-回退N帧ARQ协议;应采用滑动窗口技术和否认帧应携带出错

数据帧的发送序号。

3.连续ARQ协议-选择重发ARQ协议;基本同上;

•信道仿真程序

1.功能:可仿真信道上的信息(数据帧或应答帧)产生丢失、产生差错和传输时

延;

2.下载:V1.21,解压后,直接运行!

1.界面:

•实验系统原理

1.《发送端程序》、《信道仿真程序》和《接收端程序》采用UDP(TCP/IP)通

信;

2.若单机实验:《发送端程序》、《信道仿真程序》和《接收端程序》的IP地

址设置为127.0.0.1(本机);

3.《发送端程序》的端口=6666、《信道仿真程序》的端口=7777、《接收端程序》

的端口=8888;

4.用户程序(《发送端程序》和《接收端程序》)的信息发送到信道(《信道仿

真程序》),《信道仿真程序》经过处理(产生丢失、产生差错和传输时延),

然后转发到对方。

•参考程序段

1.设置(偶)校验位

//---------------------------------------------------

void SetCheck(char& c) //设置(偶)校验位D7 (一个字节)

{

int i,sum = 0;

BYTE x = 0x01;

for(i=0; i<7; i++) //求D6~D0位的有1的个数->sum

{

if(c & x) sum++;

x = x << 1;

}

if(sum % 2) c = c|0x80; //若sum为奇数,则置D7=1

else c = c & 0x7F; //若sum为偶数,则置D7=0

}

//---------------------------------------------------

2..校验(偶)校验位

//---------------------------------------------------

bool checkSum(BYTE c) //(偶)校验计算(一个字节)

{

int i,sum = 0;

BYTE x = 0x01;

for(i=0; i<8; i++) //求D7~D0位的有1的个数->sum { if(c & x) sum++; x = x><

<1; } if(sum % 2) return false; //若sum为奇数,则有差错! return true; //若sum为偶数,则无差错 }

//-----------------------------------------------------

3.定时器函数(WIN32 API函数)

//---------------------------------------------------

#define ID_TIMER 1 //定时器标号

#define ID_TIMER_c 1000L //超时时间:1000L=1000 ms

//消息处理

LRESULT CALLBACK WndProc(HWND hW, UINT msg, WPARAM wP, LPARAM lP)

{

switch( msg )

{

case WM_XXXXX: //其它事件触发.

... ...

SetTimer(hW, ID_TIMER, ID_TIMER_c, NULL);//启动 Timer.

... ...

KillTimer(hW, ID_TIMER); //停止 Timer.

... ...

break;

case WM_TIMER: //Timer事件触发.

... ...

KillTimer(hW, ID_TIMER); //停止 Timer.

wlcSend(aa[Sendi]); //物理层:发送一个字节,重发.

SetTimer(hW, ID_TIMER, ID_TIMER_c, NULL); //启动Timer.

break;

case WM_XXXXX: //其它事件触发.

... ...

break;

}

}

//------------------------------------------------------

相关文档
最新文档