修复Linux TCP的窗口缩放问题


8

我正在尝试提高我的一台服务器在国外的吞吐量,并在使用Wireshark监视服务器与家用计算机之间的传输之后,我确定我的窗口大小有问题。

对于ftp传输,接收窗口大小为14720。

Window size value: 115
Calculated window size: 14720
Window size scaling factor: 128

我的发送窗口看起来像我设置为:

Window size value: 65335
Calculated window size: 261340
Window size scaling factor: 4

那我该如何修复窗口呢?我已经检查了服务器上的linux tcp设置,一切似乎都很正常。时间戳打开,syncookie关闭,缩放打开,麻袋打开,三次是拥塞控制方法,最大接收和发送窗口大小为3mb。我尝试更改默认的tcp_wmem和tcp_rmem值,但是它什么也没做。

编辑:

当我关闭服务器上的自动调整和/或窗口缩放时,窗口缩小到14600,这基本上是MSS的10倍。

5337    4.268584    2.2.2.2 1.1.1.1 FTP 106 Response: 227 Entering Passive Mode (2,2,2,2,240,15).
5338    4.268640    1.1.1.1 2.2.2.2 TCP 74  59855 > 61455 [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=431721460 TSecr=0 WS=128
5364    4.300368    1.1.1.1 2.2.2.2 TCP 54  57609 > ftp [ACK] Seq=217 Ack=648 Win=15744 Len=0
5480    4.346856    2.2.2.2 1.1.1.1 TCP 66  61455 > 59855 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=128
5481    4.346867    1.1.1.1 2.2.2.2 TCP 54  59855 > 61455 [ACK] Seq=1 Ack=1 Win=14720 Len=0
5482    4.346893    1.1.1.1 2.2.2.2 FTP 70  Request: STOR 100mb.bin
5570    4.428061    2.2.2.2 1.1.1.1 FTP 109 Response: 150 Opening BINARY mode data connection for 100mb.bin
5571    4.428078    1.1.1.1 2.2.2.2 TCP 54  57609 > ftp [ACK] Seq=233 Ack=703 Win=15744 Len=0
5572    4.428155    1.1.1.1 2.2.2.2 FTP-DATA    2974    FTP Data: 2920 bytes
5573    4.428166    1.1.1.1 2.2.2.2 FTP-DATA    1514    FTP Data: 1460 bytes
5662    4.505384    2.2.2.2 1.1.1.1 TCP 60  61455 > 59855 [ACK] Seq=1 Ack=1461 Win=8832 Len=0
5663    4.505392    1.1.1.1 2.2.2.2 FTP-DATA    2974    FTP Data: 2920 bytes
5664    4.505421    2.2.2.2 1.1.1.1 TCP 60  61455 > 59855 [ACK] Seq=1 Ack=2921 Win=11776 Len=0
5665    4.505429    1.1.1.1 2.2.2.2 FTP-DATA    2974    FTP Data: 2920 bytes
5666    4.505535    2.2.2.2 1.1.1.1 TCP 60  61455 > 59855 [ACK] Seq=1 Ack=4381 Win=14720 Len=0
5667    4.505543    1.1.1.1 2.2.2.2 FTP-DATA    2974    FTP Data: 2920 bytes
5734    4.583769    2.2.2.2 1.1.1.1 TCP 60  61455 > 59855 [ACK] Seq=1 Ack=5841 Win=17536 Len=0
5735    4.583778    1.1.1.1 2.2.2.2 FTP-DATA    2974    FTP Data: 2920 bytes
5736    4.583781    2.2.2.2 1.1.1.1 TCP 60  61455 > 59855 [ACK] Seq=1 Ack=7301 Win=20480 Len=0
5737    4.583787    1.1.1.1 2.2.2.2 FTP-DATA    2974    FTP Data: 2920 bytes

您是否在传输过程中看到窗口缩小到零?您实际上是在一侧等待窗口可用性时看到数据包延迟吗?如果您可以发布您认为已确认的pcaps(带有时间戳),以便社区进行分析,则将很有帮助。
多项式

窗口不缩小,我不认为只有数据包延迟不会增加窗口大小。
incognito2

Answers:


4

从2.6.17(或左右版本)Linux内核开始,增加了默认比例因子。不利的一面是似乎存在路由器/防火墙/等。不能正确处理TCP窗口缩放(rfc大约只有16年的历史)。如果必须遍历这些设备之一,则需要关闭窗口缩放比例,否则事情会变得很慢。

在类似Redhat / Redhat的系统上,“修复”用于:

  /bin/cat <<'EOT'>>/etc/sysctl.conf

  # Turn off the tcp_window_scaling
  net.ipv4.tcp_window_scaling = 0
  EOT

  /sbin/sysctl -p

我检查了Wireshark,然后服务器在广告一个14720的窗口,所以我不认为这是因为路由器。我似乎在所有TCP连接中都遇到了这个问题。
incognito2

0

嗯。您能给我们更多信息吗?如 ...

TCP发布{Reno,Vegas等}传输方向{桌面->服务器,服务器->桌面,其他}您正在使用什么进行测量?iperf?鱼叉?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.