在一个正常的TCP连接上,当我们用无限等待的方式调用下面的Recv或Send的时候:
ret=recv(s,&buf[idx],nLeft,flags);
或
ret=send(s,&buf[idx],nLeft,flags);
如果TCP连接被对方正常关闭,也就是说,对方是正确地调用了closesocket(s)或者shutdown(s)的话,那么上面的Recv或Send调用就能马上返回,并且报错。这是由于closesocket(s)或者shutdown(s)有个正常的关闭过程,会告诉对方“TCP连接已经关闭,你不需要再发送或者接受消息了”。但是,如果是网线突然被拔掉,TCP连接的任何一端的机器突然断电或重启动,那么这时候正在执行Recv或Send操作的一方就会因为没有任何连接中断的通知而一直等待下去,也就是会被长时间卡住。这种情形解决的办法是启动TCP编程里的keepAlive机制。
struct TCP_KEEPALIVE inKeepAlive = {0};
unsigned long ulInLen = sizeof(struct TCP_KEEPALIVE);
struct TCP_KEEPALIVE utKeepAlive = {0};
unsigned long ulOutLen = sizeof(struct TCP_KEEPALIVE);
unsigned long ulBytesReturn = 0;
inKeepAlive.onoff=1;
inKeepAlive.keepaliveinterval=5000; //单位为毫秒
inKeepAlive.keepalivetime=1000; //单位为毫秒
ret=WSAIoctl(s, SIO_KEEPALIVE_VALS, (LPVOID)&inKeepAlive, ulInLen,
(LPVOID)&outKeepAlive, ulOutLen, &ulBytesReturn, NULL, NULL);
此处的keepalivetime表示的是TCP连接处于畅通时候的探测频率,一旦探测包没有返回,就以keepaliveinterval的频率发送,经过若干次的重试,如果探测包都没有返回,那么就得出结论:TCP连接已经断开,于是上面的Recv或Send调用也就能马上返回,不会无限制地卡住了。
上图是对上面文字的说明。亮条之前,TCP处于畅通状态,KeepAlive是以1000毫秒(keepalivetime的值)的频率发送探测包,在发送到第32个探测包的时候,探测包没有返回,于是就以5000毫秒(keepalivetime的值)的频率发送探测包,重发几次后,探测包都没有返回,于是就得出结论:此TCP连接已经断开了!
对于Win2K/XP/2003,可以从下面的注册表项找到影响整个系统所有连接的keepalive参数:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
“KeepAliveTime”=dword:006ddd00
“KeepAliveInterval”=dword:000003e8
“MaxDataRetries”=”5″
对于实用程序来说,2小时的空闲时间太长。因此,我们需要手工开启Keepalive功能并设置合理的Keepalive参数。在XP和WIN2003系统上,可以针对单独的socket来设置,但是在windows 2000,不能单独设置,如果设置,那么影响是整个系统的所有socket。
相关推荐
对于keepalive,我们需要关注`keep-alive-timeout`属性,它设定了在服务器关闭空闲连接之前等待新请求的时间。 例如,我们可以在`application.properties`或`application.yml`文件中添加以下配置: ```properties ...
HTTP 协议 Keep-Alive 模式详解 Keep-Alive 模式是 HTTP 协议中的一种机制,它使客户端到服务器端的连接保持有效,从而避免了每个请求和应答都新建一个连接,并立即断开连接。下面是关于 Keep-Alive 模式的详细...
**Keepalive详解** `Keepalive`是网络通信中一个重要的概念,它主要用于维持TCP连接的活跃状态。在TCP协议中,一旦连接建立,双方就可以在连接上无限制地发送数据,直到一方主动关闭连接。然而,在长时间无数据传输...
《TCP/IP详解卷二:实现》是一本深入探讨TCP/IP协议族实现细节的经典著作,它由Steven McQuerry和W. Richard Stevens合作撰写,是理解网络协议工作原理的重要参考资料。补充资料[7]和[10]可能包含了作者对书中某些...
### TCP Socket通信实例:心跳机制详解 #### 一、引言 在计算机网络通信中,TCP(Transmission Control Protocol)作为一种面向连接的协议,为数据传输提供了可靠的保障。然而,在实际应用中,网络环境可能会出现...
TCP/IP详解卷二:实现第25章主要探讨TCP协议中的定时器机制,这是TCP实现中的关键部分,确保了连接的可靠性和效率。TCP为每条连接设置了七个不同的定时器,每个都有特定的功能和作用。 1. **连接建立定时器**:在...
《keepalive技术详解及其安装指南》 在计算机网络领域,Keepalive是一项重要的技术,它主要用于保持网络连接的活跃状态,防止因长时间无数据传输导致的连接超时或断开。Keepalive机制通常应用于TCP(传输控制协议)...
文章中还提到了通过脚本模拟长请求,使用tcpdump工具捕获TCP交互过程,以此来分析keepalive_timeout为0时的连接生命周期,观察到当keepalive_timeout设置为0时,服务器在完成一次请求的响应后,会立即关闭TCP连接,...
### TCP-IP详解卷1:协议00006 — TCP的保活定时器 #### 23.1 引言 本章节主要探讨TCP连接中的一个重要特性——保活定时器(Keepalive Timer)。该特性旨在帮助服务器检测远端客户机的状态变化,如客户机是否崩溃...
### IEC61850-kit Stack 配置选项详解 #### 概述 IEC61850 是一个国际标准,定义了用于电力自动化系统的信息交换模型、通信服务和特定通信配置文件。该标准旨在提高不同制造商设备之间的互操作性。IEC61850-kit 是...
### LwIP中的TCP实现详解 #### 一、TCP处理概览 在LwIP库中,`tcp.c`文件负责TCP传输控制协议的核心实现。它不仅提供了与TCP控制块(TCP PCB)交互的接口,还实现了TCP定时器机制。通过深入分析此文件及其关键变量和...
### CentOS 7 上 LVS+Keepalived 部署详解 #### 一、环境准备与软件安装 根据提供的部分内容可以看出,本教程旨在演示如何在 CentOS 7 系统上安装配置 LVS(Linux Virtual Server)及 Keepalived 服务,以实现...
在IT领域,特别是网络优化和运维中,LINUX TCP优化...其他文档,如关于TCP初始窗口大小、窗口缩放选项、MTU值检测以及TCP参数的Linux内核详解,提供了丰富的理论知识和实际操作指南,对于提升网络运维技能非常有价值。
问题描述:在Linux系统中高并发的Squid服务器,TCP TIME_WAIT套接字数量经常达到两、三万,服务器很容易被拖死。解决方法:通过修改Linux内核参数,可以减少linux服务器...vi /etc/sysctl.conf增加以下几行: 代码如下:...
### Netty空闲检测与Keepalive机制详解 #### 一、引言 在现代网络通信中,客户端与服务器之间的连接管理至关重要。为了确保连接的有效性和稳定性,Netty 提供了两种重要的机制:**空闲检测** 和 **Keepalive**。这...
} TCP_KEEPALIVE, *PTCP_KEEPALIVE; int main() { WSADATA wsaData = {0}; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup failed. Error code: %d\n", WSAGetLastError()); return 1; ...
4. **使用Keepalive机制**:启用TCP Keepalive选项,周期性发送探测报文,以便在无数据交换的情况下检测连接是否还活跃,从而及时关闭无效连接。 在实际应用中,CLOSE_WAIT错误可能会导致服务器性能下降,甚至完全...