为高带宽连接设置(非常)大的 initcwnd 可能有哪些缺点?

Tom*_*mas 9 linux tcp tcp-slow-start

我一直在 Linux(使用 3.5 内核)中试验 TCP 参数。基本上关于这个连接:

服务器:数据中心的千兆上行链路,从另一个数据中心测试时,实际带宽(由于共享上行链路)约为 70 MB/s。

客户端:连接到 200mbit 光纤的千兆本地局域网。获取测试文件实际上达到了 20 MB/s。

延迟:往返约 50 毫秒。

远程服务器用作 10 到 100mb 范围内的文件的文件服务器。我注意到使用 10 的 initcwnd 时,这些文件的传输时间受到 TCP 慢启动的严重影响,需要 3.5 秒才能加载 10mb(达到最高速度:3.3 MB/s),因为它开始缓慢然后加速,但是它在达到最大速度之前完成。我的目标是调整这些文件的最小加载时间(因此不是最高的原始吞吐量或最低的往返延迟,如果这会减少加载文件所需的实际时间,我愿意牺牲两者)

所以我尝试了一个简单的计算来确定理想的 initcwnd 应该是什么,忽略任何其他连接和可能对其他人的影响。带宽延迟积为 200 Mbit/s * 50ms = 10 Mbit 或 1.310.720 字节。考虑到 initcwnd 以 MSS 为单位设置,并假设 MSS 大约为 1400 字节,这将需要设置:1.310.720 / 1400 = 936

这个值与默认值相差很远(Linux 中为 10*MSS,Windows 中为 64kb),因此将其设置为这样感觉并不是一个好主意。像这样配置它的预期缺点是什么?例如:

  • 它会影响同一网络的其他用户吗?
  • 它会为其他连接造成不可接受的拥塞吗?
  • 路径上某处的洪水路由器缓冲区?
  • 增加少量丢包的影响?

Sla*_*ast 1

这样配置的预期缺点是什么?例如:

Will it affect other users of the same network?
Run Code Online (Sandbox Code Playgroud)

更改 initcwnd 将影响:

  • 更改设置的服务器用户
  • 如果这些用户与配置设置更改的路由匹配。
Could it create unacceptable congestion for other connections?
Run Code Online (Sandbox Code Playgroud)

当然。

Flood router-buffers somewhere on the path?
Run Code Online (Sandbox Code Playgroud)

并非无关紧要,但除非它们是您的路由器,否则我会关注与您更接近的问题。

Increase the impact of small amounts of packet-loss?
Run Code Online (Sandbox Code Playgroud)

当然,它可以做到这一点。

结果是,这会增加有意或无意的丢包成本。任何能够完成 3 次握手(以低投资(数据量)输入输出大量数据)的人都可以更轻松地使用 DOS,使您的服务器更简单。

它还会增加需要重新传输一堆数据包的机会,因为突发中的第一个数据包将丢失。