TCP Keepalive 笔记

来源:互联网 发布:单片机哪种好 编辑:程序博客网 时间:2024/04/25 22:16

TCP Keepalive 笔记

TCP Keep-Alive

参考资料

  • TCP-Keepalive-HOWTO

如果 keepalive 的探测返回一个错误,将会向上反映到应用中(例如read()返回错误),事实上本功能应该被称为“切断”(mark-dead)而不是“保持存活”,因为keepalive的作用正是为了发现那些不可用的连接并关闭它。

场景

  • 对端可达并且应用存活

    对端的TCP响应本次探测,本机的TCP将重制keepalive的超时时间(默认为两小时),如果期间有应用数据传输,则重置超时计时器

  • 对端不可达

    一段时间内(默认75秒)收不到对端响应,重发探测包,如果多次重发(默认情况下重发8次)仍然收不到响应,则返回应用错误信息, 如果没有收到任何响应,则返回应用错误ETIMEOUT,如果收到ICMP错误,则返回相应的错误信息,例如"host unreachable"的ICMP信息会导致应用收到错误 EHOSTUNREACH

  • 对端可达但应用已经退出

    对端返回RST,返回应用错误信息 ECONNRESET

设置

TCP keep-alive 特性通过socket的 SO_KEEPALIVE 选项设置,默认情况下该特性是关闭的。 通过 /proc 文件系统可以调整keepalive的几个参数

  • /proc/sys/net/ipv4/tcp_keepalive_time 超时时间, 默认7200秒
  • /proc/sys/net/ipv4/tcp_keepalive_intvl 探测间隔, 默认75秒
  • /proc/sys/net/ipv4/tcp_keepalive_probes 探测次数, 默认 9

因此 tcp_keepalive_intvl * tcp_keepalive_probes 决定了在探测开始后多长时间内没有收到响应会导致连接超时错误,默认情况下为 75 * 9 = 11分15秒.

以上的设置方法是全局生效的,即调整后影响到整个系统的所有开启了keepalive选项的TCP连接,自linux 2.4的内核开始,这些选项可以被单独指定到各个socket上, 方法也是通过setsockopt()函数,通过 IPPROTO_TCP level 的以下几个参数来设置(详见 man tcp):

  • TCP_KEEPIDLE 超时时间,即对一个连接进行有效性探测之前运行的最大非活跃时间间隔
  • TCP_KEEPCNT 探测次数
  • TCP_KEEPINTVL 探测间隔
This entry was posted in Linux/