TCP keepAlive含义:

在TCP中有一个Keep-alive的机制可以检测死连接,原理很简单,TCP会在空闲了一定时间后发送数据给对方:

1.如果主机可达,对方就会响应ACK应答,就认为是存活的。
2.如果可达,但应用程序退出,对方就发RST应答,发送TCP撤消连接。
3.如果可达,但应用程序崩溃,对方就发FIN消息。

4.如果对方主机不响应ack, rst,继续发送直到超时,就撤消连接。这个时间就是默认的二个小时。

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

TCP keepAlive详解(TCP心跳包)相关推荐

  1. Tcp keepalive详解

    转载:https://www.cnblogs.com/lanyangsh/p/10926806.html TCP是面向连接的,一般情况,两端的应用程序可以通过发送和接收数据得知对端的存活. 当两端的应 ...

  2. TCP/IP详解--TCP传输小数据包效率问题

    摘要:当使用TCP传输小型数据包时,程序的设计是相当重要的.如果在设计方案中不对TCP数据包的 延迟应答,Nagle算法,Winsock缓冲作用引起重视,将会严重影响程序的性能.这篇文章讨论了这些 问 ...

  3. TCP/IP详解--TCP/IP中三次握手 四次握手状态分析

    TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...

  4. TCP/IP详解卷1 - wireshark抓包分析

    TCP/IP详解卷1 - 系列文 TCP/IP详解卷1 - 思维导图(1) TCP/IP详解卷1 - wireshark抓包分析 引言 在初学TCP/IP协议时,会觉得协议是一种很抽象的东西,通过wi ...

  5. 《TCP/IP详解卷一》学习笔记

    <TCP/IP详解卷一>学习笔记 第1章 概述 第3章 IP:网际协议 第6章 ICMP:internet控制报文协议 第7/8章 Ping/Traceroute程序 第9/10章 IP路 ...

  6. TCP/IP详解--第十七章

     第17章 TCP:传输控制协议 17.1    引言   本章将介绍 TCP为应用层提供的服务,以及 TCP首部中的各个字段.随后的几章我们在了 解TCP的工作过程中将对这些字段作详细介绍. 对TC ...

  7. TCP/IP详解--第十五章

     第15章 TFTP:简单文件传送协议 15.1    引言   TFTP(Trivial File Transfer Protocol) 即简单文件传送协议,最初打算用于引导无盘系统 (通常是工作站 ...

  8. TCP/IP详解--第一章

    说明:专栏中的内容是<TCP/IP详解>这本书,博主分享在此. 第1章概     述 1.1   引言 很多不同的厂家生产各种型号的计算机,它们运行完全不同的操作系统,但  TCP/IP协 ...

  9. TCP/IP详解--学习笔记(5)-IP选路,动态选路,和一些细节

    1.静态IP选路 1.1.一个简单的路由表 选路是IP层最重要的一个功能之一.前面的部分已经简单的讲过路由器是通过何种规则来根据IP数据包的IP地址来选择路由.这里就不重复了.首先来看看一个简单的系统 ...

最新文章

  1. php5.3.28安装,安装php-5.3.28 时问题
  2. 关于Cocos2d-x属性和引用
  3. 非阻塞模式WinSock编程入门
  4. MFC中的动态创建与运行时识别
  5. 计算机信息专业又分为哪三种,计算机类型大致分为哪三类
  6. centos6升级glibc-2.14没有报错,但是验证没有升级成功的问题解决
  7. 完美仿MSN右下角弹出广告代码并可自动消失,附带关闭按钮
  8. Y COMBINATOR的六大强悍女人-转自应用电台
  9. 在 LaTeX 中插入表格
  10. css实现径向和线性渐变,CSS3的渐变属性 线性渐变 径向渐变 重复线性渐变和径向渐变...
  11. JavaWEB-Servlet
  12. 学习单片机我们到底在学习什么?
  13. Nim游戏和SG函数
  14. Nginx配置代理多个服务及伪集群实现
  15. pip 如何指定国内源安装
  16. 使用Grunt生成雪碧图
  17. 零经验转型AI产品经理 —— 一些对跨行、跨职能转型者的建议
  18. Java中length、length()、size()区别
  19. 安全灵活,华为云桌面成为数字化办公最佳搭档
  20. Power bi 1.5连接Oracle

热门文章

  1. Altium Designer原理图元件和PCB元件互相定位
  2. SSPL的MongoDB再被抛弃,GUN Health也合流PostgreSQL
  3. SanDisk闪迪推面向VMware Virtual SAN 6的增强型闪存
  4. TurnipBit:可以带着孩子一起玩编程的MicroPython开发板!
  5. 未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker...
  6. PHP学习笔记6:面向对象的PHP
  7. 查看IIS上面的每个网站分别用了多少内存
  8. 《Java Web高级编程——涵盖WebSockets、Spring Framework、JPA H
  9. 卍解,开放基础架构的力量--9月26日免费大型讲座预告
  10. javascript,令人着迷了!