TCP的滑动窗口机制,谈谈其设计演化过程

理解TCP滑动窗口是如何工作的,对于理解TCP的其他知识是至关重要的 。
相比于更为简单,同为传输层协议的UDP而言,TCP提供了对传输数据的质量保证 。
在可靠性上,TCP确保传输的数据不丢失、不重复,也不会产生乱序 。
同时,TCP还提供了流量控制,用于控制数据发送的速度,防止较快主机导致较慢主机的缓冲区溢出 。
接下来,从不可靠的协议开始说起,看看TCP面向流的滑动窗口机制是如何演化而来的 。
不可靠的协议对于不可靠的协议(例如IP、UDP),当数据发出去之后,可能到达目的地,也可能丢失 。
如果没有提供消息反馈的机制,那么发送方将无法获知数据是否已成功的送达目的地,因而也无法对丢失的数据进行重传 。
没有消息反馈机制,是造成传输不可靠,没有流控的一个主要原因 。
 

TCP的滑动窗口机制,谈谈其设计演化过程

文章插图
 
 
支持重传的确认机制为了能够在一个不可靠协议的基础之上,进行可靠的数据传输,引入了消息反馈机制 。
消息反馈发送方发送一条信息,当接收方收到数据之后,给发送方返回一个接收成功的反馈信息 。
简单的实现流程如下:
  1. 主机A给主机B发送一条消息;
  2. 主机B收到后,给主机A发送一条确认消息,告诉A消息已经被成功的接收了;
  3. 主机A在收到B的确认消息之后,就知道该消息已发送成功 。
但是这个简单的机制,可能存在2个问题:
  1. 由于IP协议是不可靠的,实际上消息可能没有到达目的地 。这样,主机A将会处于等待消息确认的状态,可能永远也收不到确认 。
  2. 另一方面,也有可能主机B在收到了从A发送过来的消息之后,返回了确认消息,但这个消息却意外的丢失了 。
以上2种情况,都有可能导致主机A一直处于等待确认消息的状态,但却永远也等不到 。
超时重传为了解决这个问题,当主机A发送一条消息之后,可以同时启动一个计时器 。这个计时器的时间要足够长,让消息能够送达主机B,同时让确认消息也能够返回给主机A 。
如果在确认消息到达主机A之前,计时器超时了 。那么,主机A会认为发送消息的过程中遇到了问题(可能是丢失了,或者网络堵塞导致包延迟),于是就重传该消息 。
由于这种对消息的确认机制,既包含了对消息已收到的确认应答,也包含了发生超时后对消息的重传,因此被称为支持重传的确认机制(PAR,Positive Acknowledgment with Retransmission) 。
 
TCP的滑动窗口机制,谈谈其设计演化过程

文章插图
 
 
基于PAR机制,能够给数据传输提供基本的可靠性保证 。
但PAR机制存在一个缺点,就是在任何时候,只能有一条消息是未被确认的 。这会使得系统变得非常慢,因为后续消息的发送都得等待前一条消息的确认 。
消息标识和发送限制PAR机制比较适用于传输少量数据,或者交互不是很频繁的协议 。由于PAR传输效率低下,因此也不适用于像TCP这样的协议 。
为了解决传输效率低下的问题,引入了消息标识 。
消息标识当发送方发送消息的时候,为这个消息增加一个唯一标识 。接收方在收到消息之后,返回的确认消息也带上该消息标识 。
这样,发送方就可以针对不同的消息使用不同的标识 。发送方可以同时发送多条消息,在收到确认消息之后,只要根据消息标识进行匹配,确认对应的消息即可 。
以上,只是从发送方的角度,解决了发送方的发送速率问题(在任何时候,只能有一条消息是未被确认的) 。
发送限制我们再换个角度,原来是发送一个消息,接收方处理完,返回确认消息后,等待下一条消息 。这个过程,对于接收方来说,并不会存在什么问题 。
在引入消息标识之后,发送方可以同时发送多条消息了 。但如果发送过快,接收方可能由于处理不过来,被压垮了 。
因此,对于接收方来说,需要保证在自己能够正常接收处理数据的情况下,通过一种机制,来通知发送方尽量不要发送得太快,发送的数据尽量按照自己的处理能力来 。
比较容易想到的,就是在接收方返回确认消息的时候,将接收方的发送限制信息带上,传递给发送方 。
发送方在收到确认消息中的发送限制字段时,就可以按照接收方的要求来控制自己的发送速率 。
有了这个发送限制,接收方就可以根据自己的实际负载情况,进行动态反馈以调整发送速率,最优化发送性能 。


推荐阅读