html官方网站建站系统cms是什么
news/
2025/10/6 10:00:49/
文章来源:
html官方网站,建站系统cms是什么,做网站可以做什么,做一个网站赚钱吗tcp长连接和保活时间TCP协议中有长连接和短连接之分。短连接在数据包发送完成后就会自己断开#xff0c;长连接在发包完毕后#xff0c;会在一定的时间内保持连接#xff0c;即我们通常所说的Keepalive#xff08;存活定时器#xff09;功能。 www.2cto.com 默认的Keepa…tcp长连接和保活时间TCP协议中有长连接和短连接之分。短连接在数据包发送完成后就会自己断开长连接在发包完毕后会在一定的时间内保持连接即我们通常所说的Keepalive存活定时器功能。 www.2cto.com 默认的Keepalive超时需要7,200,000 milliseconds即2小时探测次数为5次。它的功效和用户自己实现的心跳机制是一样的。开启Keepalive功能需要消耗额外的宽带和流量尽管这微不足道但在按流量计费的环境下增加了费用另一方面Keepalive设置不合理时可能会因为短暂的网络波动而断开健康的TCP连接。keepalive并不是TCP规范的一部分。在Host Requirements RFC罗列有不使用它的三个理由1在短暂的故障期间它们可能引起一个良好连接good connection被释放dropped2它们消费了不必要的宽带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层处理的存活探测对应用程序透明直到后面234三种状态发生。在这三种状态下通过服务器的TCP返回给服务器应用程序错误信息。通常服务器向网络发出一个读请求等待客户端的数据。如果存活特征返回一个错误信息则将该信息作为读操作的返回值返回给服务器。在状态2错误信息类似于“连接超时”。状态3则为“连接被对方复位”。第四种状态看起来像连接超时或者根据是否收到与该连接相关的ICMP错误信息而可能返回其它的错误信息。linux内核包含对keepalive的支持。其中使用了三个参数tcp_keepalive_time开启keepalive的闲置时 长tcp_keepalive_intvlkeepalive探测包的发送间隔和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参数设置代码如下 // 开启KeepAliveBOOL 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/929186.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!