TCP 连接异常状态检测

TCP 连接异常状态检测

TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现。某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接。关于TCP异常断开可能有以下两种情况:

1程序/进程异常

如果TCPLink异常而Application1正常,TCPLink会被关掉并且告诉Application2,Application2也就关闭了该异常的TCPLink。这种情况会在TCPLink异常后的一次Socket调用中通过返回值(C/C++)或者异常代码(C#)得知。因此在做程序开发的时候比较容易处理。

2物理链路异常

如果出现Machine1或者Machine2任何一个系统死机:假设Machine1系统异常,此时Machine2无法知道此TCP连接的失效,并一直认为连接正常。如果网络硬件故障(如网线拔掉、交换机断电):Machine1Machine2都无法知道此TCP连接的失效,并一直认为连接正常。

以上这两种情况在编程时会变的非常糟糕,因为TCP连接将一直被认为有效,所有对此TCP Socket的调用都会正确返回,这显然是错误的。并且这种错误情况通常会持续很久。

 

采用keepalive 机制预防异常断开:

 

首先说一下 keepalive 来判断异常断开的原理,其实 keepalive 的原理就是 TCP 内嵌的一个心跳包。

以服务器端为例,如果当前 server 端检测到超过一定时间(默认是 7,200,000milliseconds ,也就是 2 个小时)没有数据传输,那么会client 端发送一个 keep-alive packet (该 keep-alivepacket 就是 ACK 和当前 TCP 序列号减一的组合),此时 client 端应该为以下三种情况之一:

1.    client 端仍然存在,网络连接状况良好。此时 client 端会返回一个 ACK server 端接收到 ACK 后重置计时器,在 2 小时后再发送探测。如果 2 小时内连接上有数据传输,那么在该时间基础上向后推延 2 个小时。

2.      客户端异常关闭,或是网络断开。在这两种情况下, client 端都不会响应。服务器没有收到对其发出探测的响应,并且在一定时间(系统默认为 1000 ms )后重复发送 keep-alive packet ,并且重复发送一定次数( 2000 XP 2003 系统默认为 5 ,Vista 后的系统默认为 10 次)。

3.      客户端曾经崩溃,但已经重启。这种情况下,服务器将会收到对其存活探测的响应,但该响应是一个复位,从而引起服务器对连接的终止。

具体参考

http://blog.sina.com.cn/s/blog_49aeff0b01016nob.html
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值