Windows-Specific Host Tuning

Next Generation TCP/IP Stack in Windows Vista / Windows Server 2008 / Windows 7

According to http://www.microsoft.com/technet/community/columns/cableguy/cg0905.mspx, the new version of Windows, Vista, features a redesigned TCP/IP stack. Besides unifying IPv4/IPv6 dual-stack support, this new stack also claims much-improved performance for high-speed and asymmetric networks, as well as several auto-tuning features.

The Microsoft Windows Vista Operating System enables the TCP Window Scaling option by default (previous Windows OSes had this option disabled). This causes problems with various middleboxes, see WindowScalingProblems. As a consequence, the scaling factor is limited to 2 for HTTP traffic in Vista.

Another new feature of Vista is Compound TCP, a high-performance TCP variant that uses delay information to adapt its transmission rate (in addition to loss information). On Windows Server 2008 it is enabled by default, but it is disabled in Vista. You can enable it in Vista by running the following command as an Administrator on the command line.

netsh interface tcp set global congestionprovider=ctcp

(see CompoundTCP for more information).

Although the new TCP/IP-Stack has integrated auto-tuning for receive buffers, the TCP send buffer still seems to be limited to 16KB by default.
This means you will not be able to get good upload rates for connections with higher RTTs.
However, using the registry hack (see further below) you can manually change the default value to something higher.

Performance tuning for earlier Windows versions

Enabling TCP Window Scaling

The references below detail the various "whys" and "hows" to tune Windows network performance. Of particular note however is the setting of scalable TCP receive windows (see LargeTcpWindows).

It appears that, by default, not only does Windows not support TCP 1323 scalable windows, but the required key is not even in the Windows registry. The key (Tcp1323Opts) can be added to one of two places, depending on the particular system:

{{\[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTCP\]}}  \(Windows'95\) 

{{\[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters\]}}  \(Windows 2000/XP\)

Value Name: Tcp1323Opts

Data Type: REG_DWORD (DWORD Value)

Value Data: 0, 1, 2 or 3

This can also be adjusted using DrTCP GUI tool (see link below)

TCP Buffer Sizes

See the EndSystemTcpBufferSizing topic for general information about sizing TCP buffers.

Buffers for TCP Send Windows

Inquiry at Microsoft (thanks to Larry Dunn) has revealed that the default send window is 8KB and that there is no official support for configuring a system-wide default. However, the current Winsock implementation uses the following undocumented registry key for this purpose

{{\[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\AFD\Parameters\]}} 

Value Name: DefaultSendWindow

Data Type: REG_DWORD (DWORD Value)

Value Data: The window size in bytes. The maximum value is unknown.

According to Microsoft, this parameter may not be supported in future Winsock releases. However, this parameter is confirmed to be working with Windows XP, Windows 2000, Windows Vista and even the Windows 7 Beta 1.

This value needs to be manually adjusted (e.g., DrTCP can't do it), or the application needs to set it (e.g., iperf with '-l' option).
It may be difficult to detect this as a bottleneck because the host will advertise large windows but will only have about 8.5KB of data in flight.

Buffers for TCP Receive Windows

(From this !TechNet article

Assuming Window Scaling is enabled, then the following parameter can be set to between 1 and 1073741823 bytes

{{\[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters\TcpWindowSize\]}} 

Value Name: TcpWindowSize

Data Type: REG_DWORD (DWORD Value)

Value Data: The window size in bytes. 1 to 65535 (or 1 to 1073741823 if Window scaling set).

DrTCP can also be used to adjust this parameter.

Windows XP SP2/SP3 simultaneous connection limit

Windows XP SP2 and SP3 limits the number of simultaneous TCP connection attempts (so called half-open state) to 10 (by default).
How exactly it's doing this is not clear, but this may come up with some kind of applications. Especially file sharing applications like bittorrent might suffer from this behaviour.
You can see yourself if your performance is affected by looking into your event logs:

EventID 4226: TCP/IP has reached the security limit imposed on the number of concurrent TCP connect attempts

A patcher has been developed to adjust this limit.

References

– Main.TobyRodwell - 28 Feb 2005 (initial version)

-- Main.SimonLeinen - 06 Apr 2005 (removed dead pointers; added new ones; descriptions)

-- Main.AlexGall - 17 Jun 2005 (added send window information)

-- Main.HankNussbacher - 19 Jun 2005 (added new MS webcast for 2003 Server)

-- Main.SimonLeinen - 12 Sep 2005 (added information and pointer about new TCP/IP in Vista)

-- Main.HankNussbacher - 22 Oct 2006 (added Cisco IOS firewall upgrade)

-- Main.AlexGall - 31 Aug 2007 (replaced IOS issue with a link to WindowScalingProblems, added info for scaling limitation in Vista)

-- Main.SimonLeinen - 04 Nov 2007 (information on how to enable Compound TCP on Vista)

-- Main.PekkaSavola - 05 Jun 2008 major reorganization to improve the clarity wrt send buffer adjustment, add a link to DrTCP; add XP SP3 connection limiting discussion
-- Main.ChrisWelti - 02 Feb 2009 added new information regarding the send window in windows vista / server 2008 / 7