tcp连接检测keepalive
tcp连接检测-keep-alive
断线检测
tcp 的断线检测,是分为两种的:
① 利用 tcp 自带的 keep –alive 机制
② 自己组建心跳包的方式向对端发送
Keep_alive 机制
通过 Keep-alive 机制对 tcp 的连接保持,也就是 Tcp 的心跳包,见 MSDN :
If keep-alive is enabled for a TCP socket with SO_KEEPALIVE, then the default TCP settings are used for the keep-alive timeout and interval unless these values have been changed by calling the WSAIoctl function with the SIO_KEEPALIVE_VALS option. The default settings when a TCP socket is initialized sets the keep-alive timeout to 2 hours and the keep-alive interval to 1 second.
也就是说协议栈会在 2 小时后发送向对端发送请求包。默认情况下,此 Keep-alive 机制是关闭的。
自己发送心跳包机制
自己发送心跳包,在程序内一般采用多线程,检测最后发送(或者接收包)的时间,超过一定时间,则发送心跳包。
由此产生疑问:
为什么都是采用的发送的方式?
TCP 原理
TCP 原理应该都不陌生,但是其本质的还是对端数据包的发送,常听人说, TCP 有链路,其实 TCP 是没有链路的,系统对数据包的判定(判断从哪个机器的哪个程序发送的),其实是通过 ( 本端 ip+ 本端 port+ 对端 ip+ 对端 port) 的 hash 值来判定的,系统根据这个值在协议栈内保存着每个 socket 的状态,比如当前接收了多少字节等等信息。
Keep_alive 机制默认关闭的影响
Keep-alive 默认下是关闭的,也就是本端与对端是除非程序主动 send ,是不会发送数据包(心跳包),既是,处理本端与对端的系统里的 socket 状态是不会变化,这里,如果对端当机(或者网线断掉),本端是无法知道对端 socket 已经关闭,所以本端的 socket 会一直的存在。
View Code
客户端采用如下步骤:
1, 连接
2, 拔掉网线
经过以上两步:
从上图中可以看到,此时服务端的连接依然存在。
所以,tcp只是数据的发送与接收,包括握手,断开以及rst,time_wait,close_wait 等等。
作者: OUZI
出处: http://HdhCmsTestcnblogs测试数据/ouzi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类: C++ , linux , TCP
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于tcp连接检测keepalive的详细内容...