tcp长连接和保活时间

tcp长连接和保活时间
TCP协议中有长连接和短连接之分。短连接在数据包发送完成后就会自己断开,长连接在发包完毕后,会在一定的时间内保持连接,即我们通常所说的Keepalive(存活定时器)功能。  www.2cto.com  
默认的Keepalive超时需要7,200,000 milliseconds,即2小时,探测次数为5次。它的功效和用户自己实现的心跳机制是一样的。开启Keepalive功能需要消耗额外的宽带和流量,尽管这微不足道,但在按流量计费的环境下增加了费用,另一方面,Keepalive设置不合理时可能会因为短暂的网络波动而断开健康的TCP连接。
keepalive并不是TCP规范的一部分。在Host Requirements RFC罗列有不使用它的三个理由:(1)在短暂的故障期间,它们可能引起一个良好连接(good connection)被释放(dropped),(2)它们消费了不必要的宽带,(3)在以数据包计费的互联网上它们(额外)花费金钱。然而,在许多的实现中提供了存活定时器。
一些服务器应用程序可能代表客户端占用资源,它们需要知道客户端主机是否崩溃。存活定时器可以为这些应用程序提供探测服务。Telnet服务器和Rlogin服务器的许多版本都默认提供存活选项。
个人计算机用户使用TCP/IP协议通过Telnet登录一台主机,这是能够说明需要使用存活定时器的一个常用例子。如果某个用户在使用结束时只是关掉了电源,而没有注销(log off),那么他就留下了一个半打开(half-open)的连接。如果客户端消失,留给了服务器端半打开的连接,并且服务器又在等待客户端的数据,那么等待将永远持续下去。存活特征的目的就是在服务器端检测这种半打开连接。
也可以在客户端设置存活器选项,且没有不允许这样做的理由,但通常设置在服务器。如果连接两端都需要探测对方是否消失,那么就可以在两端同时设置(比如NFS)。
keepalive工作原理:
若在一个给定连接上,两小时之内无任何活动,服务器便向客户端发送一个探测段。(我们将在下面的例子中看到探测段的样子。)客户端主机必须是下列四种状态之一:
1) 客户端主机依旧活跃(up)运行,并且从服务器可到达。从客户端TCP的正常响应,服务器知道对方仍然活跃。服务器的TCP为接下来的两小时复位存活定时器,如果在这两个小时到期之前,连接上发生应用程序的通信,则定时器重新为往下的两小时复位,并且接着交换数据。
2) 客户端已经崩溃,或者已经关闭(down),或者正在重启过程中。在这两种情况下,它的TCP都不会响应。服务器没有收到对其发出探测的响应,并且在75秒之后超时。服务器将总共发送10个这样的探测,每个探测75秒。如果没有收到一个响应,它就认为客户端主机已经关闭并终止连接。
3) 客户端曾经崩溃,但已经重启。这种情况下,服务器将会收到对其存活探测的响应,但该响应是一个复位,从而引起服务器对连接的终止。
4) 客户端主机活跃运行,但从服务器不可到达。这与状态2类似,因为TCP无法区别它们两个。它所能表明的仅是未收到对其探测的回复。
服务器不必担心客户端主机被关闭然后重启的情况(这里指的是操作员执行的正常关闭,而不是主机的崩溃)。当系统被操作员关闭时,所有的应用程序进程(也就是客户端进程)都将被终止,客户端TCP会在连接上发送一个FIN。收到这个FIN后,服务器TCP向服务器进程报告一个文件结束,以允许服务器检测这种状态。
在第一种状态下,服务器应用程序不知道存活探测是否发生。凡事都是由TCP层处理的,存活探测对应用程序透明,直到后面2,3,4三种状态发生。在这三种状态下,通过服务器的TCP,返回给服务器应用程序错误信息。(通常服务器向网络发出一个读请求,等待客户端的数据。如果存活特征返回一个错误信息,则将该信息作为读操作的返回值返回给服务器。)在状态2,错误信息类似于“连接超时”。状态3则为“连接被对方复位”。第四种状态看起来像连接超时,或者根据是否收到与该连接相关的ICMP错误信息,而可能返回其它的错误信息。
linux内核包含对keepalive的支持。其中使用了三个参数:tcp_keepalive_time(开启keepalive的闲置时 长)tcp_keepalive_intvl(keepalive探测包的发送间隔)和tcp_keepalive_probes (如果对方不予应答,探测包的发送次数);在liunx中,keepalive是一个开关选项,可以通过函数来使能。具体地说,可以使用以下代码:
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select会返回socket可读,并且在recv时返回-1,同时置上errno为ETIMEDOUT。此时TCP的状态是断开的。
keepalive参数设置代码如下: 
// 开启KeepAlive
BOOL bKeepAlive = TRUE;
int nRet = ::setsockopt(socket_handle, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));
if (nRet == SOCKET_ERROR)
{
return FALSE;
}
// 设置KeepAlive参数
tcp_keepalive alive_in                = {0};
tcp_keepalive alive_out                = {0};
alive_in.keepalivetime                = 5000;                // 开始首次KeepAlive探测前的TCP空闭时间
alive_in.keepaliveinterval        = 1000;                // 两次KeepAlive探测间的时间间隔
alive_in.onoff                                = TRUE;
unsigned long ulBytesReturn = 0;
nRet = WSAIoctl(socket_handle, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in),
&alive_out, sizeof(alive_out), &ulBytesReturn, NULL, NULL);
if (nRet == SOCKET_ERROR)
{
return FALSE;
}
开启Keepalive选项之后,对于使用IOCP模型的服务器端程序来说,一旦检测到连接断开,GetQueuedCompletionStatus函数将立即返回FALSE,使得服务器端能及时清除该连接、释放该连接相关的资源。对于使用select模型的客户端来说,连接断开被探测到时,以recv目的阻塞在socket上的select方法将立即返回SOCKET_ERROR,从而得知连接已失效,客户端程序便有机会及时执行清除工作、提醒用户或重新连接。
TCP连接非正常断开的检测(KeepAlive探测)
此处的”非正常断开”指TCP连接不是以优雅的方式断开,如网线故障等物理链路的原因,还有突然主机断电等原因
有两种方法可以检测:1.TCP连接双方定时发握手消息 2.利用TCP协议栈中的KeepAlive探测
第二种方法简单可靠,只需对TCP连接两个Socket设定KeepAlive探测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android实现文本输入,Android实现智能提示的文本输入框AutoCompleteTextView

今天我们要讲一个十分简单的内容,就是一个安卓控件的使用,用法很简单,但是很常用的一个。这里我用两种不同的写法来处理。当然,无论用哪一种写法,效果都是一样的。我们先来看效果图。要实现这种效果十分简单。需要一个…

【转】系统缓存全解析二:动态缓存(2)-页面局部缓存的两种方式

有时缓存整个页面是不现实的,因为页的某些部分可能在每次请求时都需要变化。在这些情况下,只能缓存页的一部分。顾名思义,页面部分缓存是将页面部分内容保存在内存中以便响应用户请求,而页面其他部分内容则为动态内容。页面部分缓…

TCP心跳机制

所谓的心跳包就是客户端定时放送简单的信息给服务器端,告诉它我还在而已。代码就是每隔几分钟发送一个固定信息给服务器端,服务器端回复一个固定信息。如果服务器端几分钟后没有收到客户端信息则视客户端断开。比如有些通信软件长时间不适用,…

A20成功驱动FT5206触摸屏

经过三个晚上的奋斗,终于在A20上驱动了FT5206触摸屏。实现过程有限蹊跷,现在暂时将实现过程记录下来以免遗忘。 FT5206的驱动在bsp里已经以ko文件的形式提供了,只要在sun7i.init.rc这个系统初始化脚本里加上insmod ft5x_ts.ko即可在系统启动时…

ibatis的简介与初步搭建应用

一、ibatis的简介 ibatis是什么东西就不介绍了,自己去找谷老师。 这里讲下自己的使用体会。之前自己学过Hibernate,是看尚学堂的视频教学的,看完以后发现Hibernate体系中的内容真的很多,什么N-N关联、HSQL、缓存管理等等&#xff…

html中页面按钮隐藏div,html 点击一个按钮 显示另一个div 隐藏之前呢个div(display属性,怎么用js控制)...

用户提问隐藏这个显示这个烦烦烦&#xff1a;嘎嘎嘎 推荐答案function tab(name,cursel,n){for(i1;i<n;i){var condocument.getElementById(name"_"i);var con1document.getElementById(name"_"i"_"i);con.style.blockicursel?"display…

You must install 'makeinfo' on your build machine

ubuntu&#xff1a;sudo apt-get install texinfo 就OK 今天在打包的时候有个包需要 makeinfo 当时就各种搜结果就没有 makeinfo 这个软件包&#xff0c;最后看到有人说其实就是 texinfo 这个包&#xff0c;经过测试&#xff0c;不管是ubuntu 还是qomo &#xff08;yum 源&a…

[0716] Jsoi B Rsss

rsss 时间限制:1秒 内存限制: 128 MB 试题描述 在质数的大家庭中&#xff0c;大小之差不超过2的两个质数称它俩为一对孪生素数&#xff0c;如2和3、3和5、17和19等等。请你统计一下&#xff0c;在不大于自然数N的质数中&#xff0c;孪生素数的对数。 输入要求 输入文件rsss.in…

asp页面怎么转html页面,将asp页面转换成html页面 代码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼将asp页面转换成html页面Sub GenFile(id)dim objXmlHttpset objXmlHttp Server.CreateObject("Microsoft.XMLHTTP")objXmlHttp.open "GET","http://www.xxx.com/product.asp?id" & id ,falseo…

You must install 'msgfmt' on your build machine

ubuntu&#xff1a;sudo apt-get install gettext 就OK

HDOJ 1875 畅通工程再续

这个畅通工程还是一交就过&#xff0c;看来畅通工程用来入门是最好了&#xff0c;以后拿这些来挂就不会那么打击人了&#xff0c;天天开心。这里求最小生成树之前要自己构图&#xff0c;很简单就是求出点到点之间的距离&#xff0c;如果距离大于1000和小于10都视作不连通。点少…

ISDN与PSTN的区别是什么?

ISDN是综合业务数字网的简称&#xff0c;它由电话综合数字网&#xff08;IDN&#xff09;发展而来。ISDN是数字交换和数字传输的结合&#xff0c;它以迅速、准确、经济、有效的方式提供目前各种通信网络中现有的业务&#xff0c;而且将通信和数据处理结合起来&#xff0c;开创了…

html5 audio 获取播放时间,html5 audio 延时获取播放路径播放失败

为什么audio对象在延时1000毫秒之后就不能执行播放呢?歌曲的路径需要从数据库中获取&#xff0c;所以需要用ajax来交互&#xff0c;但是发现假如时间过长即使获取到路径也不能执行播放。为方便测试使用setTimeout来模拟自动播放音乐测试试试看能不能听到声音。(function () {v…

VOIP,PSTN,ISDN

近来在电视、杂志特集等展露头脚的「IP电话」&#xff0c;因其通话费用低廉而有口皆碑。IP电话利用的IP网络在互联网的世界里是众所周知的。互联网被认为基本上是免费的网络。接下来以此开放的技术和构想作为基础而登场的就是IP电话。IP电话与构成 所谓的IP电话 所谓的IP电话就…

2021高考成绩查询时间福州,福州2021高考填志愿入口

高考结束后学校和专业如何选择2021-06-07 20:19:16文/杨婷现在很多考生高考结束之后&#xff0c;不知道怎么选择学校和专业&#xff0c;下面小编为大家整理了相关内容&#xff0c;以供参考&#xff0c;一起来看看&#xff01;高考结束后学校和专业如何选择一、根据孩子兴趣来进…

svn在linux下的使用(svn命令行)ubuntu 删除 新增 添加 提交 状态查询 恢复

合并步骤&#xff1a;&#xff08;1&#xff09;先切换到分支&#xff1b;&#xff08;2&#xff09;svn merge trunk . &#xff08;3&#xff09;svn sw trunk &#xff08;4&#xff09;svn merge --reintegrate branch . svn merge http://59.251.189.152:8989/svn/ron/tru…

关于关闭office 2010中的OSPPSVC服务的方法

今天重装了系统,并安装了office 2010 VOL版,结果发现在使用word、Excel等程序时&#xff0c;系统同时打开了一个OSPPSVC的进程(是一个服务)&#xff0c;但是在word等程序关闭后,该进程不能关闭&#xff0c;仍在后台运行&#xff0c;让人感觉不舒服。通过查找发现&#xff1a; 文…

计算机组装与维护模拟测试题三答案,春季高考信息技术模拟题3(计算机组装与维修部分含答案)...

36.计算机硬件系统的核心部件是A&#xff0e;主板B&#xff0e;CPUC&#xff0e;内存D&#xff0e;硬盘 37.北桥芯片的功能不包括A&#xff0e;对CPU类型和主频的支持B&#xff0e;对ECC纠错的支持C&#xff0e;对内存类型和最大容量的支持D&#xff0e;对USB接口的支持 38.操作…

【原创】SqlServer 2005 BCP命令详解

一、命令详解 1.  将远程数据库数据导出到本地文件 EXEC master..xp_cmdshell bcp "sql查询语句" queryout 本地文件路径 -t"," -c -S服务器ip -U"用户名" -P"密码" 注意&#xff1a;在本机上执行的命令最终文件未必备份到本机&…

wince6下usb摄像头(UVC)使用指南

转自&#xff1a;http://hi.baidu.com/cahbb/blog/item/6d76093498fe0790a61e120e.html 在搭好了wince6的开发环境之后&#xff0c;下一步试验一下wince6下使用摄像头的方法。搜集了不少资料&#xff0c;从中学习了很多有用的东西&#xff0c;在这给记录下来&#xff0c;方便…