根据这个网站一旦往返时间增加,使用默认的 64KB TCP 窗口大小,我们会对远程服务器损失一些实时容量吞吐量。
我的网络带宽为 240mb/60mb 下载/上传。我住在一个第三世界国家,所有可用的 CDN 服务器距离我都有 2000-4000 公里,我到最近的 CDN 服务器的往返时间为 82ms,这意味着由于距离的原因,我所能达到的最大速度约为 ~6Mbit/s(假设服务器使用默认的 64KB TCP 窗口大小)。
我知道向某个服务器开放多个下载流可以帮助实现最大带宽,但遗憾的是即使同时有 32 个流,我的下载速度仍然无法达到远程服务器的最大潜在速度。
那么在这种情况下,假设没有本地服务器可用,我该怎么做才能实现这些服务器的全速运行?
答案1
TCP 使用窗口大小及其内置的加速过程,增加窗口大小是将更大的数据包发送到相同路径的第一步,这样就可以在“线路上”传输更大、更多的数据包,而不必等待它们被接收然后确认。另一种不必担心加速和其他 TCP 机制的方法是通过更有效的协议(如 UDP)来隧道传输流量(只要您不会遇到丢包等传输错误),从而通过使用已经“最佳”运行且性能最佳且无需握手的隧道来优化流量。
在 Linux 中,您可以增加发送缓冲区的内存,首先查看 net.core.rmem_max/wmem。如果您确实在运行 Linux,则可能值得查看有关性能优化的其他指南:sysctl.conf 中 net.ipv4.tcp_max_syn_backlog 的合理值或者搜索“调整 Linux 以适应高延迟连接”。
我对 Windows 没有太多经验,所以如果你使用的是 Windows,那么你就得靠自己了,但我认为那里也有很多关于网络堆栈优化的信息,我只是无法指出它们。
答案2
默认的 TCP 窗口大小最大值为 64 千字节。然而,人们很久以前就意识到,这不足以满足当今的网络要求。
因此,TCP 窗口缩放被发明并记录在 RFC 1323 中。它指定一个缩放因子,从 1 开始到 16384。这意味着最大有效 TCP 窗口大小可以是 16384 * 65535 字节 = 1,073,725,440 字节,即 1 GB。
实际的窗口缩放因子在 TCP 握手中确定,并在整个连接过程中使用该缩放因子。
您可以使用 WireShark 来检查 TCP 连接中真正的 TCP 窗口大小。