TCP keepalive的典型用途是什么?

12
考虑这样的情况,存在一个服务器和多个客户端。每个客户端都创建TCP连接与服务器互动。TCP keepalive有三种用途:
  1. 服务器端keepalive: 服务器发送TCP keepalive以确保客户端存活。如果客户端死亡,服务器将关闭与客户端的TCP连接。
  2. 客户端keepalive: 客户端发送TCP keepalive以防止服务器关闭与客户端的TCP连接。
  3. 双向keepalive: 服务器和客户端发送TCP keepalive,如1和2所述。
上述TCP keepalive的哪些用途是典型的?
2个回答

14

实际上,服务器和客户端对等方都可以使用TCP keepalive。这对于确保操作系统最终释放与死亡连接相关联的任何资源非常有用。请注意,如果由于两者之间路由器出现问题而导致两个主机之间的连接丢失,则两个主机必须独立检测到连接已死亡,并清理自己。

现在,每个主机将在每个连接上维护一个计时器,指示其上次接收与该连接相关联的数据包的时间。当计时器超过本地定义的特定阈值时,主机将发送keepalive数据包,这是有用的(也就是说,主机不会交换关于它们自己的keepalive配置信息)。因此,其中一个具有最低keepalive时间的主机将采取主动措施向另一个主机发送keepalive数据包。如果数据包成功通过,则另一个主机(即具有更高keepalive时间的主机)将响应该数据包并重置其自己的计时器;因此,除非连接确实丢失,否则具有更高keepalive时间的主机肯定永远不会达到需要自己发送keepalive数据包的需求。

可以说,服务器在保持连接方面通常比客户端机器更具侵略性(也就是说,它们更经常地配置较短的 keepalive 时间),因为挂起的连接通常会对服务器软件产生不良影响(例如,该软件可能只接受有限数量的并发连接,或者服务器可能为每个连接派生一个新的进程实例)。


6
服务器端保持活动状态:服务器发送TCP keepalive以确保客户端仍然活着。如果客户端死亡,服务器将关闭与其之间的TCP连接。
如果客户端死亡,服务器会得到“连接重置”错误,此后它应该关闭连接。
客户端保持活动状态:客户端发送TCP keepalive以防止服务器关闭与其之间的TCP连接。
不是的。客户端发送keepalive是为了防止服务器死亡,如果服务器死亡,客户端将得到“连接重置”错误,此后它应该关闭连接。
双方都保持活动状态
双方都有可能由于keepalive失败而得到“连接重置”,如上所述。
以上哪种用法比较典型?
任何一种或者都不是。如果一个对等方定期发送,则它实际上不需要keepalive。因此,它通常对服务器比对客户端更有用。

通过说“因此,它对服务器比客户端更有用”,@EJB是指服务器发送keepalive的使用更典型吗? - Jingguo Yao
我不知道你如何衡量它,但这似乎很有可能。例如,Telnet服务器使用它是标准做法。 - user207421
1
客户端保持连接:客户端发送TCP keepalive以防止服务器关闭与客户端的TCP连接是不正确的,但如果存在带有空闲超时连接的防火墙,则keepalive可以防止连接老化,如果客户端发送的keepalive数据包在防火墙空闲超时之前发送。请查看链接https://www.veritas.com/support/en_US/article.100028680中的解决方案部分。 - Invictus
@Invictus 客户端保持连接(keepalive)的工作方式与服务器保持连接完全相同,具体而言,它根本不可能阻止服务器应用程序执行任何操作,因为服务器应用程序甚至看不到它。因此,它不能防止服务器中空闲套接字超时。只有防火墙可以达到该效果。 - user207421
@Invictus,你提供的链接中并没有关于“防止服务器关闭TCP连接”的内容。它只是关于防止中间设备(如路由器)丢弃连接的内容。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接