文章目录
可靠数据传输(rdt)的原理
- rdt在应用层,传输层和数据链路层都很重要
- 是网络Top 10问题之一
- 信道的不可靠特点决定了可靠数据传输协议(rdt)的复杂性
总体来说就是为了实现可靠,下方信道要是很不可靠,那么rdt就要很可靠,很复杂,否则反之
Rdt1.0:在可靠信道上的可靠数据传输
需求
- 下层信道完全可靠
没有比特丢失
没有分组丢失
- 发送方和接收方的FSM
发送方将数据发送到下层信道
接收方从下层信道接收数据
Rdt2.0:具有比特差错的信道
出错
下层信道可能出错:将分组中的比特翻转
解决方式
- 确认(ACK):接收方显示地告诉发送方分组已被正确接收
- 否定确认(NAK):接收方显式地告诉发送方分组发生了差错
发送方接收到ACK发送下一数据,接收到NAK发送上一数据
如果ACK或者NAK出错,就再发一次上一次的数据,重复没关系,接收方可以检查出来
Rdt2.1:接收方处理出错的ACK/NAK
发送方
- 在分组中加入序列号
- 两个序列号(0,1)就足够了
一次只发送一个未经确认的分组
-
必须检测ACK/NAK是否出错(需要EDC)
-
状态数变成了
接收方
- 必须检测接收到的分组是否是重复的
状态会指示希望接收到得到分组的序号是0还是1
- 注意:接收方并不知道发送方是否正确的接收到了ACK/NAK
根据后面发送方的发送的东西判断
Rdt2.2:无NAK
为ACK做编号
如果失败了就谢谢之前的packge——返回上一个编号的ACK
Rdt3.0:超时计时器
设定一个超时重传机制
发送方在发送一个分组之后开启超时计时器,如果超时了就重传
用来解决ACK或者packge丢失
发送方在等0号ACK时要是来了1号ACK或者其他的就重传0号packge
滑动窗口协议
发送缓冲区
存放已发送但未确定是否接收的packge
发送窗口
缓冲区的子集
最开始后沿等于前沿,之后每发送一个分组,前沿移动一个单位
发送窗口前沿移动
发送窗口后沿移动
停止等待协议
是滑动窗口协议中缓冲区为1的情况
发一个packge之后等待回应之后再发第二个
流水线协议
是滑动窗口协议中缓冲区大于1的情况
GBN(go back n)
接收区窗口等于1
超时之后发送方窗口中的分组全部重发
SR(selective repeat)
接收区窗口大于1
SR异常情况下的二窗口互动
发送窗口
- 新分组落入发送缓冲区范围,发送–>前沿滑动
- 超时重发机制让发送端将超时的分组重新发送出去
- 来了乱序分组的确认–>后沿不向前滑动–>新的分组无法落入发送缓冲区的范围(此时如果发送缓冲区有新的分组可以发送)
接收窗口
- 收到乱序分组,落入到接收窗口范围内,接收
- 发送该分组的确认,单独确认
总结
GBN
- 发送端最多在流水线中有N个未确定的分组
- 接收端只是发送累计型确认cumulative ack
- 发送端拥有对最老的为确认分组的定时器
- 只需要设置一个定时器
- 当定时器到时时,重传所有未确认分组
- 发送窗口最大值2n-1
SR
-
发送端最多在流水线中有N个未确认的分组
-
接收方对每个到来的分组单独确认individual ack(非累积确认)
-
发送方为每个未确认的分组保持一个定时器
- 当超时定时器到时,只是重发到时的未确认分组
当定时器到时时,重传所有未确认分组
- 发送窗口最大值2n-1
SR
-
发送端最多在流水线中有N个未确认的分组
-
接收方对每个到来的分组单独确认individual ack(非累积确认)
-
发送方为每个未确认的分组保持一个定时器
- 当超时定时器到时,只是重发到时的未确认分组
-
发送窗口最大值2n-1