接收方将 TCP 窗口大小限制为 64,512

接收方将 TCP 窗口大小限制为 64,512

事实(请指出任何虚假陈述):

  1. 我在两个相隔 80 毫秒的站点之间建立了 100 Mbps 的连接

  2. 这是一个长连接,较大的 TCP 窗口大小可能对其有益,最大可达 100 Mbps * 0.08 秒 = 1,000,000 字节

  3. 两台机器都运行 Windows Server 2012。“接收窗口自动调整级别”在两台机器上都正常。“窗口缩放启发式”在两台机器上都已禁用。

  4. 我在一侧运行“iperf -s”,在另一侧运行“iperf -c”。传输速度为 5 Mbps。在另一个方向上也得到相同的结果。

  5. 双方均在其 SYN 中宣称支持 TCP 滑动窗口。

  6. 接收方在整个运行过程中请求 TCP 窗口大小为 64,512 字节 (0xFC00),且 TCP 窗口比例值为“无移位”(0x000)。

  7. 网络能够处理更大的窗口大小(参见下面的序列图)

  8. 接收方保持窗口小于网络支持的窗口

  9. 此连接发生在 IPSEC VPN 内。隧道接口的 MTU 在两个方向上均减少到 1400 字节。

问题

  • 为什么接收方要保持窗口较小?

未解答

  • 网络坏了

    在同一网络上运行的 Linux 机器将 TCP 窗口打开到 1.5 MB,并以 6 倍带宽传输数据

  • 已启用窗口缩放启发式方法

    窗口缩放启发式方法被禁用(请参阅下面“netsh interface tcp show heuristics”的输出)

  • 接收窗口自动调节级别不正常

    接收窗口自动调节级别正常(请参见下面的“netsh interface tcp show global”的输出)

  • 这在 ESXi 中的虚拟机上无法正常工作

    在同一主机上运行的虚拟 Linux 机器上,我获得了 6 倍的提升的性能。


更新 12015 年 6 月 12 日下午 4:30(太平洋夏令时)

我修改了测试,将 Linux 放在连接的一端。果然,当 Linux 向 Windows Server 2012 发送数据时,Windows 提供的 TCP 接收窗口太小(64,512 字节)。

当我将数据从 Windows 发送到 Linux 时,Linux 提供了足够大的 TCP 接收窗口(1,365,120 字节)。但是,Windows 将发送限制为最大~60,000 字节。


更新 22015 年 6 月 13 日下午 3:00(太平洋夏令时)

离根本原因更近了一步。在我的设置中,没有设置 SO_SNDBUF 或 SO_RCVBUF(由 iperf 设置)。这些是有效限制接收窗口的发送和接收缓冲区。当不指定这些值时,Windows Server 2012 提供 64 kB 的默认值。所以现在的问题是:

问题

  • 当未指定时,为什么 Windows Server 2012 不动态增加 SO_SNDBUF/SO_RCVBUF 以适应长粗管道,如下所述微软

未回答

  • “netsh winsock show autotuning”已禁用

    它已启用。


更新 32015 年 8 月 24 日下午 4:00(太平洋夏令时)

netsh 显然已被 Set-NetTCPSetting 及其系列所取代。Get-NetTCPSetting 与 Get-NetTCPConnection 结合显示我在“Internet”模式下运行,它为我提供了以下设置:

SettingName                   : Internet
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : CTCP
CwndRestart                   : False
DelayedAckTimeout(ms)         : 50
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

发送方 TCP 设置

PS C:\Users\acs> netsh interface tcp show global
Querying active state...

TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State          : enabled
Chimney Offload State               : disabled
NetDMA State                        : disabled
Direct Cache Access (DCA)           : disabled
Receive Window Auto-Tuning Level    : normal
Add-On Congestion Control Provider  : none
ECN Capability                      : enabled
RFC 1323 Timestamps                 : disabled
Initial RTO                         : 3000
Receive Segment Coalescing State    : enabled

PS C:\Users\acs> netsh interface tcp show heuristics
TCP Window Scaling heuristics Parameters
----------------------------------------------
Window Scaling heuristics         : disabled
Qualifying Destination Threshold  : 3
Profile type unknown              : normal
Profile type public               : normal
Profile type private              : normal
Profile type domain               : normal

PS C:\Users\acs> Get-NetTCPSetting

SettingName                   : Automatic
MinRto(ms)                    : 
InitialCongestionWindow(MSS)  : 
CongestionProvider            : 
CwndRestart                   : 
DelayedAckTimeout(ms)         : 
MemoryPressureProtection      : 
AutoTuningLevelLocal          : 
AutoTuningLevelGroupPolicy    : 
AutoTuningLevelEffective      : 
EcnCapability                 : 
Timestamps                    : 
InitialRto(ms)                : 
ScalingHeuristics             : 
DynamicPortRangeStartPort     : 
DynamicPortRangeNumberOfPorts : 

SettingName                   : Custom
MinRto(ms)                    : 20
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : DCTCP
CwndRestart                   : True
DelayedAckTimeout(ms)         : 10
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Compat
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 2
CongestionProvider            : Default
CwndRestart                   : False
DelayedAckTimeout(ms)         : 200
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Datacenter
MinRto(ms)                    : 20
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : DCTCP
CwndRestart                   : True
DelayedAckTimeout(ms)         : 10
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Internet
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : CTCP
CwndRestart                   : False
DelayedAckTimeout(ms)         : 50
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

发件人 SYN

No.     Time           Source                Destination           Protocol Length Delta      Sequence number Acknowledgment number Bytes in flight Calculated window size Info
    814 5.036577000    10.10.0.21            10.11.0.1             TCP      66     0.000000000 0               0                                     64512                  49758→5001 [SYN, ECN, CWR] Seq=0 Win=64512 Len=0 MSS=1460 WS=1 SACK_PERM=1

Frame 814: 66 bytes on wire (528 bits), 66 bytes captured (528 bits) on interface 0
Ethernet II, Src: 00:11:22:33:44:55, Dst: aa:bb:cc:dd:ee:ff
Internet Protocol Version 4, Src: 10.10.0.21 (10.10.0.21), Dst: 10.11.0.1 (10.11.0.1)
Transmission Control Protocol, Src Port: 49758 (49758), Dst Port: 5001 (5001), Seq: 0, Len: 0
    Source Port: 49758 (49758)
    Destination Port: 5001 (5001)
    [Stream index: 73]
    [TCP Segment Len: 0]
    Sequence number: 0    (relative sequence number)
    Acknowledgment number: 0
    Header Length: 32 bytes
    .... 0000 1100 0010 = Flags: 0x0c2 (SYN, ECN, CWR)
    Window size value: 64512
    [Calculated window size: 64512]
    Checksum: 0x1451 [validation disabled]
    Urgent pointer: 0
    Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted
        Maximum segment size: 1460 bytes
        No-Operation (NOP)
        Window scale: 0 (multiply by 1)
            Kind: Window Scale (3)
            Length: 3
            Shift count: 0
            [Multiplier: 1]
        No-Operation (NOP)
        No-Operation (NOP)
        TCP SACK Permitted Option: True

序列图的发送方视角 在此处输入图片描述

在此处输入图片描述

接收方 TCP 设置

PS C:\Users\acs> netsh interface tcp show global
Querying active state...

TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State          : enabled
Chimney Offload State               : disabled
NetDMA State                        : disabled
Direct Cache Access (DCA)           : disabled
Receive Window Auto-Tuning Level    : normal
Add-On Congestion Control Provider  : none
ECN Capability                      : enabled
RFC 1323 Timestamps                 : disabled
Initial RTO                         : 3000
Receive Segment Coalescing State    : enabled

PS C:\Users\acs> netsh interface tcp show heuristics
TCP Window Scaling heuristics Parameters
----------------------------------------------
Window Scaling heuristics         : disabled
Qualifying Destination Threshold  : 3
Profile type unknown              : normal
Profile type public               : normal
Profile type private              : normal
Profile type domain               : normal

PS C:\Users\acs> Get-NetTCPSetting

SettingName                   : Automatic
MinRto(ms)                    : 
InitialCongestionWindow(MSS)  : 
CongestionProvider            : 
CwndRestart                   : 
DelayedAckTimeout(ms)         : 
MemoryPressureProtection      : 
AutoTuningLevelLocal          : 
AutoTuningLevelGroupPolicy    : 
AutoTuningLevelEffective      : 
EcnCapability                 : 
Timestamps                    : 
InitialRto(ms)                : 
ScalingHeuristics             : 
DynamicPortRangeStartPort     : 
DynamicPortRangeNumberOfPorts : 

SettingName                   : Custom
MinRto(ms)                    : 20
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : DCTCP
CwndRestart                   : True
DelayedAckTimeout(ms)         : 10
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Compat
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 2
CongestionProvider            : Default
CwndRestart                   : False
DelayedAckTimeout(ms)         : 200
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Datacenter
MinRto(ms)                    : 20
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : DCTCP
CwndRestart                   : True
DelayedAckTimeout(ms)         : 10
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Internet
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : CTCP
CwndRestart                   : False
DelayedAckTimeout(ms)         : 50
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

接收方 SYN

No.     Time           Source                Destination           Protocol Length Delta      Sequence number Acknowledgment number Bytes in flight Calculated window size Info
    817 5.110501000    10.11.0.1             10.10.0.21            TCP      70     0.073924000 0               1                                     64512                  5001→49758 [SYN, ACK, ECN] Seq=0 Ack=1 Win=64512 Len=0 MSS=1460 WS=1 SACK_PERM=1 [ETHERNET FRAME CHECK SEQUENCE INCORRECT]

Frame 817: 70 bytes on wire (560 bits), 70 bytes captured (560 bits) on interface 0
Ethernet II, Src: aa:bb:cc:dd:ee:ff, Dst: 00:11:22:33:44:55
Internet Protocol Version 4, Src: 10.11.0.1 (10.11.0.1), Dst: 10.10.0.21 (10.10.0.21)
Transmission Control Protocol, Src Port: 5001 (5001), Dst Port: 49758 (49758), Seq: 0, Ack: 1, Len: 0
    Source Port: 5001 (5001)
    Destination Port: 49758 (49758)
    [Stream index: 73]
    [TCP Segment Len: 0]
    Sequence number: 0    (relative sequence number)
    Acknowledgment number: 1    (relative ack number)
    Header Length: 32 bytes
    .... 0000 0101 0010 = Flags: 0x052 (SYN, ACK, ECN)
    Window size value: 64512
    [Calculated window size: 64512]
    Checksum: 0xb5bb [validation disabled]
    Urgent pointer: 0
    Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted
        Maximum segment size: 1460 bytes
        No-Operation (NOP)
        Window scale: 0 (multiply by 1)
            Kind: Window Scale (3)
            Length: 3
            Shift count: 0
            [Multiplier: 1]
        No-Operation (NOP)
        No-Operation (NOP)
        TCP SACK Permitted Option: True
    [SEQ/ACK analysis]

序列图的接收方视角 在此处输入图片描述 在此处输入图片描述

TCP 窗口 在此处输入图片描述

答案1

我认为这是一个特定于驱动程序的问题;在我的案例中,QLogic 网络控制器试图使用 TCPChimney。此链接描述了 Windows 2008 中添加的 TCPChimney 功能 - 但我很确定它仍然适用:https://support.microsoft.com/en-us/kb/951037

我建议按顺序测试以下内容;每次测试后,重新启动并查看接收器是否开始按预期增加 TCP RWIN。

1) 在接收计算机上加载网络适配器驱动程序的最新版本。 1) 在接收计算机上禁用 TCPChimney 2) 禁用所有“TCP 接收”卸载。这可以在网络适配器属性的高级设置中找到(与设置速度和双工的区域相同) 3) 禁用所有“TCP 发送”卸载(也在网络适配器的高级属性中)

(与评论“超过 65k 的大型 TCP 窗口大小对服务器不利,因为这样连接的内存需求就会增加。仅 65k 可能还不足以让您满意。 – user303507 2015 年 8 月 6 日 11:30”,大型 TCP 接收窗口本身对服务器来说并非坏事。在高带宽、高延迟链接(如卫星中继)的情况下,需要较大的 RWIN 值,以便我们有更多的 TCP 数据“在管道中”。想象一个 600 Mbps 的连接,延迟为 3000 毫秒;高带宽链接将限制在大约 20 KBps;因为一次只有 65 KB 的未确认 TCP 数据可以“在管道中”。)

答案2

在我看来这看起来像是 Windows 自动调整错误,也许与此有关?https://support.microsoft.com/en-us/kb/932170

您是否尝试过使用 WskControlSocket 手动请求更大的 SO_RCVBUF 值?

答案3

使用 Cisco WAAS 或 Riverbed 等网络优化器。它们可以快速进行本地应答,因此您无需关心服务器设置。在更大的网络中,您无论如何都无法影响服务器设置,因为这些是其他团队或外包的。

答案4

这是一些信息我发现这可能是你要找的答案。请注意,禁用模式下 64kb 限制的提及可能暗示了未记录的正常模式下的类似限制。

尝试启用“实验”模式来实现天文自动调谐水平。

设置 Windows 自动调节级别时可能的设置如下:

  • normal:默认值,允许接收窗口增大以适应大多数情况
  • 已禁用:对 TCP 接收窗口使用固定值。将其限制为 64KB(限制为 65535)。
  • highlyrestricted:允许接收窗口非常保守地超出其默认值
  • 受限:TCP 接收窗口的增长在一定程度上受到限制,超出了其默认值
  • 实验:允许接收窗口增大以适应极端情况(不推荐,它会降低常见情况下的性能,仅用于研究目的。它使 RWIN 值超过 16 MB)

相关内容