• 实验目的

熟悉各种不同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步造成的较大代价。适合需要高信道利用率且能够处理高丢包的场景。

实验步骤及分析

  1. 实验前准备
  1. 在虚拟机上进行实验。
  2. 将simulator文件夹放到Ubuntu环境下。
  3. 了解simulator模拟的几种rdt协议:(p2.c-p6.c)
  • P2.c是停等协议,设置buffer和处理速度(都是有限的)
  • P3.c在不可靠的新岛上允许单项的数据流动
  • P4.c双向滑窗协议
  • P5.c GBN协议
  • P6.c 重传协议
  1. 根据README配置环境
  1. 编译时需要输入的指令:

Sim:

Protocol:协议   Events:时间片   Timeout:超时间隔   Pct_loss:丢包率   Pct_cksum:检验和错误率   Debug_flags:错误标记

例如:./sim 5 1000 20 0 0 0:运行协议5,时间片为1000,超时间隔20,没有丢包,没有检验码错误。

  1. 实验中要回答的问题:

  1. 实验步骤及回答问题

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

  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

  1. 运行过程(输入:./sim 5 1000 20 0 0 0)

运行协议5,时间片为1000,超时间隔为20,无丢包,无检验码错误:

图片中process0有两端信息,分别是发送和接收信息,process1也是。Process0的发送信息对应process1的接收信息;process1的发送信息对应process0的接收信息。

  1. 测试有效负载与超时间隔的关系:运行协议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也越大,因为此时重传比较少,发送的数据几乎都能接受到。

部分截图:

  1. 测试有效负载于丢包率的关系:运行协议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%

结论:丢包率越高,收到的有效负载就越少,数据重传越多,超时状况也越多,传输效率越低。

部分截图:

  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只需重传丢失的分组,在网络状况较差时,效果会非常显著。

  1. 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种情况来看,在相同的条件下,当顺序为数据到达、超时处理、网络层准备、校验和检验时,得到的有效负载最大,重传次数最少。

  1. 观察超时间隔变化和数据重传数量的关系,并得出最佳设置值。

运行:./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%。

  1. 目前,模拟器的时间是一滴答一滴答地前进。如果两个进程都在远程超时时被阻塞,那么这个进程就会变慢。当两个进程在时钟上被阻塞时,更改模拟器以更快地提前终止。

上面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的第二个参数时间片总长。

思路:增加标志位用于判断两个进程是否都死锁,加快处理。

  1. 在common.h中添加一个sim_flag标志位。

  1. 在sim.c中初始化后,在死锁时,标志位为1.

  1. 在在worker.c中对于超时检测增加判断条件,即该标志检查。发生死锁,与超时相同,要重新发送消息,解除死锁情况。

  1. 更改数据包的即时传递,以便交付时间是可变的,用户可以设置。差异如何影响协议性能?

思路:用户设置交互时间,那么common.h中的DELTA的值为变量,并在sim.c中作为输入变量。但由于timeout_interval是关于DELTA的函数,而DEADLOCK是关于timeout_interval的函数,所以我们将timeout_interval的delta为一个定值,改为默认的10。

修改输入参数个数个数必须大于等于7个,如果是8个则代表用户输入了DELTA来进行改变。

  

  • 实验收获

1通过模拟不同的网络条件(如超时间隔、丢包率、检验和错误率等),可以观察这些条件如何影响协议的性能和可靠性。

2通过实验可以评估不同RDT协议变种(如回退N步协议、选择重传协议等)的性能,了解它们在不同网络条件下的表现。

3最后两题,是阅读源码并做出一些修改,相对来说难一点。与同学交流后,完成的。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐