Windows 中已建立连接的 TCP 超时

Alo*_*mer 5 windows tcpip tcp

我有以下情况:

  • 客户端计算机上的应用程序(Firebird DB 客户端)在端口 3050 上打开到服务器的 TCP 连接
  • 客户端应用程序崩溃,应用程序终止
  • 服务器上的 netstat 仍然显示 TCP-connection ESTABLISHED 在端口 3050 上到客户端 IP 地址。
  • 关闭客户端
  • 服务器上的 netstat 仍然显示 TCP-connection ESTABLISHED 在端口 3050 上到客户端 IP 地址。
  • 等了几分钟
  • 服务器上的 netstat 仍然显示 TCP-connection ESTABLISHED 在端口 3050 上到客户端 IP 地址。

Windows 下建立的连接是否有超时(本例中为 Win8.1)?我可以更改此超时吗?

我发现了这个,但这似乎并没有回答我关于已建立连接的问题。

Alo*_*mer 7

默认情况下,已建立的 TCP 连接不会超时(但可能会因为硬件限制而超时)。

应用程序可以使用 TCP keepalive 机制来检查断开的连接。在 Firebird (>1.5) 中启用 TCP keepalive

必须在服务器上设置保活“超时”。Windows 中默认的 TCP keepalive 时间间隔为 2 小时(但建议为 5 分钟)。它可以在HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\KeepAliveTime注册表项中设置。

来自以上链接的更多详细信息:

失败的客户端连接将在以下时间间隔后关闭: KEEPALIVE_TIME+ ( KEEPALIVE_PROBES+1)* KEEPALIVE_INTERVAL

在 Windows 中使用以下相应的注册表值:

KEEPALIVE_TIME = KeepAliveTime (default: 7200 seconds)
KEEPALIVE_INTERVAL = KeepAliveInterval (default: 1 second)
KEEPALIVE_PROBES = TCPMaxDataRetransmissions (default: 5)
Run Code Online (Sandbox Code Playgroud)

但:

默认情况下,每两小时发送一个 keepalive 段 [...]。即使启用,其他上层协议(如 NetBIOS)也会发送自己的 keepalive 值。如果上层协议使用的keepalive 时间间隔小于TCP 的keepalive 时间间隔,则不会发送TCP 的keepalive 值。例如,TCP/IP 上的 NetBIOS 会话每 60 分钟发送一次 NetBIOS keepalive 请求。因此,从不使用为 NetBIOS 会话启用的 TCP keepalive 值。


joe*_*rty 4

TCP 规范没有超时或保活机制。可以设置一些注册表项来配置 TCP keepalive,但使用 keepalive 取决于实际应用程序。请看这个问题的答案:

在 Windows 系统上启用系统范围的 TCP keepalive