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流控、以及拥塞控制的基础。
这一篇简单先到这,为后面讲拥塞控制做个铺垫。
(完)