网络是不可靠的,资料在通信链路的传输过程中,可能因为信号干扰问题而导致信号错误。在这种情况下,通常使用循环冗余校验(CRC)来检测错误。虽然有些侦错程序足够强大,强大到可以更正错误的信号,但是这个过程会消耗大量的计算资源。接收端若是收到了错误的讯框则会丢弃这个讯框,为了达到可靠传输的目的,发送端必须重新发送这些被丢弃的讯框。
为了达到重送错误讯框的目的,我们使用了以下 2 种基础方法
- 肯定回复(Acknowledgment,ACK)
- 等待超时(timeout)
ACK 是一个控制讯框,接收端用它来通知传送端其已收到之前的讯框,发送端端则通过接收到 ACK 确认其讯框发送成功。
若是发送端在经过一段等待时间后还没有收到 ACK,发送端会重新发送原来的讯框,发送端等待 ACK 的一段合适的时间的动作叫做等待超时。
停止和等待协议
发送端在传送完一个讯框之后必须等收到 ACK之后,才能发送下一个讯框。当发送端等待一段时间后还未收到 ACK,发送端发送等待超时,重新发送原来的讯框。
上图所示,发送端在等待超时前收到 ACK。
上图所示,发送端的原始讯框丢失,发送端等待超时后重新发送讯框。
上图所示,接收端的 ACK 丢失,发送端等待超时,重新发送讯框。
上图所示,接收端的 ACK 延迟到达,接收端重新发送讯框。
接收端的 ACK 在到达发送端的过程中丢失或者延迟了,那么传送端会等待超时并且重送原本的讯框。这样的话重复发送同样的讯框,造成网络资源浪费。
上面存在的问题,通过给讯框设置一个序号则可以解决。当发送端发送编号为 0 的讯框,接收端可以知道这个讯框 0 重复,因此可以忽略这个讯框,但是依旧会给发送端发送 ACK。
滑动窗口协议 (Sliding Window Protocol)
到现在为止,发送端和接收端的通信模型在同一个时间只有一个讯框在发送,严重浪费网络资源。为了充分利用网络资源,发送端在停下来等待 ACK 之前,发送端必须发送更多的讯框。
为了实现滑动窗口协议,发送端给每个讯框一个序号,假设这个序号值可以无限大,发送端需要持续记录下面 3 个变量
- 传送窗口的大小(Sending Window Size,SWS)
- 最后收到的 ACK 序号(Last Acknowledgment Received,LAR)
- 最后发送的讯框序号 (Last Frame Sent,LFS)
对于上面的 3 个变量结合图示,我们有底下的等式
LFS - LAR <= SWS
当发送端接收到一个编号为 LAR+1 的 ACK,将 LAR 向右移动,使发送端可以发送另一个讯框。每个发送端对每个发送出去的讯框都会有一个计时器,若是计时器在 ACK 到达前超时,则重送该讯框。发送端也需要一个有 SWS 容量大小的缓冲区,用于存在发送出去的讯框,这样才能在需要重送讯框的时候找到讯框。
为了实现滑动窗口协议,接收端需要持续记录下面 3 个变量
- 接收窗口的大小(Receiving Windows Size ,RWS)
- 最大可接收的讯框序号(Largest Acceptable Frame ,LAF)
- 最后收到的讯框序号 (Last Frame Received ,LFR)
对于上面的 3 个变量结合图示,我们有底下的等式
LAF - LFR <= RWS
当接收端接收到序号为 SeqNum 的讯框时,若是 SeqNum <= LFR 或者 SeqNum > LAF ,此讯框在接收端滑动外面,那么接收端会将此讯框丢弃。若是 LFR < SeqNum <= LAF ,接收端接收此讯框。当接收端接收到一个编号为 LFR+1 的 讯框,将 LFR 向右移动。
如上图所示,假设 LFR = 1, RWS = 7, LAF = 8。若讯框 4,6,3,5 先后到达,虽然它们没有按照序号顺序到达,但是它们都会被收起来,因为它们都在接收端窗口内。但是接收端不会发送 ACK,因为讯框 2 还没有到达,等到讯框 2 到达之后,接收端发送讯框 6 的 ACK,此时窗口滑动, LFR 改为 6, LAF 改为 13。
如上图所示,滑动窗口协议中的 ACK 采用的是累积式的 ACK (Accumulative ACKs), SeqNumToAck 表示所有编号小于 SeqNumToAck 的讯框都已经收到了,即使收到较高序号的讯框,接收端还是会送出序号为 SeqNumToAck 的 ACK,对于接收端来说 LFR = SeqNumToAck -1, LAF = LFR+ RWS
总结
- 为了达到可靠传输的目的,协议设计者在通信链路上使用了 2 个基础技术,分别是 ACK 和 等待超时。
- 停止和等待协议是一个可靠的协议,但是运行效率不够好,同时只有一个讯框在通信链路上传送,而且接收端可能受到重复的讯框。
- 滑动窗口协议是一个可靠而且高效率的协议,它会给所有的讯框设置一个序号,多个讯框可以同时在通信链路上传送。对于发送端需要维持 3 个变量,分别是发送端视窗大小(SWS),最后收到的 ACK 编号(LAR),最后发送的讯框编号(LFS)。对于接收端需要维持 3 个变量,分别是接收端窗口大小(RWS),最大可接收的讯框编号(LAF),最后收到的讯框编号(LFR)。
对于发送端来说,有以下等式
对于接收端来说,有以下等式
- 滑动窗口协议提供了 3 个特性,分别是可靠的传输,维持讯框顺序,流量控制。利用每个讯框都有序号,顺序错误的讯框会被置于缓冲区的功能来实现维持讯框顺序特性。流量控制是利用接收端可以设定 RWS 的值来调节发送端的速度,防止发送端发送过多的讯框将接收端塞爆。
参考
作为网络方面的简单入门内容,文章主要是介绍网络的可靠传输机制的简单知识。这篇博客内容总结于黄能富教授的《CS01060 2017-秋季-計算機網路概論》课程,博客截图来源于课程 PPT。