`
chriszeng87
  • 浏览: 741572 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

TCP keepAlive 详解

    博客分类:
  • TCP
TCP 
阅读更多

在一个正常的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。

 

转自:http://space.itpub.net/25259598/viewspace-684112

分享到:
评论

相关推荐

    springboot-keepalive设置测试

    对于keepalive,我们需要关注`keep-alive-timeout`属性,它设定了在服务器关闭空闲连接之前等待新请求的时间。 例如,我们可以在`application.properties`或`application.yml`文件中添加以下配置: ```properties ...

    HTTP协议Keep-Alive模式详解

    HTTP 协议 Keep-Alive 模式详解 Keep-Alive 模式是 HTTP 协议中的一种机制,它使客户端到服务器端的连接保持有效,从而避免了每个请求和应答都新建一个连接,并立即断开连接。下面是关于 Keep-Alive 模式的详细...

    keepalive中文文档

    **Keepalive详解** `Keepalive`是网络通信中一个重要的概念,它主要用于维持TCP连接的活跃状态。在TCP协议中,一旦连接建立,双方就可以在连接上无限制地发送数据,直到一方主动关闭连接。然而,在长时间无数据传输...

    TCP-IP详解卷二:实现(补充资料[7],[10]).rar

    《TCP/IP详解卷二:实现》是一本深入探讨TCP/IP协议族实现细节的经典著作,它由Steven McQuerry和W. Richard Stevens合作撰写,是理解网络协议工作原理的重要参考资料。补充资料[7]和[10]可能包含了作者对书中某些...

    TCP socket通信实例(心跳)

    ### TCP Socket通信实例:心跳机制详解 #### 一、引言 在计算机网络通信中,TCP(Transmission Control Protocol)作为一种面向连接的协议,为数据传输提供了可靠的保障。然而,在实际应用中,网络环境可能会出现...

    TCP-IP详解卷二:实现\025.PDF

    TCP/IP详解卷二:实现第25章主要探讨TCP协议中的定时器机制,这是TCP实现中的关键部分,确保了连接的可靠性和效率。TCP为每条连接设置了七个不同的定时器,每个都有特定的功能和作用。 1. **连接建立定时器**:在...

    keepalive的安装包

    《keepalive技术详解及其安装指南》 在计算机网络领域,Keepalive是一项重要的技术,它主要用于保持网络连接的活跃状态,防止因长时间无数据传输导致的连接超时或断开。Keepalive机制通常应用于TCP(传输控制协议)...

    详解Nginx中HTTP的keepalive相关配置

    文章中还提到了通过脚本模拟长请求,使用tcpdump工具捕获TCP交互过程,以此来分析keepalive_timeout为0时的连接生命周期,观察到当keepalive_timeout设置为0时,服务器在完成一次请求的响应后,会立即关闭TCP连接,...

    TCP-IP详解卷1:协议00006

    ### TCP-IP详解卷1:协议00006 — TCP的保活定时器 #### 23.1 引言 本章节主要探讨TCP连接中的一个重要特性——保活定时器(Keepalive Timer)。该特性旨在帮助服务器检测远端客户机的状态变化,如客户机是否崩溃...

    IEC61850-kit Stack configuration options

    ### IEC61850-kit Stack 配置选项详解 #### 概述 IEC61850 是一个国际标准,定义了用于电力自动化系统的信息交换模型、通信服务和特定通信配置文件。该标准旨在提高不同制造商设备之间的互操作性。IEC61850-kit 是...

    Lwip之TCP实现.pdf

    ### LwIP中的TCP实现详解 #### 一、TCP处理概览 在LwIP库中,`tcp.c`文件负责TCP传输控制协议的核心实现。它不仅提供了与TCP控制块(TCP PCB)交互的接口,还实现了TCP定时器机制。通过深入分析此文件及其关键变量和...

    centos7-lvs+keepalive部署

    ### CentOS 7 上 LVS+Keepalived 部署详解 #### 一、环境准备与软件安装 根据提供的部分内容可以看出,本教程旨在演示如何在 CentOS 7 系统上安装配置 LVS(Linux Virtual Server)及 Keepalived 服务,以实现...

    LINUX tcp 优化资料,

    在IT领域,特别是网络优化和运维中,LINUX TCP优化...其他文档,如关于TCP初始窗口大小、窗口缩放选项、MTU值检测以及TCP参数的Linux内核详解,提供了丰富的理论知识和实际操作指南,对于提升网络运维技能非常有价值。

    解决linux下大量TIME WAIT的方法详解

    问题描述:在Linux系统中高并发的Squid服务器,TCP TIME_WAIT套接字数量经常达到两、三万,服务器很容易被拖死。解决方法:通过修改Linux内核参数,可以减少linux服务器...vi /etc/sysctl.conf增加以下几行: 代码如下:...

    Netty空闲检测&Keepalive.pdf

    ### Netty空闲检测与Keepalive机制详解 #### 一、引言 在现代网络通信中,客户端与服务器之间的连接管理至关重要。为了确保连接的有效性和稳定性,Netty 提供了两种重要的机制:**空闲检测** 和 **Keepalive**。这...

    利用Keep-Alive处理Socket网络异常断开的方法

    } 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; ...

    CLOSE_WAIT错误详解

    4. **使用Keepalive机制**:启用TCP Keepalive选项,周期性发送探测报文,以便在无数据交换的情况下检测连接是否还活跃,从而及时关闭无效连接。 在实际应用中,CLOSE_WAIT错误可能会导致服务器性能下降,甚至完全...

Global site tag (gtag.js) - Google Analytics