第一,我们为什么需要心跳包,一个tcp连接的一方意外断开时,另一端不会recv到一个socket_error吗?
为什么需要心跳包来一直不停的检测呢?
第二,SO_KEEPALIVE选项是否可以理解为内核帮我们做的一种心跳包机制?
11 个解决方案
#1
1 链路双方间隔一段时间,通过心跳激活包,来确定双方还是 live 活的,以便可以随时通信。
#2
请教大家两个问题,
第一,我们为什么需要心跳包,一个tcp连接的一方意外断开时,另一端不会recv到一个socket_error吗?
为什么需要心跳包来一直不停的检测呢?
心跳包保证你知道对方网络状态是良好的
第二,SO_KEEPALIVE选项是否可以理解为内核帮我们做的一种心跳包机制?
SO_KEEPALIVE有诊断意思,说心跳似乎也不是.
第一,我们为什么需要心跳包,一个tcp连接的一方意外断开时,另一端不会recv到一个socket_error吗?
为什么需要心跳包来一直不停的检测呢?
心跳包保证你知道对方网络状态是良好的
第二,SO_KEEPALIVE选项是否可以理解为内核帮我们做的一种心跳包机制?
SO_KEEPALIVE有诊断意思,说心跳似乎也不是.
#3
心跳用来检测对方的活动性
一般的网络错误,TCP/IP协议可以检测出来,但是一些特殊情况,比如拔掉网线,机器宕机,中间路由停机等情况,协议是检测不出来的,所以必须要通过心跳来检测。
SO_KEEPALIVE选项是TCP用来检测对方活性的方法,但是这个检测的时间太长,一般是两个小时以上才开始激活这个选项,你如果能接受的话,就用这个也没啥问题
一般的网络错误,TCP/IP协议可以检测出来,但是一些特殊情况,比如拔掉网线,机器宕机,中间路由停机等情况,协议是检测不出来的,所以必须要通过心跳来检测。
SO_KEEPALIVE选项是TCP用来检测对方活性的方法,但是这个检测的时间太长,一般是两个小时以上才开始激活这个选项,你如果能接受的话,就用这个也没啥问题
#4
#5
SO_KEEPALIVE选项的确时效性不行。。。。。。。。时间太长了
#6
解释的不错~
#7
#8
楼上说的很好,不过我说说我理解,心跳包是应用层协议,一旦网络错误,可以检测出来,而SO_KEEPALIVE选项的这套机制是操作系统底层使用的被动机制,原理上不推荐我们在上层应用层去使用它,当系统关闭一个由KEEPALIVE机制检查出来的死连接时,是不会主动去通知上层如应用层的,只有调用相应的IO操作的返回值中检查出来。所以还是得在应用层自己定义心跳包,占用资源少,清除死连接作用很大。
#9
一.确实不会,以外断开如:拔网线,直接断电,中间路由器损坏
二.是的,正常2小时触发一次
看下文章:
http://blog.csdn.net/jwybobo2007/archive/2011/01/25/6162784.aspx
#10
#11
我无话可说
#1
1 链路双方间隔一段时间,通过心跳激活包,来确定双方还是 live 活的,以便可以随时通信。
#2
请教大家两个问题,
第一,我们为什么需要心跳包,一个tcp连接的一方意外断开时,另一端不会recv到一个socket_error吗?
为什么需要心跳包来一直不停的检测呢?
心跳包保证你知道对方网络状态是良好的
第二,SO_KEEPALIVE选项是否可以理解为内核帮我们做的一种心跳包机制?
SO_KEEPALIVE有诊断意思,说心跳似乎也不是.
第一,我们为什么需要心跳包,一个tcp连接的一方意外断开时,另一端不会recv到一个socket_error吗?
为什么需要心跳包来一直不停的检测呢?
心跳包保证你知道对方网络状态是良好的
第二,SO_KEEPALIVE选项是否可以理解为内核帮我们做的一种心跳包机制?
SO_KEEPALIVE有诊断意思,说心跳似乎也不是.
#3
心跳用来检测对方的活动性
一般的网络错误,TCP/IP协议可以检测出来,但是一些特殊情况,比如拔掉网线,机器宕机,中间路由停机等情况,协议是检测不出来的,所以必须要通过心跳来检测。
SO_KEEPALIVE选项是TCP用来检测对方活性的方法,但是这个检测的时间太长,一般是两个小时以上才开始激活这个选项,你如果能接受的话,就用这个也没啥问题
一般的网络错误,TCP/IP协议可以检测出来,但是一些特殊情况,比如拔掉网线,机器宕机,中间路由停机等情况,协议是检测不出来的,所以必须要通过心跳来检测。
SO_KEEPALIVE选项是TCP用来检测对方活性的方法,但是这个检测的时间太长,一般是两个小时以上才开始激活这个选项,你如果能接受的话,就用这个也没啥问题
#4
#5
SO_KEEPALIVE选项的确时效性不行。。。。。。。。时间太长了
#6
解释的不错~
#7
#8
楼上说的很好,不过我说说我理解,心跳包是应用层协议,一旦网络错误,可以检测出来,而SO_KEEPALIVE选项的这套机制是操作系统底层使用的被动机制,原理上不推荐我们在上层应用层去使用它,当系统关闭一个由KEEPALIVE机制检查出来的死连接时,是不会主动去通知上层如应用层的,只有调用相应的IO操作的返回值中检查出来。所以还是得在应用层自己定义心跳包,占用资源少,清除死连接作用很大。
#9
一.确实不会,以外断开如:拔网线,直接断电,中间路由器损坏
二.是的,正常2小时触发一次
看下文章:
http://blog.csdn.net/jwybobo2007/archive/2011/01/25/6162784.aspx
#10
#11
我无话可说