关于tcp:TCP-keepalive-概述译

37次阅读

共计 1657 个字符,预计需要花费 5 分钟才能阅读完成。

什么是 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

正文完
 0