TCP 协议可以说是今天互联网的基石,作为可靠的传输协议,在今天几乎所有的数据都会通过 TCP 协议传输,然而 TCP 在设计之初没有考虑到现今复杂的网络环境,当你在地铁上或者火车上被断断续续的网络折磨时,你可能都不知道这一切可能都是 TCP 协议造成的。本文会分析 TCP 协议为什么在弱网环境下有严重的性能问题1。
注:本文的分析基于 RFC 7932 中定义的 TCP 协议,从 RFC 793 发布至今已经过了将近 40 年,期间多个状态为 Proposed Standard 的非强制性 RFC 都对 TCP 协议进行了修订,尝试优化 TCP 协议的性能,例如:选择性 ACK(Selective ACK, SACK)3、虚假超时剖析(Forward RTO, F-RTO)4 和 TCP 快开启(TCP Fast Open, TFO)5,最新版本的 Linux 中已经包含了这些 RFC 的实现。
底层的数据传输协议在设计时必须要对带宽的利用率和通信延迟进行权衡和取舍,所以想要解决实际生产中的全部问题是不可能的,TCP 选择了充分利用带宽,为流量而设计,期望在尽可能短的时间内传输更多的数据6。
在网络通信中,从发送方发出数据开始到收到来自接收方的确认的时间被叫做往返时延(Round-Trip Time,RTT)。
弱网环境是丢包率较高的特殊场景,TCP 在类似场景中的表现很差,当 RTT 为 30ms 时,一旦丢包率达到了 2%,TCP 的吞吐量就会下降 89.9%7,从下面的表中我们可以看出丢包对 TCP 的吞吐量极其显著的影响:
RTT | TCP 吞吐量 | TCP 吞吐量(2% 丢包率) |
---|---|---|
0 ms | 93.5 Mbps | 3.72 Mbps |
30 ms | 16.2 Mbps | 1.63 Mbps |
60 ms | 8.7 Mbps | 1.33 Mbps |
90 ms | 5.32 Mbps | 0.85 Mbps |
本文将分析在弱网环境下(丢包率高)影响 TCP 性能的三个原因:
-
TCP 的拥塞控制算法会在丢包时主动降低吞吐量;
-
TCP 的三次握手增加了数据传输的延迟和额外开销;
-
TCP 的累计应答机制导致了数据段的传输;
在上述的三个原因中,拥塞控制算法是导致 TCP 在弱网环境下有着较差表现的首要原因,三次握手和累计应答两者的影响依次递减,但是也加剧了 TCP 的性能问题。
拥塞控制
TCP 拥塞控制算法是互联网上主要的拥塞控制措施,它使用一套基于线増积减&