考虑存在一个服务器和多个客户端的场景。每个客户端都会创建 TCP 连接以与服务器交互。TCP活着有三种用法:
TCP keepalive 的上述哪些用法是典型的?
服务器端keepalive:服务器发送TCP keepalive以确保客户端处于活动状态。如果客户端死亡,服务器将关闭与客户端的 TCP 连接。
如果客户端死机,服务器会收到“连接重置”错误,之后应关闭连接。
客户端keepalive:客户端发送TCP keepalive以防止服务器关闭与客户端的TCP连接。
不可以。客户端发送 keepalive 以便如果服务器挂掉,客户端将收到“连接重置”错误,之后应关闭连接。
双方保活
如上所述,双方都能够由于保活失败而获得“连接重置”。
上述哪些用法是典型的?
其中任何一个,或者没有。如果对等点定期发送,那么它实际上也不需要保持连接。因此,它通常对服务器比对客户端更有用。
实际上,服务器端和客户端端都可以使用 TCP keepalive。确保操作系统最终会释放与死连接相关的任何资源是很有用的。请注意,如果两台主机之间的连接由于它们之间的路由器问题而丢失,则两台主机必须独立检测连接已断开,并自行清理。
现在,每个主机将在每个连接上维护一个计时器,指示它上次收到与该连接关联的数据包的时间。当该计时器超过本地定义的某个阈值时,主机将发送一个保活数据包(即主机不交换有关其自身保活配置的信息)。所以保活时间最短的任一主机都会主动向另一台主机发送保活数据包。如果数据包确实通过了,另一台主机(即保持连接时间较长的主机)将响应该数据包并重置自己的计时器;因此,保活时间较长的主机肯定永远不会达到自己发送保活数据包的需要,除非连接确实已丢失。
可以说,服务器在 keepalive 上通常比客户端机器更积极(也就是说,它们经常被配置为具有更低的 keepalive 时间),因为挂起连接通常会对服务器软件产生不良影响(例如,软件可能会接受有限数量的并发连接,或者服务器可能会 fork 一个与每个连接相关联的新流程实例)。