计算机网络实验三(rdt)
- 实验目的
熟悉各种不同rdt协议的运行环境,对照教材理解给出的rdt协议源码,理解并掌握不同链路特性对rdt协议性能的影响。比较不同rdt协议适应的运行环境。重点:不同版本rdt协议及其适用环境的理解。难点:模拟环境参数的修改对协议性能的影响。
- 实验内容
给定rdt协议运行的环境模拟器,通过对差错率、丢包率和超时间隔等参数的修改,衡量不同rdt协议的运行性能;修改模拟器内核环境参数,分析流水线rdt协议性能;完成Exercise文件中的练习题。
- 实验原理
介绍几种rdt协议
1.rdt1.0:在可靠信道上进行可靠的数据传输
- 假设底层信道是完全可靠的,传输的数据不会损坏或者丢失。
- 发送方和接收方的有限状态机(FSM)都只有一个状态,发送方将数据发送到信道中,接收方从信道中接收数据
rdt2.0:底层信道产生为错误
- 该协议使用校验和来检测比特差错,并通过确认(ACK)和否定确认(NAK)来从差错中恢复。发送方在收到NAK后进行分组重传。
- ACKs:由接收方发送报文向发送方进行确认。
- NAKs:由接收方发送报文向发送方进行否认,说明分组有误。
- 若是出现ACK/NAK丢失问题,会是致命的问题。
Rdt2.1:解决rdt2.0中ACK/NAK丢失的问题
- 发送方重传正确的分组,并给每个分组加上序号,以管理丢失的ACK/NAK,接收方丢弃重复的分组。
rdt3.0:底层信道不仅可能使得分组受损,而且还会丢包
- 引入了计时器来解决丢包的问题,被称为交替位协议。
- 发送方在发送一个分组时启动一个倒计数定时器,如果在定时器超时之前收到了ACK响应,则中断定时器。如果定时器超时,则发送方认为分组丢失,向接收方重传该分组,并重新启动定时器。
- RDT3.0的分组序号在0和1之间交替,因此有时被称为比特交替协议。
流水线协议
流水线协议允许发送方在发送完数据包后,不用立即停止等待,而是可以在发送多个数据包后,再执行停止等待协议,等待每个数据包的ACK反馈。
回退N重传(GBN)
- GBN协议允许发送方发送多个分组而不用等待确认。它采用累积确认的方式,如果接收端返回ACK=3,则证明报文段3以及之前的所有报文段都被正确接收。
- 不设置缓冲区,接收端不对失序到达的报文段进行缓存。
- 如果某个报文段没有被正确接收,那么从这个报文段到后面的所有报文段都需要重新发送。
- 适用于低出错率的链路,简单且实时性要求高的场景。
选择重传(SR)
- SR协议允许发送方连续发送多个分组而不用先等待头一个分组的确认。
- 在接收方设置缓冲区,用于接收失序到达的报文段。
- 如果发送方在一定时间内没有收到某个数据包的确认,那么它会认为该数据包丢失,然后只重新发送该数据包。
- 适用于链路容量大的(延迟大、带宽大)且出错并不罕见的链路,避免GBN的一点出错回退N步造成的较大代价。适合需要高信道利用率且能够处理高丢包的场景。
实验步骤及分析
- 实验前准备
- 在虚拟机上进行实验。
- 将simulator文件夹放到Ubuntu环境下。
- 了解simulator模拟的几种rdt协议:(p2.c-p6.c)
- P2.c是停等协议,设置buffer和处理速度(都是有限的)
- P3.c在不可靠的新岛上允许单项的数据流动
- P4.c双向滑窗协议
- P5.c GBN协议
- P6.c 重传协议
- 根据README配置环境

- 编译时需要输入的指令:
Sim:
Protocol:协议 Events:时间片 Timeout:超时间隔 Pct_loss:丢包率 Pct_cksum:检验和错误率 Debug_flags:错误标记
例如:./sim 5 1000 20 0 0 0:运行协议5,时间片为1000,超时间隔20,没有丢包,没有检验码错误。
- 实验中要回答的问题:

- 实验步骤及回答问题
1.在某个协议中,分别测试有效负载和超时时间间隔、丢包率、校验和错误率的关系,并得出结论。

- 编译过程: cd simulator ls make
编译出错后运行,gcc -o sim sim.o worker.o p2.o p3.o p4.o p5.o p6.o -Wl,--allow-multiple-definition

- 运行过程(输入:./sim 5 1000 20 0 0 0)
运行协议5,时间片为1000,超时间隔为20,无丢包,无检验码错误:
图片中process0有两端信息,分别是发送和接收信息,process1也是。Process0的发送信息对应process1的接收信息;process1的发送信息对应process0的接收信息。


- 测试有效负载与超时间隔的关系:运行协议5,1000个时间片,无丢包,无校验和错误。
|
Timeout |
Payloads accepted(总和) |
Data pkts sent(Total data frames sent总和) |
Efficiency |
|
10 |
8 |
631 |
1% |
|
20 |
249 |
446 |
55% |
|
30 |
380 |
395 |
96% |
|
40 |
378 |
380 |
99% |
|
50 |
386 |
387 |
99% |
|
60 |
378 |
379 |
99% |
|
70 |
381 |
383 |
99% |
|
80 |
389 |
390 |
99% |
|
90 |
380 |
393 |
99% |
|
100 |
379 |
380 |
99% |
结论:超时间隔越大,其Efficiency也越大,因为此时重传比较少,发送的数据几乎都能接受到。
部分截图:


- 测试有效负载于丢包率的关系:运行协议5,1000个时间片,超时间隔为20,无校验和错误
|
Lost packet rate |
Payloads accepted(总和) |
Data pkts sent(Total data frames sent总和) |
Efficiency |
|
10 |
186 |
523 |
35% |
|
20 |
169 |
551 |
30% |
|
30 |
127 |
592 |
21% |
|
40 |
119 |
635 |
18% |
|
50 |
62 |
612 |
10% |
|
60 |
73 |
642 |
7% |
|
70 |
33 |
670 |
4% |
|
80 |
18 |
669 |
2% |
|
90 |
10 |
668 |
1% |
结论:丢包率越高,收到的有效负载就越少,数据重传越多,超时状况也越多,传输效率越低。
部分截图:


- 测试有效负载与校验和错误率的关系:
|
The checksum error rate |
Payloads accepted(总和) |
Data pkts sent(Total data frames sent总和) |
Efficiency |
|
10 |
176 |
460 |
38% |
|
20 |
151 |
487 |
31% |
|
30 |
123 |
521 |
23% |
|
40 |
470 |
91 |
19% |
|
50 |
80 |
479 |
16% |
|
60 |
33 |
486 |
6% |
|
70 |
25 |
478 |
5% |
|
80 |
17 |
492 |
3% |
|
90 |
7 |
497 |
1% |
结论:较验和错误率越高,收到的有效负载越少,传输效率越低。
部分截图:


2.详细比较协议5和协议6在每秒有效载荷和重传次数方面的性能

协议5是回退N步,协议6是选择重传。
运行:./sim 5 1000 50 0 0 0 ./sim 6 1000 50 0 0 0
|
协议 |
协议5 |
协议6 |
|
Total data frames sent |
194 |
171 |
|
Payloads accepted |
194 |
171 |
|
Frames retransmitted |
0 |
0 |
|
Efficiency |
99% |
99% |
运行:./sim 5 1000 50 10 10 0 ./sim 6 1000 50 10 10 0
|
协议 |
协议5 |
协议6 |
|
Total data frames sent |
174 |
132 |
|
Payloads accepted |
83 |
89 |
|
Frames retransmitted |
91 |
28 |
|
Efficiency |
44% |
73% |
结论:当没有丢包,没有检验和错误时,两个协议的性能结果相似;当网络状况出现丢包,由检验与错误时,相较于协议5来说,协议6的性能更好,有效负载更小。
原因:协议5是BGN,在接收数据包时,不会存储无序的分组,即使接收的分组是无误的,但若它前一分组还没有到达,会将其丢弃,这样会造成重传次数增多;而协议6为选择重传,接收方会接收并缓存无序的分组,等到前面的分组到达后,可一起上传,减少重传的可能。所以协议5适合运行在网络状况较好的情况下,丢包率和出错率较小的时候,重传几率较小,传输速率较快。而如果网络状况不佳,会出现大量重传,协议5会丢弃大量无序的且正确的分组,会带来更多的重传。协议6只需重传丢失的分组,在网络状况较差时,效果会非常显著。
- pick_event()函数具有内置的事件优先级,对于协议5,更改这些优先级,你能得到什么结论?

下图是pick_event函数:

协议5中事件:数据到达,网络层准备,校验和检验,超时处理(一共有24种情况)这里不列出全部情况,只给出部分顺序情况。(运行:./sim 5 1000 20 x x 0)

改变顺序后,记得先编译再运行。
- 顺序1:网络层准备、数据到达、校验和检验、超时处理

|
Lost packet rate |
The checksum error rate |
Total data frames sent |
Payloads accepted |
Frames transmitted |
Efficiency |
|
0 |
0 |
373 |
123 |
245 |
48% |
|
10 |
10 |
268 |
93 |
175 |
34% |
|
20 |
20 |
287 |
63 |
217 |
23% |
|
30 |
30 |
321 |
49 |
266 |
13% |
- 顺序2:网络层准备、超时处理、数据到达、校验和检验
|
Lost packet rate |
The checksum error rate |
Total data frames sent |
Payloads accepted |
Frames transmitted |
Efficiency |
|
0 |
0 |
394 |
76 |
315 |
19% |
|
10 |
10 |
409 |
91 |
315 |
22% |
|
20 |
20 |
388 |
73 |
308 |
18% |
|
30 |
30 |
372 |
53 |
315 |
15% |
- 顺序3:超时处理、网络层准备、数据到达、校验和检验
|
Lost packet rate |
The checksum error rate |
Total data frames sent |
Payloads accepted |
Frames transmitted |
Efficiency |
|
0 |
0 |
387 |
78 |
306 |
20% |
|
10 |
10 |
399 |
86 |
311 |
22% |
|
20 |
20 |
389 |
78 |
306 |
19% |
|
30 |
30 |
371 |
53 |
312 |
14% |
- 顺序4:超时处理、数据到达、网络层准备、校验和检验
|
Lost packet rate |
The checksum error rate |
Total data frames sent |
Payloads accepted |
Frames transmitted |
Efficiency |
|
0 |
0 |
256 |
122 |
134 |
46% |
|
10 |
10 |
276 |
85 |
189 |
31% |
|
20 |
20 |
313 |
64 |
243 |
21% |
|
30 |
30 |
339 |
44 |
292 |
11% |
- 顺序5:数据到达、超时处理、网络层准备、校验和检验
|
Lost packet rate |
The checksum error rate |
Total data frames sent |
Payloads accepted |
Frames transmitted |
Efficiency |
|
0 |
0 |
218 |
108 |
110 |
49% |
|
10 |
10 |
250 |
102 |
148 |
38% |
|
20 |
20 |
278 |
69 |
203 |
26% |
|
30 |
30 |
306 |
58 |
245 |
15% |
综合上面5种情况来看,在相同的条件下,当顺序为数据到达、超时处理、网络层准备、校验和检验时,得到的有效负载最大,重传次数最少。
- 观察超时间隔变化和数据重传数量的关系,并得出最佳设置值。

运行:./sim 5 1000 x 0 0 0
|
Timeout |
Payloads accepted |
Total data frames sent |
retransmitted frames |
Efficiency |
|
10 |
8 |
631 |
630 |
1% |
|
20 |
233 |
471 |
238 |
49% |
|
30 |
364 |
400 |
35 |
91% |
|
40 |
374 |
376 |
0 |
99% |
|
50 |
378 |
379 |
0 |
99% |
|
60 |
374 |
375 |
0 |
99% |
|
70 |
374 |
375 |
0 |
99% |
结论:从表格中可以看出,当设置超时间隔为大于40左右时,重传数据降为0,而当设置超时间隔为50时,efficiency达到99%-100%。
- 目前,模拟器的时间是一滴答一滴答地前进。如果两个进程都在远程超时时被阻塞,那么这个进程就会变慢。当两个进程在时钟上被阻塞时,更改模拟器以更快地提前终止。


上面while循环中:
- 随机生成数和1做与运算(选择一个进程0或1来运行);
- 然后更新tick,每次都增加一个时间单位10(DELTA=10);
- 根据选择的进程,设置读文件描述符 rfd。如果 process 是 0,则 rfd 是 r4,否则是 r6。
- 尝试从 rfd 读取 TICK_SIZE 大小的数据到变量 word。如果读取失败(即读取的字节数不等于 TICK_SIZE),则调用 terminate("") 函数来终止程序。
- 从选定的进程读取状态信息(OK 或 NOTHING)。OK,则将对应进程的 hanging 计数器重置为 0;NOTHING,则增加对应进程的 hanging 计数器。
- 进行死锁检测,如果两个进程都长时间没有进展(hanging 计数器超过 DEADLOCK 阈值),则检测到死锁并终止程序。
- 根据选择的进程,设置写文件描述符 wfd。如果 process 是 0,则 wfd 是 w3,否则是 w5。
- 尝试向 wfd 写入 TICK_SIZE 大小的 tick 数据。如果写入失败(即写入的字节数不等于 TICK_SIZE),则调用 terminate() 函数并传递消息 "Main could not write to worker"。
![]()

Last_tick就是sim的第二个参数时间片总长。
思路:增加标志位用于判断两个进程是否都死锁,加快处理。
- 在common.h中添加一个sim_flag标志位。
![]()
- 在sim.c中初始化后,在死锁时,标志位为1.

- 在在worker.c中对于超时检测增加判断条件,即该标志检查。发生死锁,与超时相同,要重新发送消息,解除死锁情况。
![]()
- 更改数据包的即时传递,以便交付时间是可变的,用户可以设置。差异如何影响协议性能?

思路:用户设置交互时间,那么common.h中的DELTA的值为变量,并在sim.c中作为输入变量。但由于timeout_interval是关于DELTA的函数,而DEADLOCK是关于timeout_interval的函数,所以我们将timeout_interval的delta为一个定值,改为默认的10。
![]()
![]()
修改输入参数个数,个数必须大于等于7个,如果是8个则代表用户输入了DELTA来进行改变。

- 实验收获
(1)通过模拟不同的网络条件(如超时间隔、丢包率、检验和错误率等),可以观察这些条件如何影响协议的性能和可靠性。
(2)通过实验可以评估不同RDT协议变种(如回退N步协议、选择重传协议等)的性能,了解它们在不同网络条件下的表现。
(3)最后两题,是阅读源码并做出一些修改,相对来说难一点。与同学交流后,完成的。
更多推荐
所有评论(0)