TCP是一个基于应答(ACK)的协议。当发送端发送完一批数据之后,要等到接受端的应答之后才能发送下一批数据。如果把发送端看做一个时钟(clock),这个时钟的走动是通过发送端主动发送数据和获得应答来推进的,这个过程英文叫做self-clocking。受限于我的英文和中文水平,我把self-clocking做了一个蹩脚的翻译,叫“自律动”。

发送端有了“自律动”之后,就形成了一个闭环的系统,各种控制发送速率的方法(包括拥塞控制)有了用武之地。下面我们将以上帝视角了解一下TCP的自律动。

下面我们先来看一个图:

         Sending                                Receiving
         ----------                             ---------        
                   \                           /                 
         ///////    ---------------------------                  
 E  +--> /////// -->  /////////   /////  ////// --> ///// ---+  E
 N  |    ///////    ---------------------------              |  N
 D  |              /                           \             |  D
    |    ----------                             ---------    |   
 P  |                                                        |  P
 O  |    ----------                             ---------    |  O
 I  |              \                           /             |  I
 N  |               ---------------------------              |  N
 T  +---- \\  \\ <--  \\      \\    \\      \\  <-- \\    <--+  T
                    ---------------------------                  
                   /                           \                 
         ----------                             ---------        
         Clocking                               Acknowledging                         

         legend:
         - //////////: 携带数据的TCP分段
         - \\: 只携带ACK的TCP分段                                                              

自律动使TCP在发送端、中间网络、接收端三个部分之中形成了一个闭环。在这三个部分之中,不可预测性最大的是中间网络。在数据传输过程中,网络的丢包率可能会加大,时延可能会增大,甚至会会出现瞬时性的连接中断。TCP必须要能够适应中间网络这种阴晴不定的脾气。所以从设计上,TCP让接收端尽可能得把各种信号反馈给发送端,然后发送端调整发送速率来适应中间网络的变化。

这种接收端反馈信号,然后发送端来调整发送速率的模式构成了TCP流控、以及拥塞控制的基础。

这一篇简单先到这,为后面讲拥塞控制做个铺垫。

(完)