再复习一下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 可能会遇到的问题
可以看到,ab两种情况,对于接收方,观察到的都是一样的情况
但是发送的包却实际上并不是一种情况