不要使用TCP的KeepAlive功能

TCP的KeepAlive机制用来检测连接是否存活,它并不是TCP协议规范的一部分,但在几乎所有的TCP/IP协议栈中,都实现了KeepAlive功能。
KeepAlive有三个参数:

keepalive_time:探测的超时
keepalive_probes:探测次数
keepalive_intvl:探测间隔

对一个已经建立的tcp连接,如果在keepalive_time时间内双方没有任何的数据包传输,则开启keepalive功能的一端将发送 keepalive数据包,若没有收到应答,则每隔keepalive_intvl时间再发送该数据包,发送keepalive_probes次。一直没有收到应答,则发送rst包关闭连接。若收到应答,则将计时器清零。

但实际发现用处不大,它有几个缺陷:
keepalive只能检测连接是否存活,不能检测连接是否可用。
如果TCP连接中的另一方突然断网,我们并不知道连接断开,此时发送数据失败会进行重传,由于重传包的优先级要高于keepalive的数据包,因此keepalive的数据包无法发送出去。

《TCP/IP详解 卷1:协议》“第21章 TCP的超时与重传”中的例子中:

首次分组传输与复位信号传输之间的时间差约为9分钟,该时间在目前的TCP实现中是不可变的。
对于大多数实现而言,这个总时间是不可调整的。

参考
UNIX网络编程——socket的keep-alive(超时重传)
TCP中已有SO_KEEPALIVE选项,为什么还要在应用层加入心跳包机制??
第21章 TCP的超时与重传

你可能感兴趣的:(基础)