可靠数据传输
高清思维导图见文章末链接。(xmind格式)
不可靠数据传输
#todo
可靠数据传输的要求
要求
数据可以通过一条可靠的信道进行传输,借助于可靠信道,传输数据比特就不会受到损坏或者丢失
- 数据可以通过一条可靠的信道进行传输,借助于可靠信道,传输数据比特就不会受到损坏或者丢失
rdt 1.0
有限状态机
-
发送端
-
接收端
说明
-
发送端
- 发送端通过使用rdt_send(data)事件接收来自高层的数据,然后用make_pkt(data)产生一个分组,将分组发送到信道中,
-
接收端
- 接收端通过rdt_rcv(packet)事件从底层信道接收一个分组,从分组中取出数据(extract(packet,data)),并将数据上传给较高层(deliver_data(data))
问题
- 接收方没有提供任何信息反馈给发送方,假定了接收方接收数据的速率能够与发送方发送数据的速率一样快,假定了不出现传输差错。
rdt 2.0
自动重传请求协议(Automatic Repeat reQuest, ARQ)
- 肯定确认与否定确认
有限状态机
-
发送方
-
接收方
说明
-
发送方
- 发送方等待上层传下来的数据然后调用rdt_send(data),产生一个包含待发送数据的分组(sndpkt),带有检验和然后由udt_send(sndpkt)发送该分组。
- 在右边的状态中,发送方等待来自接收方的ACK或者NAK分组,如果收到一个ACK分组,协议返回到等待来自上层数据的状态;如果接收到一个NAK分组,则重传上一个分组并等待接收方为重传分组回送ACK或NAK。
- 注意:发送方处于等待ACK或者NAK状态时,不能接收上层传来的数据。由此rdt2.0也叫停等协议。
-
接收方
- 分组到达时候,根据分组是否受损回答一个ACK或者NAK。
问题
-
ACK/NAK可能受损,如果受损了,该怎样纠错,考虑处理受损ACK和NAK三种可能性
- 如果发送方收到NAK后反馈信息又受损了怎么办
- 检错和纠错
- 发送方收到含糊不清的ACK或者NAK时,重传当前数据分组,但是这样会引入冗余分组,但是接收方不知道这是不是重传。
rdt 2.1
说明
- 在数据分组中添加一个新字段,即为发送数据分组的序号,接收方只需要检查序号就可以确定收到的分组是否是一次重传。对于停等协议,1比特的序号就足够了。接收方当收到失序的分组时,接收方对所接收的分组返回一个肯定确认,如果收到受损的分组,则返回否定确认
有限状态机
-
发送方
-
接收方
rdt 2.2
说明
- 在rdt2.1的基础上,不发生NAK,而是再发送一个ACK,则发送方接收到对同一个分组的两个ACK(冗余ACK)后,就知道接收方没有正确接收到跟在被确认两次的分组后的分组。接收方此时必须由一个ACK报文所确认的分组序号(接收方make_pkt()),发送方此时必须检查接收到的ACK报文中被确认的分组序号(发送方isACK())
有限状态机
-
发送方
-
-
接收方
rdt 3.0(比特交替协议)
有限状态机
-
发送
接收方的有限状态机与rdt2.2相同
说明
- 发送方添加一个计时器,当一定时间内没收到ACK反馈,则重传。即使分组是没丢失,ACK也没丢失但是经历了很大的时延,也会重传。发送方需要做到:每次发送一个分组时,便启动一个定时器;响应定时器中断;终止定时器。(停等协议)
处理数据丢失示意图
-
无丢包操作
-
分组丢失
-
丢失ACK
-
过早超时
流水线可靠数据传输协议
停等协议(rdt3.0)
- 利用率很低
流水线协议
-
就是在第一个分组发送后,发送端开始发送第二个分组
-
需要增加序号范围
-
发送方和接收方都需要缓存多个分组,发送方最低应当能缓存那些已发送但没有确认的分组。
-
所需序号范围和对缓冲的要求取决于数据传输协议如何处理丢失,损坏和延时过大的分组。有两个基本方法:回退N步和选择重传。
- 回退N步(GBN)(滑动窗口协议)
- 选择重传(SR)
回退N步
基本概念
- 最大允许数N:在流水线中未确认的分组的个数,(窗口长度)
- 基序号base:最早未确认分组的序号
- 下一个序号nextseqnum:最小的未使用序号
- [0,base-1]对应了已经发送并被确认的分组;[base,nextseqnum-1]对应已经发送但是未被确认的分组。[nextseqnum,base+N-1]对应那些要被立即发送的分组。大于或等于base+N的序号无法使用
- 示意图
有限状态机
-
发送方
-
-
响应三种类型的事件
-
上层的调用
- 上层调用rdt_send()时,发送方需要检查窗口是否有N个已发送但未确认的分组,如果未满,则发送,已满则向上一层反馈。实际上,发送方可能会缓存这些数据或者与上层采用同步机制。
-
收到ACK
- 使用累计确认的方式,表明接收方已正确收到序号为n的以前且包括n的分组。
-
超时
- 发送方重传所有已发送但还没被确认的过的分组
-
-
-
-
接收方
-
- 如果序号为n的分组被接收到,则返回ACK,并将该分组交付给上层,在其他情况下,丢弃该分组,并为最近的按序接收的分组重新发送ACK。
-
问题
- 当窗口长度和带宽时延积都很大,在流水线中会有很多分组,一个分组的差错会导致重传很多分组。
演示
演示见文章底部链接。是非常方便直观的小程序哦。
选择重传
基本概念
-
让发送方仅重传那些它怀疑在接收方出错的分组而避免了不必要的重传。
-
发送方看到的序号
-
从上层收到数据
- 当从上层接收到数据后,SR发送方检查下一个可用于该分组的序号。如果序号位于发送方 的窗口内,则将数据打包并发送;否则就像在GBN中一样,要么将数据缓存,要么将其返回给上层以便以后传输。
-
超时
- 定时器再次被用来防止丢失分组。然而,现在每个分组必须拥有其自己的逻辑定时器,因为超时发 生后只能发送一个分组。可以使用单个硬件定时器模拟多个逻辑定时器的操
-
收到ACK
- 如果收到ACK,倘若该分组序号在窗口内,则SR发送方将那个被确认的分组标记为已接收。 如果该分组的序号等于send_base 则窗口基序号向前移动到具有最小序号的未确认分组处。如果窗口移动了并且 有序号落在窗口内的未发送分组,则发送这些分组。
-
-
接收方看到的序号
-
序号在[rcv_base, rcv_base+N-1 ]内的分组被正确接收。
- 在此情况下,收到的分组落在接收方的窗口 内,一个选择ACK被回送给发送方。如果该分组以前没收到过,则缓存该分组。如果该分组的序号等于接收窗口的基序号.则该分组以及以前缓存的序号连续的(起始于rcv_base的)分组交付给上层。然后.接收窗口按向前移动分组的编号向上交付这些分组。
-
序号在[rcv_base-N,rcv_base-1 ]内的分组被正确分割
- 在此情况下,必须产生一个ACK,即使该分组 是接收方以前已确认过的分组。
-
其他情况
-
忽略该分组
- 忽略该分组
-
-
-
失序的分组将被缓存直到 所有丢失分组(即序号更小的分组)皆被收到为止,这时才可以将一批分组按序交付给上层。
演示
演示见文章底部链接。
回忆一下
#一些词语说明
rdt(reliable data transfer)
udt(unreliable data transfer)
有限状态机(FSM)说明:
引起变迁的事件显示在表示变迁的横线上方事件发生时所采取的的动作显示在横线下方,如果对一个事件没有动作,或没有就事件发生而采取了一个动作,我们将在横线上方或下方使用符号Λ,以分别明确地表示缺少动作或事件
比特差错处理协议
差错检测
- 检测何时出现了比特差错,使用额外的比特来差错检验和纠错,这些比特被汇集在rdt2.0数据分组的分组检验和字段中
接收方反馈
- 反馈信息ACK和NCK,一般来说用1表示ACK,0表示NCK
重传
- 收到有差错的分组时,发送方重传该分组报文
完整思维导图和演示链接:点我去下载
说明:本文内容参考自 《计算机网络 自顶向下方法》第7版,机械工业出版社的。
侵删。