我之前问过类似的问题,但我认为我没有清楚细节。
我的服务器存在一些问题,由于地理距离导致服务器和客户端之间的延迟过高。经过研究,我发现可以通过增加 TCP 窗口大小来解决这个问题。
问题是我真的不知道该怎么做,而且按照我在网上找到的说明做也没有任何帮助。
所以我希望有人可以分享一些文档/命令/说明或任何可以进一步改善这个问题的东西。
以下是一些信息:
- 操作系统:Ubuntu 20.04 (LTS) x64
- 服务器:Apache/2.4.41
- 应用程序类型:Python - Flask
- 主办公司:Digital Ocean
编辑:经过几次回复告诉我调整窗口大小不能解决问题,我认为我还不够清楚。
在告诉我更改窗口大小不起作用之前,请参考这个答案。 https://networkengineering.stackexchange.com/a/2297/71565
如果您认为我误解了上面链接中的答案,请告诉我我具体错在哪里,而不要只是分享“它不起作用”等神秘的答复。
答案1
我不能 100% 确定您的问题确实与窗口大小有关。不过,您可以在下面找到相关信息。
由于 TCP 报头的限制,基本窗口大小不能超过 65535 字节。从RFC 1323:
TCP 报头使用 16 位字段向发送方报告接收窗口大小。因此,可以使用的最大窗口为 2**16 = 65K 字节。
这并不意味着 TCP 窗口不能更大,因为现代操作系统支持(并默认宣传)TCP 窗口缩放,其中窗口大小通过缩放动态增加,最高可达 14 倍。但是,可以配置上限前达到最大扩展。
作为参考,这些是 Ubuntu 20.04 上的相关参数(及其默认值):
net.ipv4.tcp_window_scaling = 1 ;scaling enabled
net.ipv4.tcp_rmem = 4096 131072 6291456 ;min, default and max receive window
net.ipv4.tcp_wmem = 4096 16384 4194304 ;min, default and max send window
net.core.rmem_max = 212992 ;max absolute limit for receive buffer
net.core.wmem_max = 212992 ;max absolute limit for send buffer
实际最大窗口大小是更小[r|w]mem_max
和 的第三个值之间tcp_[r|w]mem
。因此,在 Ubuntu 20.04 上,默认情况下,您的实际最大接收和发送窗口为 212992 字节。要将该限制增加到 4 MB,您可以执行以下操作:
sysctl -w net.core.rmem_max=4194304
sysctl -w net.core.wmem_max=4194304
如果有效,您可以通过编辑来保留设置/etc/sysctl.conf