TCP保活定时器
TCP有Keepalive功能,它和HTTP的Keepalive功能目的不一样。TCP服务器希望知道客户端是否崩溃、重新启动或者中间路由不通。保活定时器就提供这种功能。
在进一步介绍TCP的保活定时器前,先了解一个概念:长连接和短连接。(TCP是长连接)
长连接:建立一个连接,多个请求复用这个连接,最后再关闭连接。
短连接:建立一个连接,传输一个请求,然后关闭连接。
当服务器发送探测报文时,客户端可能处于4种不同的情况:仍然正常运行、已经崩溃、已经崩溃并重启了、
由于中间链路问题不可达。在不同的情况下,服务器会得到不一样的反馈。
(1) 客户主机依然正常运行,并且从服务器端可达
客户端的TCP响应正常,从而服务器端知道对方是正常的。保活定时器会在两小时(7200s)以后继续触发。
(2) 客户主机已经崩溃,并且关闭或者正在重新启动
客户端的TCP没有响应,服务器没有收到对探测包的响应,此后每隔75s发送探测报文,一共发送9次。
socket函数会返回-1,errno设置为ETIMEDOUT,表示连接超时。
(3) 客户主机已经崩溃,并且重新启动了
客户端的TCP发送RST,服务器端收到后关闭此连接。
socket函数会返回-1,errno设置为ECONNRESET,表示连接被对端复位了。
(4) 客户主机依然正常运行,但是从服务器不可达
双方的反应和第二种是一样的,因为服务器不能区分对端异常与中间链路异常。
socket函数会返回-1,errno设置为EHOSTUNREACH,表示对端不可达。
在连接空闲两小时后,在一个连接上主动发送一个探查分组来完成保活功。主要是为服务器应用程序提供的。
保活定时器默认设置是每隔两小时发送一次报文,每次重发10次,每次75秒超时。
天行健,君子当自强不息