1.实验内容和实验环境描述
实验内容:
利用所学数据链路层原理,设计一个滑动窗口协议,在仿真环境下编程实现有噪音信道
环境下两站点之间无差错双工通信。信道模型为8000bps 全双工卫星信道,信道传播时延270
毫秒,信道误码率为10-5,信道提供字节流传输服务,网络层分组长度固定为256字节。
实验环境:
Windows7—64 位操作系统 PC 机 VC 6.0
2.协议设计
数据结构:
数据帧
+=========+========+========+===============+========+
| KIND(1)
|
+=========+========+========+===============+========+
| DATA(240~256)
| ACK(1)
| SEQ(1)
| CRC(4)
确认帧
+=========+========+========+
| KIND(1)
|
+=========+========+========+
| ACK(1)
| CRC(4)
否定确认帧
+=========+========+========+
| KIND(1)
|
+=========+========+========+
| ACK(1)
| CRC(4)
KIND:表示帧的类别
ACK:ACK序列号
SEQ:帧序列号
CRC:校验和
模块结构:
static inc(Uchar* a)
作用:使一个字节在 0~MAX_SEQ 的范围内循环自增。
参数:a,字节类型。
static between(Uchar a,Uchar b,Uchar c)
作用:判断当前帧是否落在发送/接收窗口内。
参数:a,b,c,均为字节类型,其中两个分别为窗口的上、下界,一个为帧的编号。其中,发
送窗口的上界和下界分别为 next_to_send 和 ack_expected,接收窗口的上界和下界分别为
too_far 和 frame_expected,均定义在 main 函数中。
static void put_frame(unsigned char *frame, int len)
作用:为一个帧做 CRC 校验,填充至帧的尾部并将其递交给网络层发送。
参数:frame,字节数组,由除 padding 域之外的帧内容转换而来;len,整型,为帧的当前
长度。
static send_frame_(Uchar fk,Uchar next_frame,Uchar frame_expected,Packet out_buf[])
作用:构造一个帧,并将其发送。
参数:fk,字节类型,为帧的内容;next_frame,字节类型,为帧的编号;frame_expected,
字节类型,为希望收到的帧的编号;out_buf,二维字节数组,为缓冲区。
int main(int argc,char *argv[])
作用:主程式,包含选择重传协议的算法流程。
参数:argc,整型,表示命令行参数的个数;argv,二维字符数组,表示参数内容。
算法流程:
Network layer
ready
Get packet()
Phy-layer
ready
Send_data()
Get_num>0
Y
Send frame
N
Phy ready?
Y
Sent frame
Start
Swctih
Data coming
Data timeout
Ack timeout
Count csc
Find frame-end
Csc==0?
N
Y
S_seq=frame
Expect?
Reset ack_num
Make ack frame
Next_send=ack_
expected
Send this frame
Phy ready?
break
Y
Phy_ready=1
Send frame
Y
N
Put_packet()
N
Break
break
Get_num=nbuff
ered
break
Deal with ack
number
In_len=1
Nbuffered
(a)物理层:为数据链路层提供的服务为 8000bps,270ms 传播延时,10-5 误码率的字节
流传输通道。为了仿真实现上述服务质量的信道,利用在同一台计算机上 TCP Socket 完成两
个站点之间的通信。由于同一台计算机上 TCP 通信传播时延短、传播速度快、没有误码,物
理层仿真程序在发送端利用“令牌桶”算法限制发送速率以仿真 8000bps 线路;在接收端误
码插入模块利用一个伪随机数“随机地”篡改从 TCP 收到的数据,使得所接收到的每个比特
出现差错的概率为 10-5;接收到的数据缓冲后延时 270ms 才提交给数据链路层程序,以仿
真信道的传播时延特性。为了简化程序,省略了成帧功能,数据链路层利用接口函数
send_frame()和 recv_frame()发送和接收一帧。
(b)数据链路层:发送方和接收方都维持一个窗口,窗口内部为可以接受的序列号。接收
到的数据包被缓存起来,当按正确的顺序接收完毕后再提交给网络层。ACK 信息通过数据帧
捎带确认的方式传递,若遇到长时间无数据帧发送,则产生 ACK 超时事件(ACK_TIMEOUT),
主动发送空的 ACK 帧。若长时间未收到 ACK 信息,则产生数据帧超时事件(DATA_TIMEOUT),
发送方自动重传未确认帧;当出现帧丢失或校验错误时,接收方会主动发送 NAK 帧提示发
送方立即重传。
数据链路层通过物理层提供的函数来利用物理层提供的服务。通过 get_packet()函数从网络
层得到一个分组;当数据链路层成功接收到一个分组后,通过 put_packet()函数提交给网络
层。
(c)网络层:利用数据链路层提供的“可靠的分组传输”服务,在站点 A 与站点 B 之间交
换长度固定为 256 字节的数据分组。网络层把产生的分组交付数据链路层,并接受数据链路
层提交来的数据分组。
3.结果分析
(1) 描述你所实现的协议软件是否实现了有误码信道环境中无差错传输功能。
我们的协议成功实现了有误码信道环境中无差错传输功能。如果收到一个损坏帧,在尚
未发送否认确定的情况下,则捎带发送否定确认。并打印错误报告。如果已发送否定确认,
则只打印错误报告,不重复发送否定确认。
(2) 程序的健壮性如何,能否可靠地长时间运行。
我们的程序成功连续运行半小时以上,并取得预定效果。具有足够的健壮性。
(3) 协议参数的选取:滑动窗口的大小,重传定时器的时限,ACK 搭载定时器的时限,这
些参数是 怎样确定的?根据信道特性数据,分组层分组的大小,以及你的滑动窗口机制,
给出定量分析,详细列 举出选择这些参数值的具体原因。
我们物理层提供的是字节流传输服务,使用字节填充技术成帧,分组长度为 256 字节。
为了避免在有出错帧接收方要求重传时产生二义性,我们定义窗口大小为 2^n-1,并且双方
的窗口大小均为((MAX_SEQ+1)/2),这样的大小足够使用又不会有过于富余的空间浪费。滑
动窗口的大小直接涉及到信道利用率和数据拥塞问题,若太大,数据发送过快将产生拥塞导
致数据丢失,出错率增加,若太小则信道利用率降低,通过实验测试合适的窗口大小为 16。
重传定时器时限涉及到重传的响应时间,太小会导致频繁重传,太大则重传等待时间太
久,经过我们的试验测试,选取重传定时器时限定为 3000 毫秒,ACK 搭载定时器的时限为
1000 毫秒最合适。
(4)理论分析:根据所设计的滑动窗口工作机制(Go-Back-N 或者选择重传),推导出在无差错
信道环境下分组层能获得的最大信道利用率;推导出在有误码条件下重传操作及时发生等理
想情况下分组层能 获得的最大信道利用率。给出理论推导过程。理论推导的目的是得到信
道利用率的极限数据。为了简化 有误码条件下的最大利用率推导过程,可以对问题模型进
行简化,比如:假定超时重传的数据帧的回馈 ACK 帧可以 100%正确传输,但是简化问题
分析的这些假设必须不会对整个结论产生较大的误差。
由于需要携带帧信息,所以最大信息利用率为
256
244
256
100%
96.24%
,由
于数据链路层提供的服务为 8000bps,所以每传输一个字节耗时 1ms,每帧的附加信息固定
为 10,耗时 10ms,若出现转义字符还将增加时间。
简化模型,假设信道上始终有数据需要传输。则在误码率为 -510 的信道上,100000 个
比特可发送
100000 个数据包,即每传送 48 个数据包将有 1 个出错。假设在限定时间
260
8*
48
内可以重传的该帧为正确帧,则每传送 48 个数据包需传送 48+1+1=50 次。所以信道利用率
*48
250
为
(
*50
260
10
)
100%*
92.24%
而由于程序设计原因,当一个数据包超时后,常常需
要重传多次造成信道浪费。若重传 k 次,则信道利用率为
*48
*)
250
260
k(
49
*
%100
若重传
10
10 次,信道利用率为 78.18%。若信道误码率为 -410 ,则
10000 ,即大约每 5 个帧就
260
4.8
8*
有一个出错,此时在 ESC/FLAG 模式下平均 250 个字符需要两倍的传输空间即极限值 510,
若平均每个错帧重传 10 次信道利用率的极值为
250
*5
510
(
*6
10
)
100%*
40.71%
(5) 实验结果分析:你的程序运行实际达到了什么样的效率,比对理论推导给出的结论,有
没有差 距?给出原因。有没有改进的办法?如果没有时间把这些方法付诸编程实施,介绍
你的方案。
由实验结果可以看出,窗口大小是 16 时信道利用率最高,与理论最大值最接近。与理
论窗口最佳值一致。
在洪泛模式下,信道利用率与理论值接近。而在其他情况下负载有时较轻,所以信道利
用率相比理论值较低。
(6) 存在的问题:在“表 3 性能测试记录表”中给出了几种测试方案,在测试中你的程序有没
有失 败,或者,虽未失败,但表现出来的性能仍有差距,你的程序中还存在哪些问题?
实验顺利进行,每次测试得到的数据都比较接近,但和理论值相比信道利用率较低,这
与信道的负载有关。
实验结果:
测试最佳窗口尺寸:
窗口大小为 16, DATA_TIMER 3000, ACK_TIMER 1000
序号 命令
说明
运 行 时 间
(分钟)
1
2
3
4
5
datalink au
datalink bu
datalink a
datalink b
datalink afu
datalink bfu
datalink af
datalink bf
datalink af –ber 1e-4
datalink bf –ber 1e-4
无误码信道数据传输
站点 A 分组层平缓方式发
出数据,站点 B 周期性交替
发送 100 秒停发 100 秒
无误码信道,站点 A 和站点
B 的分组层都洪水式产生分
组
站点 A/B 的分组层都洪水式
产生分组
站点 A/B 的分组层都洪水式
产生分组,线路误码率为
10^-4
30
30
30
30
30
窗口大小为 8, DATA_TIMER 3000, ACK_TIMER 1000
序号 命令
说明
运 行 时 间
(分钟)
1
2
3
4
5
datalink au
datalink bu
datalink a
datalink b
datalink afu
datalink bfu
datalink af
datalink bf
datalink af –ber 1e-4
datalink bf –ber 1e-4
无误码信道数据传输
站点 A 分组层平缓方式发
出数据,站点 B 周期性交替
发送 100 秒停发 100 秒
无误码信道,站点 A 和站点
B 的分组层都洪水式产生分
组
站点 A/B 的分组层都洪水式
产生分组
站点 A/B 的分组层都洪水式
产生分组,线路误码率为
10^-4
30
30
30
30
30
窗口大小为 32, DATA_TIMER 3000, ACK_TIMER 1000
Selective 算法线路
利用率(%)
B
A
59.3
96.9
56.8
96.8
95.0
96.4
91.3
93.6
73.2
75.5
Selective 算法线路
利用率(%)
B
A
57.7
96.9
55.6
94.8
96.9
95.5
96.9
95.0
75.0
73.2
序号 命令
说明
运 行 时 间
(分钟)
1
2
3
4
5
datalink au
datalink bu
datalink a
datalink b
datalink afu
datalink bfu
datalink af
datalink bf
datalink af –ber 1e-4
datalink bf –ber 1e-4
无误码信道数据传输
站点 A 分组层平缓方式发
出数据,站点 B 周期性交替
发送 100 秒停发 100 秒
无误码信道,站点 A 和站点
B 的分组层都洪水式产生分
组
站点 A/B 的分组层都洪水式
产生分组
站点 A/B 的分组层都洪水式
产生分组,线路误码率为
10^-4
30
30
30
30
30
从测试结果比较得出,窗口最佳尺寸为 16;
Selective 算法线路
利用率(%)
B
A
96.9
96.9
54.8
93.6
96.9
97.0
90.6
50.0
90.2
52.3
ACK 搭载定时器的时限定为 1000 毫秒,窗口大小为 16,测试重传定时器时限
DATA_TIMER 2800,窗口大小为 16, ACK_TIMER 1000
测试最佳 DATA_TIMER 取值
序号 命令
说明
运 行 时 间
(分钟)
1
2
3
4
5
datalink au
datalink bu
datalink a
datalink b
datalink afu
datalink bfu
datalink af
datalink bf
datalink af –ber 1e-4
datalink bf –ber 1e-4
无误码信道数据传输
站点 A 分组层平缓方式发
出数据,站点 B 周期性交替
发送 100 秒停发 100 秒
无误码信道,站点 A 和站点
B 的分组层都洪水式产生分
组
站点 A/B 的分组层都洪水式
产生分组
站点 A/B 的分组层都洪水式
产生分组,线路误码率为
10^-4
30
30
30
30
30
Selective 算法线路
利用率(%)
B
A
55.3
93.9
49.6
96.9
88.7
96.9
86.1
88.2
69.6
70.1
DATA_TIMER 3000,窗口大小为 16, ACK_TIMER 1000
序号 命令
说明
运 行 时 间
(分钟)
Selective 算法线路
利用率(%)