关于RDT模型

时间:2024-01-30 22:09:31

再复习一下RDT模型

争取简明扼要一点

RDT1.0:【理想模型】

没有丢包,没有错包

RDT1.0就是一个人发,一个人收(信赖底层协议)


RDT2.0:【考虑了数据包的损坏】

RDT2.0在1.0的基础上加上了ARQ:(Automatic Repeat reQuest) protocols

  • 错误校验

  • 接受者的回复:

    0是NAK,1是ACK

  • 重新发送:

    接受有错的包将会重新由sender发送

即: 发送方发送之后会等待一个响应,等待ACK或者是NAK,如果是ACK则继续,NAK则重发

​ 接收方也会根据接收状态返回响应的ACK、NAK信息

​ 并且是一个stop-and-wait协议


RDT2.1:【考虑了确认包的损坏】

RDT2.0没有解决ACK和NAK包出问题的情况

RDT2.1用一个1-bit的序列号来标记是否为重复发送

我们看看变化:发送方如果接收到的回复包出问题了(corrupt(rcvpkt)),那么会重新发送一个序列号为0的包

接收方接收到序列号为0的包,此时接收方已经返回了序列号为0的ACK包,此时在等待1

而接收方收到0,就说明sender是没有听清楚我的确认消息,重新发送了之前的包,由于stop-and-wait,我一定是接收到正确的包之后才会发生状态转换,所以这个1序列包已经是我接收过的了,所以我发送一个ACK包回去,并且继续等待我的1号包

这样就解决了我们的问题


RDT2.2【不用NAK】

RDT2.2是一种不用NAK的协议(NAK-free protocol),使用ACK+序列号来解决问题(duplicate ACK at sender results in same action as NAK :retransmit current pkt)

即,我等待一个ACK0,如果得到的是ACK1,那么很可能是接收方没有接收到0,于是需要我返回,

用重复的ACK+序列号来代替NAK的效果


RDT3.0【考虑上丢包】

RDT 2.* 只考虑了数据包出现位错误的问题( corrupting bits),没有考虑丢包的(lose packets)问题(虽然不常见)

RDT 3.0引入了timer,一个计时器来解决丢包的问题,即交替位协议(alernating-bit protocol)

主要改进就是,在发送了一个sndpkt之后,会有一个start_timer 的动作,设置一个计时器

如果收到的确认包有错或者是ACK+不期待的序列号,那么就继续等待,直到timeout超时了还没有的话,就重新发送,并且同时重置start_timer,即每次发送了sndpkt之后都会重置计时器的。


Go-Back-N【使用了流水线】

特点主要有三个:

  • 缓存
  • 累计确认,即如果分组k已经接受并且交付,则所有比序号k小的分组都已经交付了
  • 全部重发,即会丢弃正确接收但是乱序的分组
  • base指针指向那个最老的发送了还没ACK的
  • nextseqnum是即将发送的

主要过程:

Selective-Repeat(SR)【采用了部分重发】

  • 每个分组都会有一个timer
  • 只有gap填满了才会移动base
  • 只重传超时的那一个

流程图

SR 可能会遇到的问题

image-20200520225656068

可以看到,ab两种情况,对于接收方,观察到的都是一样的情况

但是发送的包却实际上并不是一种情况

结论: