我是靠谱客的博主 风中黄蜂,最近开发中收集的这篇文章主要介绍不要使用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的超时与重传

最后

以上就是风中黄蜂为你收集整理的不要使用TCP的KeepAlive功能的全部内容,希望文章能够帮你解决不要使用TCP的KeepAlive功能所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部