Windows – Enabling system wide TCP keepalives on a Windows system

keepalivetcpwindowswindows-registry

Can I change/add the KeepAliveTime and related registry variables to make a Windows machine send TCP keepalive packets on an idle connection?

I want to know if anyone has successfully got this working. Specifically, when the application idling on the TCP connection is doing nothing particular (setsockopt) to keepalive the connection.

This Microsoft TechNet details on Configuring system wide Keep-Alives with the KeepAliveTime and related registry variables.

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\KeepAliveTime

It seems like the Linux system wide configuration for using keep-alive.
But, that requires programs to use the setsockopt() and request keep-alive (right?).

Remember that keepalive support, even if configured in the kernel, is not the default behavior in Linux. Programs must request keepalive control for their sockets using the setsockopt interface. There are relatively few programs implementing keepalive…

Best Answer

Your assessment of the TCP keepalive functionality in Windows being like Linux is correct.

You can manipulate the registry parameters related to TCP keepalives all you want, but unless the application uses setsockopt() to request keepalives none will be sent by default.

If you want to actually see keepalives in action on Windows and don't want to write code, tick the "Enable TCP keepalives (SO_KEEPALIVE)" in the "Connection" properties in the PuTTY SSH/TELNET/etc client, initiate a connection, allow it to sit idle, and sniff the traffic. (It's the first app I could think of that I knew could be consciouly configured to use SO_KEEPALIVE...)