第十七章 TCP 保活机制
如本章所述,保存功能存在一定争议性。协议专家仍然在不断争论该功能是否应该属于传输层,还是全部交由应用层处理。现在所有主流 TCP 版本都实现了保活功能。应用层可以选择是否开启这一功能来建立连接。开启保活功能,即使在没有应用层数据传输的情况下,仍能帮助服务器判断没有响应的客户端,也可以帮助客户端保持连接活跃性。

    若某个连接长时间处于空闲状态,在该连接的一端会发送一个探测数据包,从而实现保活功能。可能会发生 4 种不同的情况:另一端仍在工作;另一端崩溃;另一端崩溃并且已经重新启动;另一端当前无法到达。我们分别举了一个例子来观察这四种情况。

    在前两个例子中,如果没有使用保活功能,而且也没有应用层的计时器或者计时器未被激活,那么 TCP 将不会知道另一端已经崩溃。在最后一个例子中,连接的两端都没有出现差错,而连接最终却被断开了。在使用保活功能的时候,我们必须意识到这一功能的限制,并且考虑这种处理方式是否是我们所期望的。

    针对保活机制的攻击主要包括两种:一种是使系统长时间地维护不必要的会话资源,另一种是获得端系统隐藏的一些信息。此外,由于默认情况下 TCP 不会对保活报文进行加密,所以保活探测报文和确认报文都有可能被利用。然而,对于应用层的保活机制,这些报文都会被加密,所以也就不会出现上述情况。