赞
踩
在接收方 B 会出现两种情况:
在这两种情况下,B 都不会发送任何信息。A都必须重发分组,直到B正确接收为止,这样才能实现可靠通信。
A怎么知道 B 是否正确收到了 M1 呢?
丢失确认
若分组正确到达B,但B回送的确认ACK丢失或延迟了,A未收到B的确认,会超时重发。B 可能会收到重复的 M1 。B如何知道收到了重复的分组,需要丢弃呢?
A根据确认及其编号,可以确定它是对哪一个分组的确认,避免重发发送。若为重复的确认,则将其丢弃。
迟到确认
传输过程中没有出现差错,但 B 对分组 M1 的确认迟到了。
A会超时重发M1, 则B 收到重复的 M1,同样要丢弃重复的 M1,并重传确认分组。
稍后B迟到的确认和重发的确认都会到达A,A收到重复的确认,对重复的确认的处理很简单:收下后就丢弃。
为了提高传输效率,发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据不间断地传送。
流水线传输通常要求
(1)必须增加序号范围,因为每个输送中的分组(不计算重传的)必须有一个唯一的序号,因为可能存在有多个在输送中未确认的报文。
(2)协议的发送方和接收方要能缓存多个分组。发送方至少要能缓存那些已发送但没有确认的分组,接收方可能要缓存那些已正确接收的分组。
(3)所需序号范围和对缓冲的要求取决于数据传输协议如何处理丢失、损坏及延时过大的分组。
(4)解决流水线传输的差错有两种滑动窗口协议:回退N(Go-Back- N,GBN) 和选择重传(Selective Repeat,SR) 。
累积确认
即接收方不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认。
因此,接收方不必对中间某个确认包的丢失进行重传,因为累积确认的效果,一旦一个较大序号的ACK被接收到,则表示这个包之前的包都已经成功收到。
如果接受方收到了这个确认,则表示到这个分组为止之前的所有分组都已正确收到了。
但同时累积确认也有缺陷,例如发送方传送了5个包,但是第3个包丢失了,第4和第5个正常。这时根据累积确认,接收方只能传送前两个包的ACK(按序到达的最后一个)。在接收到第2个包ACK的发送方不知道后面3个包是否到达,就会将后3个包全部进行重传。即:Go-back-N。
优点:容易实现,即使部分确认丢失也不必重传。
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。
注:TCP并不是每一个报文段都会回复ACK的,可能会对一个报文段发送一个ACK(M0、M2),也可能会对多个报文段发送1个ACK(M3+M4+M5)
滑动窗口协议(Sliding Window Protocol)以基于分组的数据传输协议为特征。因此该协议适用于对按顺序传送分组的可靠性要求较高的环境,例如在数据链路层(OSI模型)以及传输控制协议(TCP)中。
发送窗口中有四个概念:
接收窗口中也有四个概念:
为了解决流水线传输的差错,TCP协议提供两种滑动窗口:回退N(Go-Back- N,GBN) 和选择重传(Selective Repeat,SR) 来解决这个问题
如果发送方发送了前 5 个分组,而中间的第 3 个分组丢失了。这时接收方只能对前两个分组发出确认。
发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。
这就叫做 Go-back-N(回退 N),表示需要再退回来重传已发送过的 N 个分组。
可见当通信线路质量不好时,连续 ARQ 协议会带来负面的影响。
如果下面的网络层协议丢失了很多分组,那么返回N协议的效率就会很低。
因为每当一个分组损坏,发送方就需要重传所有待确认的分组,虽然其中有些分组实际上已经完整地被接收了
选择重传协议只重传真正出错或者丢失的帧,那怎么实现呢?
发送方维持着一个窗口,包含可发送或已发送但未被确认的序号。
接收方维持着一个窗口,包含可接收的序号,每个序号还保留一个缓冲区。与每个缓冲区项相关联的还有一个标志位,用来指明缓冲区是满的还是空的。
每到达一个帧,接收方通过检查它的序号,看是否落在窗口内。如果确实落在窗口内且之前没有接收过,则接收该分组然后保存在缓冲区并返回一个确认。等前面这些帧都到达后一起交付给上层
发送端每个发送缓冲都设有一个超时一个超时计时器,一个超时事件发生后相应缓冲区的帧就会被重发
但是非顺序接收也引发了一些特殊问题。
假设我们用3bit的序号(0~ 7),那么发送方允许发送8个帧,然后开始等待确认。刚开始时,发送方和接收方的窗口如图所示
现在发送方发出0~ 7号帧,接收方的窗口接收任何序号落在0~7之间的帧。
这8个帧全部到达后,接收方发送确认(发送方还未收到),并且向前移动它的窗口,允许下一次接收0、1、2、3、4、5,6,7号帧
这时会存在两个场景
情景一:
发送方收到了全部确认,发送窗口前移,然后继续发送后面的数据(0号帧)
这时接收方会收到一个0号帧
情景二:
假如第一次发出的所有确认都丢失了,所以接收方在超时之后便会重传0号帧(其他帧也会重传,只不过0号帧先被发送、先超时、先重传)
因为接收方已经接收了0~7号帧,并已发送了确认(虽然接收方未收到),所以窗口会向前移动,允许下一次接收0、1、2、3、4、5,6,7号帧。
此时接收方也能收到一个0号帧
两种情况下接收方都能收到0号帧,一个是重传的一个是新发送的,接收方没法区分这两个0号帧。
这个问题通常通过设置窗口大小来解决
注意: 在发送完一个分组后,必须暂时保留已发送的分组的副本,以备重发。
这里引用知乎的一个答复
- ARQ是一种可以在不可靠的数据通道上可靠地传输数据的方案,所以其实链路层和传输层都用了ARQ,并不专属某一层。
- 并不是一条连接只要有一层用了ARQ,它的上层的通信就是可靠的。因为ARQ只保证使用它的点到点是可靠的,比如数据链路层只保证你和你的路由器通信可靠,你的路由器到小区的路由器通信也可靠, 但是路由器本身会故障,会拥塞丢包,也就是点本身会产生问题。
- 所以需要在传输层或者应用层再加一层ARQ保障整条数据通道的可靠性。比如你自己写程序要在应用层通信,但传输层不用tcp想用udp,也可以在你程序里用ARQ协来实现可靠性。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。