什么是 TCP keepalive
TCP keepalive 概念很简略:当建设一个 TCP 连贯时,会设置了一系列与该连贯相干的定时器。其中有些定时器跟解决 keepalive 相干,在 keepalive 定时器倒计时变为零时,会给连贯的另一方发送一个 keepalive 探针包(probe packet),包内没有数据且设置了 ACK 标识。
如果收到一个 keepalive 探针包的响应,阐明连贯是失常和无效的。TCP 能够解决只有协定头,但理论数据长度为零的数据包。这种机制是有用的,如果其余主机断开了连贯,你能够及时留神到连贯的断开。
如果 keepalive 探针没有响应,那么能够认为连贯不是无效的,进而能够采取正确的操作。
TCP keepalive 的利用场景
KeepAlive 是非侵入性的,大多数状况下开启 keepalive 不会有其余危险。须要留神的是,这样做会带来额定的网络开销,例如会影响到路由器和防火墙。
- 检测理论断掉的连贯
- 维持客户端与 NAT 间的沉闷网络包
检测理论断掉的连贯
构想 A、B 两端建有 TCP 连贯:最开始是三次握手,A 发送 SYN 报文段给 B,B 响应 SYN/ACK 给 A,最初 A 发送 ACK 给 B。当初两端处于 established 状态,都在期待对方发送数据。如果此时 B 电源被拔掉,在没有发送任何数据的告诉 A 的状况下,B 曾经断开了连贯。A 曾经做好了筹备接收数据,但不晓得 B 曾经宕机。之后 B 复原供电并且零碎重启,A 认为跟 B 的连贯还是失常的。此时 A 试图给 B 发送数据,B 会回复 RST 包,这样 A 才敞开这个连贯。
Keepalive 机制能够让 A 端避免出现上述的状况。实际上,如果连贯单方有网络问题,keepalive 通过定时发送 keepalive 曾经及时感知到连贯断开。
_____ _____
| | | |
| A | | B |
|_____| |_____|
^ ^
|--->--->--->-------------- SYN -------------->--->--->---|
|---<---<---<------------ SYN/ACK ------------<---<---<---|
|--->--->--->-------------- ACK -------------->--->--->---|
| |
| system crash ---> X
|
| system restart ---> ^
| |
|--->--->--->-------------- PSH -------------->--->--->---|
|---<---<---<-------------- RST --------------<---<---<---|
| |
维持客户端与 NAT 间的沉闷网络包
keepalive 另一个用处是阻止因网络连接不沉闷(长时间没有数据包)而导致的连贯断开。
很多网络设备,尤其是 NAT 路由器,因为其硬件的限度(例如内存、CPU 解决能力),无奈放弃其上的所有连贯,因而在必要的时候会在连接池中抉择一些不沉闷的连贯踢掉。典型做法是 LRU,把最久没有数据的连贯给踢掉。通过应用 TCP KeepAlive 机制,能够让连贯每隔一小段时间就产生一些 ACK 包,以升高被踢掉的危险,当然,这样的代价是额定的网络和 CPU 累赘。
_____ _____ _____
| | | | | |
| A | | NAT | | B |
|_____| |_____| |_____|
^ ^ ^
|--->--->--->---|----------- SYN ------------->--->--->---|
|---<---<---<---|--------- SYN/ACK -----------<---<---<---|
|--->--->--->---|----------- ACK ------------->--->--->---|
| | |
| | <--- connection deleted from table |
| | |
|--->- PSH ->---| <--- invalid connection |
| | |
HTTP Keep-Alive 是什么?如何工作?
TCP-Keepalive