TCP 的数据流真的是流吗?
每一个最初学习网络的人都会听到这样的一句话,TCP 是面向连接的基于字节流的传输协议,而UDP是基于数据包的无连接协议。这种把 TCP 比喻成为流的描述是非常形象的,因为我们知道 TCP 的滑动窗口协议能够保证数据源源不断的进入网络。可是问题是,如果我们仔细的观察每条 TCP 连接的表现,TCP 真的如我们想象的那样像水流一样顺滑的传输数据吗?
上面这个问题,如果仔细想一下应该就会回答不是。我们知道 TCP 也是一个数据包一个数据包进入网络,不同的数据包之间也是有发送间隔的,这种间隔就使得 TCP 在微观上看起来不是一个完整的流。不过,只能认识到这一点,并不能完全解答上面的问题。事实上,由于从收到包,网卡产生中断,拷贝数据到内核栈,内核向应用层递交数据是一个复杂的过程,TCP 的具体传输表现也会因此而受到种种影响。
TCP 中的 Train
早在 1986 年,Jain(如果你觉得 Jain 这个名字很熟,那就对了。这个人就是传说中的 Raj Jain,Jain’s Fairness Index 就是以他命名的,网络方面的大牛之一)以及 Routhier 就仔细地研究了MIT校园网络里面的 TCP 表现。他们发现TCP的数据流并没有呈现出流的形态,而是一个 burst 接着另一个 burst。这种传输形态使得 TCP 的数据包并没有在统计上满足一个泊松分布。他们为这种现象起了一个我觉得非常形象的名字:train(火车)。不得不说这个名字比现在的 flowlet,flowcell,flight,flier 的说法不知道好到哪里去了。