问题背景:
TCP不能及时通知连接中断,如果使用keep-live机制默认时间是2小时11分钟15秒没有通讯才会发送探测消息,如依靠TCP超时机制可能要等待9分钟才能检测出网络中断,因此必须用户自己检测连接是否正常。
连接中断可能的原因:
1)一方主机崩溃 发不出FIN,对等方依靠重发检测链路中断,如果崩溃方在对等方准备撤销连接之前又重新启动了,若此时收到了消息则会回复RST消息给对等方,这将导致对等方撤销连接,对等方会收到ECONNECREST错误,或者下一次读导致SIGPIPE信号或EPIPE错误。
2)一方的应用程序崩溃 可以发出FIN
3)一方网络暂时性的瘫痪 发不出FIN
1)和3)在现象上有点类似
解决方案:
1)如果所有进行通讯的数据是有消息类型的可以在同一个连接中通过心跳消息来检测
2)如果通讯数据没有消息类型可以采用再重新开一个连接2,用连接2来监视连接1,普通做法是是再开一个心跳检测线程实现,另一种方法将在技巧20中使用。
steven提出了用紧急数据的方式来提供heartbeat
原文地址:http://www.cnblogs.com/happy-pm/p/3822424.html