TCP协议存在的问题
- TCP三次握手增加了整整一次的往返时间;
- TCP慢启动被应用到每一次的新连接;
- TCP流量及拥塞控制会影响所有连接的吞吐量。
- TCP的吞吐量由当前拥塞窗口大小确定。
现代高速网络中的TCP连接的数据传输速度受到接收端和发送端的往返时间的限制。此外,延迟依旧受限于光速,而且已经限定在其最大值的一个很小的常数因子之内。所以,大多数情况下,TCP的瓶颈都是延迟,而非带宽。
延迟
延迟是消息或分组从起点到终点经历的时间。
影响延迟的因素:
- 传播延迟:消息从发送端到接收端需要的时间,与信号传播距离和速度有关。
- 传输延迟:把消息中的所有比特转移到链路中需要的时间,与消息长度和链路速率有关。
- 处理延迟:处理分组首部、检查位错误及确定分组目标所需的时间。
- 排队延迟:到来的分组排队等待处理的时间。
以上延迟的时间总和,就是客户端到服务器的总延迟时间。
TCP Fast Open
这是减少新建TCP连接带来性能损失的一种机制。通过握手开始时的 SYN 包中的 TFO cookie(一个 TCP 选用项)来验证一个之前连接过的客户端。如果验证成功,它可以在三次握手最终的 ACK 包收到之前就开始发送数据,这样便跳过了一个绕路的行为,更在传输开始时就降低了延迟
三次握手带来的延迟使得每次创建一个新TCP连接都要付出巨大代价,所以这里是提升TCP应用性能的关键。
服务器配置调优
- 增大TCP的初始拥塞窗口:加大拥塞窗口能够让TCP在第一次往返中就可以传输较多的数据,而随后的速度提升明显。对于突发性的短暂连接,这是一个很重要的优化的点。
- 慢启动重启:在连接空闲时禁用慢启动可以改善瞬时发送数据的长TCP连接的性能。
- 窗口缩放(RFC 1323):启用窗口缩放可以增大最大接收窗口的大小,可以让高延迟的连接达到更好的吞吐量。
- TCP快速打开:在某些条件下,允许在第一个SYN分组中发送应用程序数据。不过需要发送端和客户端同时支持TFO(TCP快速打开)
应用程序行为调优
- 消除不必要的数据传输,如不必要的资源下载后者通过压缩算法将传送的数据量降到最低;
- 实现数据的短距离传输,如采用CDN技术来减少网络往返的延迟,从而显著提升TCP的性能;
- 尽可能重用TCP连接,把慢启动和其他拥塞控制机制的影响降低到最小。