










从概念上讲,涉及两个层面:
虽然它们都叫 "Keep-Alive",但工作方式和目的略有不同。在您遇到的场景中,两者共同作用来解决问题。
首先,我们谈谈在 IIS 中配置的 HTTP Keep-Alive。
HTTP Keep-Alive 在 HTTP 协议中,是以 HTTP 请求头 (Request Header) 或者响应头 (Response Header) 的形式出现的,由 HTTP 协议层处理。
目的: 它的主要目的是性能优化。在早期的 HTTP/1.0 中,浏览器每请求一个资源(如一个 HTML 文件、一张图片、一个 CSS 文件),都需要建立一个新的 TCP 连接。完成请求后,连接就关闭。建立 TCP 连接(需要三次握手)和关闭它(需要四次挥手)本身是有开销的。如果一个网页包含几十个资源,这种开銷会非常大,导致页面加载缓慢。
工作方式: HTTP Keep-Alive (在 HTTP/1.1 中成为默认行为,也称为持久连接 Persistent Connection) 允许多个连续的 HTTP 请求和响应重用同一个 TCP 连接。
关键点: HTTP Keep-Alive 本身不会主动发送“保活”数据包。它只是一个约定,告诉服务器:“嘿,处理完这个请求后别挂断,我可能还有事找你。” 连接的“保活”实际上是由更底层的机制来处理的。
现在我们来看看真正发送“保活”数据包的机制——TCP Keepalive。这是在操作系统内核的 TCP/IP 协议栈层面实现的。
目的: 它的主要目的是检测“僵死”连接并维持有效连接。想象一下,客户端和服务器建立了一个 TCP 连接,但之后客户端突然断电或网络断开。服务器不知道对方已经“死亡”,它的 TCP 连接会一直处于 ESTABLISHED (已建立) 状态,白白占用系统资源。TCP Keepalive 就是为了解决这个问题。
工作方式:
它会真正在物理层面产生网络流量。
这里详细介绍如何配置 HTTP Keep Alive
HTTP Response Headers,双击打开它。
HTTP Response Headers 中,
Set Common Headers...Set Common Headers...
Set Common HTTP Response Headers 对话框中,选择 Enable HTTP keep-alive,然后点击确认。
See:
它涉及到 Winodws 如何检测网络另一端是否还在存活中 keep-alive ,名字看起来一样,作用并不相同。
这需要修改 Windows 注册表来完成,它涉及到 3 个注册表配置
Windows Server 2008 和 Windows Vista 的 TCP/IP 协议的 TCP keepalive 功能默认处于禁用状态。
如果通过 Windows 套接字函数 setsockopt 启用此功能,则默认情况下会每两小时发送一次 keepalive 数据包,具体频率由注册表值 KeepAliveTime 控制。
即使启用了此功能,其他上层协议(例如 NetBIOS)也会发送自己的 keepalive 值。如果上层协议使用的 keepalive 间隔小于 TCP keepalive 间隔,则不会发送 TCP keepalive 值。例如,通过 TCP/IP 连接的 NetBIOS 会话每 60 分钟发送一次 NetBIOS keepalive 请求。因此,为 NetBIOS 会话启用的 TCP keepalive 值永远不会被使用。
此条目在本地组策略编辑器中显示为 MSS: (KeepAliveTime),表示 keepalive 数据包的发送频率(以毫秒为单位,建议设置为 300,000),并存储在注册表项 HKLM\System\CurrentControlSet\Services|Tcpip\Parameters\KeepAliveTime 中。此设置控制 TCP 发送保持连接数据包的频率,以验证空闲连接是否仍然有效。如果远程计算机仍然可达,它会确认收到保持连接数据包。
可能的值:
| 注册表中的值 | Corresponding Local Group Policy Editor option |
|---|---|
| 150000 | 150000 or 2.5 minutes |
| 300000 | 300000 or 5 minutes (recommended) |
| 600000 | 600000 or 10 minutes |
| 1200000 | 1200000 or 20 minutes |
| 2400000 | 2400000 or 40 minutes |
| 3600000 | 3600000 or 1 hour |
| 7200000 | 7200000 or 2 hours (default value) |
| Not Defined |
您可以在注册表中指定 1 到 0xFFFFFFFF 之间的值。本地组策略编辑器 UI 和上表中列出的值旨在帮助您选择最合适的保持连接时间。默认配置为 7,200,000(两小时)。
能够连接到网络应用程序的攻击者可以建立大量连接,试图发起拒绝服务 (DoS) 攻击。
| Registry entry | Format | Windows Vista® and Windows Server® 2008 default setting | Recommended setting |
|---|---|---|---|
| DisableIPSourceRouting | DWORD | 1 for IPv4, 0 for IPv6 | 2 |
| KeepAliveTime | DWORD | 7,200,000 (time in milliseconds), 2 个小时 | 300,000 (time in milliseconds) 5 分钟 |
| PerformRouterDiscovery | DWORD | 2 | 0 |
| TcpMaxDataRetransmissions | DWORD | 5 | 3 |
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
KeepAliveTime。

KeepAliveInterval,设置为 1000 (1秒),这是探测失败后的重试间隔。完成以上操作后,您的服务器就会在 TCP 连接空闲 3 分钟后,自动发送一个 TCP Keepalive 探测包。这个包会穿过 LB,重置 LB 的空闲计时器,从而完美地解决了连接被意外断开的问题。
将 KeepAliveTime 的默认值设置为 2 小时 (7,200,000 毫秒) 主要是出于以下几点考虑:
如果将 KeepAliveTime 设置为 3 分钟会有什么影响?
将 KeepAliveTime 从 2 小时缩短到 3 分钟(180,000 毫秒)是一个常见的优化实践,特别是在有状态防火墙或负载均衡器(Load Balancer)等中间设备存在的情况下。这些设备通常有较短的空闲连接超时时间(例如 5-15 分钟)。
主要正面影响:
潜在的负面影响(通常很小):
对于您的场景——防止负载均衡器中断长时间运行的报表连接——将 KeepAliveTime 调整为一个比负载均衡器超时时间更短的值(例如 3 分钟)是完全正确且推荐的做法。
这种调整的负面影响在现代服务器和网络环境中通常可以忽略不计,而它带来的好处(维持长连接的稳定性)则是实实在在的。这是一种用极小的资源开销换取关键业务连接稳定性的有效策略。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。