问一个关于心跳包的小问题?

时间:2022-02-03 21:49:55
请教大家两个问题,
第一,我们为什么需要心跳包,一个tcp连接的一方意外断开时,另一端不会recv到一个socket_error吗?
为什么需要心跳包来一直不停的检测呢?
第二,SO_KEEPALIVE选项是否可以理解为内核帮我们做的一种心跳包机制?

11 个解决方案

#1


1 链路双方间隔一段时间,通过心跳激活包,来确定双方还是 live 活的,以便可以随时通信。

#2


请教大家两个问题,
第一,我们为什么需要心跳包,一个tcp连接的一方意外断开时,另一端不会recv到一个socket_error吗?
为什么需要心跳包来一直不停的检测呢?

心跳包保证你知道对方网络状态是良好的

第二,SO_KEEPALIVE选项是否可以理解为内核帮我们做的一种心跳包机制?

SO_KEEPALIVE有诊断意思,说心跳似乎也不是.

#3


心跳用来检测对方的活动性
一般的网络错误,TCP/IP协议可以检测出来,但是一些特殊情况,比如拔掉网线,机器宕机,中间路由停机等情况,协议是检测不出来的,所以必须要通过心跳来检测。
SO_KEEPALIVE选项是TCP用来检测对方活性的方法,但是这个检测的时间太长,一般是两个小时以上才开始激活这个选项,你如果能接受的话,就用这个也没啥问题

#4


引用 3 楼 shenyi0106 的回复:
心跳用来检测对方的活动性
一般的网络错误,TCP/IP协议可以检测出来,但是一些特殊情况,比如拔掉网线,机器宕机,中间路由停机等情况,协议是检测不出来的,所以必须要通过心跳来检测。
SO_KEEPALIVE选项是TCP用来检测对方活性的方法,但是这个检测的时间太长,一般是两个小时以上才开始激活这个选项,你如果能接受的话,就用这个也没啥问题
问一个关于心跳包的小问题?

#5


SO_KEEPALIVE选项的确时效性不行。。。。。。。。时间太长了

#6


引用 3 楼 shenyi0106 的回复:
心跳用来检测对方的活动性
一般的网络错误,TCP/IP协议可以检测出来,但是一些特殊情况,比如拔掉网线,机器宕机,中间路由停机等情况,协议是检测不出来的,所以必须要通过心跳来检测。
SO_KEEPALIVE选项是TCP用来检测对方活性的方法,但是这个检测的时间太长,一般是两个小时以上才开始激活这个选项,你如果能接受的话,就用这个也没啥问题

解释的不错~

#7


该回复于2011-03-14 13:34:23被版主删除

#8


楼上说的很好,不过我说说我理解,心跳包是应用层协议,一旦网络错误,可以检测出来,而SO_KEEPALIVE选项的这套机制是操作系统底层使用的被动机制,原理上不推荐我们在上层应用层去使用它,当系统关闭一个由KEEPALIVE机制检查出来的死连接时,是不会主动去通知上层如应用层的,只有调用相应的IO操作的返回值中检查出来。所以还是得在应用层自己定义心跳包,占用资源少,清除死连接作用很大。

#9


引用楼主 wjb_yd 的回复:
请教大家两个问题,
第一,我们为什么需要心跳包,一个tcp连接的一方意外断开时,另一端不会recv到一个socket_error吗?
为什么需要心跳包来一直不停的检测呢?
第二,SO_KEEPALIVE选项是否可以理解为内核帮我们做的一种心跳包机制?


一.确实不会,以外断开如:拔网线,直接断电,中间路由器损坏

二.是的,正常2小时触发一次

看下文章:
http://blog.csdn.net/jwybobo2007/archive/2011/01/25/6162784.aspx

#10


该回复于2011-03-15 08:43:44被版主删除

#11


引用 3 楼 shenyi0106 的回复:
心跳用来检测对方的活动性
一般的网络错误,TCP/IP协议可以检测出来,但是一些特殊情况,比如拔掉网线,机器宕机,中间路由停机等情况,协议是检测不出来的,所以必须要通过心跳来检测。
SO_KEEPALIVE选项是TCP用来检测对方活性的方法,但是这个检测的时间太长,一般是两个小时以上才开始激活这个选项,你如果能接受的话,就用这个也没啥问题


我无话可说

#1


1 链路双方间隔一段时间,通过心跳激活包,来确定双方还是 live 活的,以便可以随时通信。

#2


请教大家两个问题,
第一,我们为什么需要心跳包,一个tcp连接的一方意外断开时,另一端不会recv到一个socket_error吗?
为什么需要心跳包来一直不停的检测呢?

心跳包保证你知道对方网络状态是良好的

第二,SO_KEEPALIVE选项是否可以理解为内核帮我们做的一种心跳包机制?

SO_KEEPALIVE有诊断意思,说心跳似乎也不是.

#3


心跳用来检测对方的活动性
一般的网络错误,TCP/IP协议可以检测出来,但是一些特殊情况,比如拔掉网线,机器宕机,中间路由停机等情况,协议是检测不出来的,所以必须要通过心跳来检测。
SO_KEEPALIVE选项是TCP用来检测对方活性的方法,但是这个检测的时间太长,一般是两个小时以上才开始激活这个选项,你如果能接受的话,就用这个也没啥问题

#4


引用 3 楼 shenyi0106 的回复:
心跳用来检测对方的活动性
一般的网络错误,TCP/IP协议可以检测出来,但是一些特殊情况,比如拔掉网线,机器宕机,中间路由停机等情况,协议是检测不出来的,所以必须要通过心跳来检测。
SO_KEEPALIVE选项是TCP用来检测对方活性的方法,但是这个检测的时间太长,一般是两个小时以上才开始激活这个选项,你如果能接受的话,就用这个也没啥问题
问一个关于心跳包的小问题?

#5


SO_KEEPALIVE选项的确时效性不行。。。。。。。。时间太长了

#6


引用 3 楼 shenyi0106 的回复:
心跳用来检测对方的活动性
一般的网络错误,TCP/IP协议可以检测出来,但是一些特殊情况,比如拔掉网线,机器宕机,中间路由停机等情况,协议是检测不出来的,所以必须要通过心跳来检测。
SO_KEEPALIVE选项是TCP用来检测对方活性的方法,但是这个检测的时间太长,一般是两个小时以上才开始激活这个选项,你如果能接受的话,就用这个也没啥问题

解释的不错~

#7


该回复于2011-03-14 13:34:23被版主删除

#8


楼上说的很好,不过我说说我理解,心跳包是应用层协议,一旦网络错误,可以检测出来,而SO_KEEPALIVE选项的这套机制是操作系统底层使用的被动机制,原理上不推荐我们在上层应用层去使用它,当系统关闭一个由KEEPALIVE机制检查出来的死连接时,是不会主动去通知上层如应用层的,只有调用相应的IO操作的返回值中检查出来。所以还是得在应用层自己定义心跳包,占用资源少,清除死连接作用很大。

#9


引用楼主 wjb_yd 的回复:
请教大家两个问题,
第一,我们为什么需要心跳包,一个tcp连接的一方意外断开时,另一端不会recv到一个socket_error吗?
为什么需要心跳包来一直不停的检测呢?
第二,SO_KEEPALIVE选项是否可以理解为内核帮我们做的一种心跳包机制?


一.确实不会,以外断开如:拔网线,直接断电,中间路由器损坏

二.是的,正常2小时触发一次

看下文章:
http://blog.csdn.net/jwybobo2007/archive/2011/01/25/6162784.aspx

#10


该回复于2011-03-15 08:43:44被版主删除

#11


引用 3 楼 shenyi0106 的回复:
心跳用来检测对方的活动性
一般的网络错误,TCP/IP协议可以检测出来,但是一些特殊情况,比如拔掉网线,机器宕机,中间路由停机等情况,协议是检测不出来的,所以必须要通过心跳来检测。
SO_KEEPALIVE选项是TCP用来检测对方活性的方法,但是这个检测的时间太长,一般是两个小时以上才开始激活这个选项,你如果能接受的话,就用这个也没啥问题


我无话可说