深入理解HTTP协议——针对TCP的优化建议

1. TCP协议

TCP 是一个自适应的、对所有网络节点一视同仁的、最大限制利用底层网络的协议。因此,优化TCP 的最佳途径就是调整它感知当前网络状况的方式,根据它之上或之下的抽象层的类型和需求来改变它的行为。无线网络可能需要不同的拥塞算法,而某些应用程序可能需要自定义服务品质(QoS,Quality of Service)的含义,从而交付最佳的体验。

不同应用程序需求间的复杂关系,以及每个 TCP 算法中的大量因素,使得 TCP 调优成为学术和商业研究的一个“无底洞”。本章只蜻蜓点水般地介绍了影响 TCP 性能的几个典型因素,而没有探讨的选择性应答(SACK)、延迟应答、快速转发等,随便一个都能让你领略到 TCP 的复杂性(或者乐趣),感受到理解、分析和调优之难。尽管如此,而且每个算法和反馈机制的具体细节可能会继续发展,但核心原理以及它们的影响是不变的:

  • TCP 三次握手增加了整整一次往返时间;
  • TCP 慢启动将被应用到每个新连接;
  • TCP 流量及拥塞控制会影响所有连接的吞吐量;
  • TCP 的吞吐量由当前拥塞窗口大小控制。

结果,现代高速网络中 TCP 连接的数据传输速度,往往会受到接收端和发送端之间往返时间的限制。另外,尽管带宽不断增长,但延迟依旧受限于光速,而且已经限定在了其最大值的一个很小的常数因子之内。大多数情况下,TCP 的瓶颈都是延迟,而非带宽。

2. 服务器配置调优

在着手调整 TCP 的缓冲区、超时等数十个变量之前,最好先把主机操作系统升级到最新版本。TCP 的最佳实践以及影响其性能的底层算法一直在与时俱进,而且大多数变化都只在最新内核中才有实现。一句话,让你的服务器跟上时代是优化发送端和接收端 TCP 栈的首要措施。

有了最新的内核,我们推荐你遵循如下最佳实践来配置自己的服务器。

  • 增大TCP的初始拥塞窗口

加大起始拥塞窗口可以让 TCP 在第一次往返就传输较多数据,而随后的速度提升也会很明显。对于突发性的短暂连接,这也是特别关键的一个优化。

  • 慢启动重启

在连接空闲时禁用慢启动可以改善瞬时发送数据的长 TCP 连接的性能。

  • 窗口缩放(RFC 1323)

启用窗口缩放可以增大最大接收窗口大小,可以让高延迟的连接达到更好吞吐量。

  • TCP快速打开

在某些条件下,允许在第一个 SYN 分组中发送应用程序数据。TFO(TCP Fast Open,TCP 快速打开)是一种新的优化选项,需要客户端和服务器共同支持。为此,首先要搞清楚你的应用程序是否可以利用这个特性。

以上几个设置再加上最新的内核,可以确保最佳性能:每个 TCP 连接都会具有较低的延迟和较高的吞吐量

根据应用程序的类型,可能还有必要调整服务器上的其他 TCP 设置,以便优化高速连接的速度、内存占用,或者其他类似的关键选项。不过,这些系统配置与平台、应用程序、硬件有关,超出了本文讨论范围;必要时,可以参考平台文档。但更重要的是要分清轻重缓急,着力解决真正的瓶颈,而不是眉毛胡子一把抓。

3. 应用程序行为调优

调优 TCP 性能可以让服务器和客户端之间达到最大吞吐量和最小延迟。而应用程序如何使用新的或已经建立的 TCP 连接同样也有很大的关系。

  • 再快也快不过什么也不用发送,能少发就少发。
  • 我们不能让数据传输得更快,但可以让它们传输的距离更短。
  • 重用 TCP 连接是提升性能的关键。

当然,消除不必要的数据传输本身就是很大的优化。比如,减少下载不必要的资源,或者通过压缩算法把要发送的比特数降到最低。然后,通过在不同的地区部署服务器(比如,使用 CDN),把数据放到接近客户端的地方,可以减少网络往返的延迟,从而显著提升 TCP 性能。最后,尽可能重用已经建立的 TCP 连接,把慢启动和其他拥塞控制机制的影响降到最低。

4. 性能检查清单

优化 TCP 性能的回报是丰厚的,无论什么应用,性能提升可以在与服务器的每个连接中体现出来。下面几条请大家务必记在自己的日程表里:

  • 把服务器内核升级到最新版本(Linux:3.2+);
  • 确保 cwnd 大小为 10;
  • 禁用空闲后的慢启动;
  • 确保启动窗口缩放;
  • 减少传输冗余数据;
  • 压缩要传输的数据;
  • 把服务器放到离用户近的地方以减少往返时间;
  • 尽最大可能重用已经建立的 TCP 连接。

相关推荐

  1. 深入理解HTTP协议——针对TCP优化建议

    2024-06-18 12:54:04       10 阅读
  2. 深入理解HTTP/HTTPS协议

    2024-06-18 12:54:04       13 阅读
  3. 深入理解HTTPTCP:应用层与传输层区分

    2024-06-18 12:54:04       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-18 12:54:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-18 12:54:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-18 12:54:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-18 12:54:04       20 阅读

热门阅读

  1. Doris 系统日志和审计日志

    2024-06-18 12:54:04       6 阅读
  2. 【人工智能】深度解读 ChatGPT基本原理

    2024-06-18 12:54:04       10 阅读
  3. mysql竖表变横表不含聚合

    2024-06-18 12:54:04       8 阅读
  4. Chrome 报错: ERR_ACCESS_DENIED

    2024-06-18 12:54:04       7 阅读
  5. AI大战:通用VS垂直模型,谁主未来?

    2024-06-18 12:54:04       7 阅读
  6. xpath爬取4399的最新游戏系列

    2024-06-18 12:54:04       6 阅读
  7. Day05 数组

    2024-06-18 12:54:04       5 阅读
  8. C++中的八大设计原则

    2024-06-18 12:54:04       5 阅读
  9. window环境C++读取带中文的文档乱码问题

    2024-06-18 12:54:04       8 阅读
  10. 使用微信小程序制作画布

    2024-06-18 12:54:04       5 阅读