TCP的保活定时器

保活功能主要是为服务器提供的,服务器可能会代表客户绑定一些资源,希望知道客户主机是否崩溃。

如果一个给定的连接在2个小时之内没有任何动作,则服务器就向客户发送一个探查报文段:

  • 对端仍然运行正常
    客户主机依然正常运行,并且服务器可达。则客户的TCP响应正常,而服务器也知道对方是正常工作的,则服务器在2小时内以后将保活定时器复位。在这2小时以内,如果有数据流交换,则在交换数据后的未来2小时再复位。

  • 对端已经崩溃
    客户主机已经崩溃,并且关闭或者正在重新启动。在任何情况下,客户的TCP都没有响应。服务器不能够收到对探查的响应,并在75秒后超时(服务器总共发送10个这样的探查,每个间隔75秒)。如果服务器没有收到一个响应,则认为客户主机已经关闭并会终止这个连接。

  • 对端已经崩溃并重新启动
    客户主机崩溃并已经重新启动。这时服务器将收到一个对其保活探查的响应,然而这个响应是一个复位,使得服务器终止这个连接。

  • 对端当前无法到达
    客户主机正常运行,但是服务器不可达。

但是日常更多的是在应用层加入心跳包机制
因为TCP的这个保活机制由几个缺陷:

  • keepalive只能检测连接是否存活,不能检测连接是否可用。比如服务器因为负载过高导致无法响应请求但是连接仍然存在,此时keepalive无法判断连接是否可用。
  • 如果TCP连接中的另一方因为停电突然断网,我们并不知道连接断开,此时发送数据失败会进行重传,由于重传包的优先级要高于keepalive的数据包,因此keepalive的数据包无法发送出去。只有在长时间的重传失败之后我们才能判断此连接断开了。

你可能感兴趣的:(TCP的保活定时器)