![接收方将 TCP 窗口大小限制为 64,512](https://linux22.com/image/660210/%E6%8E%A5%E6%94%B6%E6%96%B9%E5%B0%86%20TCP%20%E7%AA%97%E5%8F%A3%E5%A4%A7%E5%B0%8F%E9%99%90%E5%88%B6%E4%B8%BA%2064%2C512.png)
事实(请指出任何虚假陈述):
我在两个相隔 80 毫秒的站点之间建立了 100 Mbps 的连接
这是一个长连接,较大的 TCP 窗口大小可能对其有益,最大可达 100 Mbps * 0.08 秒 = 1,000,000 字节
两台机器都运行 Windows Server 2012。“接收窗口自动调整级别”在两台机器上都正常。“窗口缩放启发式”在两台机器上都已禁用。
我在一侧运行“iperf -s”,在另一侧运行“iperf -c”。传输速度为 5 Mbps。在另一个方向上也得到相同的结果。
双方均在其 SYN 中宣称支持 TCP 滑动窗口。
接收方在整个运行过程中请求 TCP 窗口大小为 64,512 字节 (0xFC00),且 TCP 窗口比例值为“无移位”(0x000)。
网络能够处理更大的窗口大小(参见下面的序列图)
接收方保持窗口小于网络支持的窗口
此连接发生在 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)