simulator代码链接:https://pan.baidu.com/s/1fPzYqNrkmbba-vwu3bbO8w?pwd=cxg3
提取码:cxg3
一、实验目的
熟悉并掌握各种不同rdt协议的运行环境和协议性能。
二、实验原理
1.Rdt1.0:在可靠信道上进行数据传输
所依赖的信道非常可靠:不可能有位错,不会丢失数据;
分别为发送方和接收方建立FSMs:发送方将数据送入所依赖的信道,接收方从所依赖的信道读出数据。
2.Rdt2.0:有差错检测的传输信道
问题:如何从错误中恢复
正向确认 (ACKs):由接收方发送报文向发送方进行确认
负向确认 (NAKs):由接收方发送报文向发送方进行否认,说明分组有错
发送方在收到NAK后进行分组重传,依靠错误检测;接收方的反馈:控制信息 (ACK,NAK)。
3.Rdt2.1:解决Rdt2.0中ACK/NAK丢失的问题
Rdt2.0 的缺点——ACK/NAK 报文丢失
发送方将不会知道接收端发生了什么,假如进行重传:可能发生数据重复。
发送方,管理丢失的 ACK/NAK,接收方,管理丢失的 ACK/NAK;接收方丢弃重复的分组(不向上递交),如果ACK/NAK丢失,发送方则重传正确的分组,发送方给每个分组加上序号。
4.流水线协议——解决低效问题
流水作业:发送端允许发送多个分组,等待应答。必须增加顺序号的位数,在发送和接收端增加缓存。两种常用的流水线协议:回退N重传 (go-Back-N),选择重传(Select Retransmit)。
-
GBN:Go-Back-N
发送方:使用尺寸为N的“滑动窗口”w,可以同时及发送w个报文。
“回退n”协议的基本特点:发送方连续发送许多数据帧,接收方只接收一帧,即只能顺序接收,发送方发送的帧需要不同的编号来区分,发送方要有较大的发送缓冲区来保留可能重发的帧。
优点:连续发送提高了信道利用率,误码率较低时,连续ARQ优于停等协议。
缺点:要回退n帧重传,导致某些已正确接收帧的重传,因此降低了发送效率。 -
SR:Selective Repeat
发送方仅对未收到应答的分组进行重发,发送方对每个未确认分组设置计时器;发送方的窗口,N个连续的seq,同样对已发送的分组,未确认分组进行限制;接收方逐个对所有正确收到的分组进行应答,对失序到达分组进行缓存。
优点:避免重传已正确传送的帧,提高了信道利用率。
缺点:在接收端需要占用一定容量的缓存,控制较复杂。
三、实验步骤及分析
(一)实验前准备
1.打开虚拟机ubuntu,并将实验文件simulator复制到ubuntu中。
2.了解simulator模拟的几种rdt协议。simulator中有p2.c—p6.c 五个文件是描述协议的:
p2.c是可靠信道的停等协议,设置有限的buffer和有限的处理速度;
p3.c在比特差错会丢包信道上单工停等协议;
p4.c是一位的滑动窗口协议;
p5.c是GBN协议;
p6.c是SR协议。
3.阅览文件README了解实验要求。
Simulator可以通过make命令编译,运行协议,完成 sinulator 文件夹中的 exercises 文件中的作业。
4.编译时需要输入的指令
sim protocol events timeout pct_loss pct_cksum debug_flags
这六个参数分别是:协议、时间片、超时间隔、丢包率、检验和错误率、错误标记
例如:输入: ./sim 5 1000 20 0 0 0 (运行协议5,时间片设置为1000,超时间隔为20,无丢包、无检验码错误)
5.实验需要回答的问题:
在exercises中共6个问题,下面围绕这六个问题进行实验。
(二)实验步骤
1.在某个协议中,分别测试有效负载和超时时间间隔、丢包率、校验和错误率的关系,并得出结论。
(1)编译:
cd simulator (打开simulator文件), make (编译)。
(2)运行过程:
./sim protocol events timeout pct_loss pct_cksum debug_flags
输入: ./sim 5 1000 20 0 0 0 (运行协议5,时间片设置为1000,超时间隔为20,无丢包、无检验码错误),得到下图:
图中,process1有两段信息(发送信息、接收信息);process 0同理;特别注意,这是一个双向传输,所以,process1的发送信息对应process0的接收信息,process0的发送信息对应process1的接收信息。
(3)首先测试有效负载和超时时间间隔的关系,运行协议5,1000个时间片,无丢包,无校验和错误
结果如下表所示:
timeout | Payloads accepted | Total data frames sent | Efficiency |
---|---|---|---|
10 | 7 | 630 | 1% |
20 | 102 | 237 | 48% |
30 | 196 | 217 | 90% |
40 | 195 | 202 | 97% |
50 | 179 | 180 | 99% |
60 | 187 | 188 | 99% |
70 | 186 | 189 | 99% |
80 | 184 | 185 | 99% |
(注:实验选取了process0的Payloads accepted和process 1的Total data frames sent)
结论:由表中的测试数据可以看出,有效负载在超时时间间隔为30的时候最大,为196。因为时间间隔小于30的时候,重传的比较多,导致有效少,当时间间隔大于30的时候,虽然没有重传,但是时间间隔大,发送一个数据后等待的时间过长,导致发送的总的数据减少;但是显然,超时时间间隔越大,其Efficiency(Payloads accepted/ Total data frames sent)也越大,因为此时重传比较少,发送的数据几乎都能接受到。
(4)测试有效负载和丢包率的关系,运行协议5,1000个时间片,超时时间间隔为50,无校验和错误
结果如下表:
Lost packet rate | Payloads accepted | Total data frames sent | Efficiency |
---|---|---|---|
10 | 102 | 179 | 55% |
20 | 65 | 170 | 36% |
30 | 41 | 179 | 23% |
40 | 26 | 159 | 16% |
50 | 15 | 151 | 10% |
60 | 12 | 152 | 8% |
70 | 8 | 149 | 5% |
结论:丢包率越高,收到的有效负载就越少,数据重传越多,超时状况也越多,传输效率越低。
部分截图(10%丢包率)如下:
(5)测试有效负载与校验和错误率的关系,运行协议5,1000个时间片,超时间隔为50,无丢包,
结果如下表所示:
Lost packet rate | Payloads accepted | Total data frames sent | Efficiency |
---|---|---|---|
10 | 98 | 175 | 57% |
20 | 54 | 166 | 37% |
30 | 56 | 168 | 28% |
40 | 35 | 154 | 21% |
50 | 17 | 150 | 11% |
60 | 10 | 148 | 5% |
结论:较验和错误率越高,收到的有效负载越少,传输效率越低。
部分截图如下:
2.详细比较协议5和协议6在每秒有效载荷和重传次数方面的性能
协议5为回退N步,协议6为选择重传
运行:
./sim 5 1000 50 0 0 0和./sim 6 1000 50 0 0 0
协议 | Protocols 5 | Protocols 6 |
---|---|---|
Total data frames sent | 193 | 167 |
Payloads accepted | 193 | 167 |
Frames retransmitted | 0 | 0 |
Efficiency | 99% | 99% |
运行:./sim 5 1000 50 10 10 0和./sim 6 1000 50 10 10 0
协议 | Protocols 5 | Protocols 6 |
---|---|---|
Total data frames sent | 175 | 125 |
Payloads accepted | 88 | 88 |
Frames retransmitted | 84 | 24 |
Efficiency | 41% | 67% |
结论:当网络都处于理想状况时,即都没有丢包和校验和错误时,两个协议的性能差不多;而当网络状况越差,协议6的重传、有效负载比协议5小,所以协议6的性能较好。
原因:协议5为回退N步,接收方不存储无序的分组,即使分组是正确的,如果其前一分组未到达,则将其丢弃,如此会增加重传的可能;而协议6为选择重传,即接收方会接收并缓存无序的分组,直到其前面的分组到达再一起上传给上层,如此可减少重传的可能。所以协议5适合运行在网络状况较好的情况下,丢包率和出错率较小的时候,重传几率较小,传输速率较快。而如果网络状况不佳,会出现大量重传,协议5会丢弃大量无序的且正确的分组,会带来更多的重传。而协议6只需重传丢失的分组,在网络状况较差时,效果会非常显著。
3.pick_event()函数具有内置的事件优先级,对于协议5,更改这些优先级,你能得到什么结论?
问题说明:在函数pick_event中,改变协议5中几个事件(数据到达、超时处理、网络层准备等)的处理顺序,可以得出什么结论。
pick_event函数说明:
进行测试的顺序非常重要,因为它将某些事件优先于其他事件。例如,对于协议3和4,帧将在导致超时之前发送。
仅考虑协议5,因此只需要写case 5的各种顺序case即可。
(注:每次顺序做调整后,重新进行编译再运行)
(1)顺序1:网络层准备、数据到达、校验和检验、超时处理
得表格如下:
(2)顺序2:网络层准备、超时处理、数据到达、校验和检验
得表格如下:
(3)顺序3:超时处理、网络层准备、数据到达、校验和检验
得表格如下:
上述的超时时间间隔、时间片均相同。
结论:通过上面三个表格的对比,可以看出在相同的条件下,当顺序为网络层准备、数据到达、校验和检验、超时处理时,得到的有效负载最大、重传次数最少。
4.调查重传帧的数量与超时时间关系
题意:观察超时间隔变化和数据重传数量的关系,并得出最佳设置值。
测试超时时间间隔和重传的关系,运行协议5,1000个时间片,无丢包,无校验和错误
得表格如下:
timeout | Payloads accepted | Total data frames sent | retransmitted frames |
---|---|---|---|
10 | 7 | 630 | 623 |
20 | 137 | 275 | 133 |
30 | 188 | 209 | 21 |
40 | 188 | 190 | 0 |
50 | 185 | 186 | 0 |
60 | 182 | 183 | 0 |
结论:从表格中可以看出,当设置超时间隔为大于40左右时,重传数据降为0,而当设置超时间隔为50时,efficiency达到99%-100%。
5.当两个进程在时钟上被阻塞时,更改模拟器以更快地提前时间。
题意:目前,模拟器的时间是一滴答一滴答地前进。如果两个进程都在远程超时时被阻塞,那么这个进程就会变慢。当两个进程在时钟上被阻塞时,更改模拟器以更快地提前终止。
在sim.c中可以看到如上代码,表示simulation程序的主要循环过程;
Last_tick就是sim的第二个参数时间片总长。
①这里随机生成一个数和1做与运算(即选择一个进程来进行运行,模拟进程的调度);
② 修改tick,模拟器的时间前进,这里看到每次将tick更新为加delta,在common.h中发现delta定义为10。
③根据反馈的信息word,如果是NOTHING说明需要让当前进程hanging时间加上delta,如果改值大于阈值DEAD_LOAD,那么说明该进程死锁;
解决方式:
第一步,在common.h中添加一个标志,用于标识是否两个进程都死锁。
第二步,当判断两个进程都死锁,那么将该标志置位。
初始化:
置位:
第三步,在worker.c中对于超时检测增加判断条件,即该标志检查。
如果死锁的标记被修改为1,发生死锁,等同于超时,重新发送消息,解除当前的死锁情况。
注意:不能忘记将该标志重置为0。
6.在目前的模拟器中,数据包的传递基本上是即时的。
题意:更改数据包的即时传递,以便交付时间是可变的,用户可以设置。差异如何影响协议性能?
(1)思路:
考虑到可以使得交付时间随用户设置而变化,增加一个输入变量,修改delta,就需要在common.h中将delta由原来的常量修改为变量,同时在sim.c中,将delta设为输入的最后一个变量。
然而,由于deadblock的值是关于delta的函数:
因此,我们直接修改delta相当于同时修改了两个值,那么在我们的结果中这个修改的delta将无法产生任何改变,需要取消掉这个关系;
(2)解决方案:
第一步,我们应该首先将deadlock和delta的关系取消掉,即将timeout_interval的delta为一个定值,这里改为默认的10:
第二步,将delta设置为变量,这样可以保证用户可以修改:
第三步,将delta作为最后一个参数,如果没有则默认为10:
Main函数中初始化DELTA:
修改两处,第一处表示参数个数必须大于等于7个,如果是八个则代表用户输入了DELTA来进行改变。
四、实验总结
这次实验是要验证rdt协议的一些性质和影响因素,重新复习了一下几种协议,包括他们的优缺点和特性等等。
实验过程中前面几题都比较简单,五六题相对来说更难一点,要阅读源码还要修改源码,尤其是最后一题真的是改的懵懵懂懂,参考了一下网上的答案之后加入了自己的想法。总体来说通过实验的方式模拟实现了几种协议的表现状况,给了我们数据化的具体表示,更能比较出它们的区别。