TCP keepAlive详解(TCP心跳包)
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心跳包)相关推荐
- Tcp keepalive详解
转载:https://www.cnblogs.com/lanyangsh/p/10926806.html TCP是面向连接的,一般情况,两端的应用程序可以通过发送和接收数据得知对端的存活. 当两端的应 ...
- TCP/IP详解--TCP传输小数据包效率问题
摘要:当使用TCP传输小型数据包时,程序的设计是相当重要的.如果在设计方案中不对TCP数据包的 延迟应答,Nagle算法,Winsock缓冲作用引起重视,将会严重影响程序的性能.这篇文章讨论了这些 问 ...
- TCP/IP详解--TCP/IP中三次握手 四次握手状态分析
TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...
- TCP/IP详解卷1 - wireshark抓包分析
TCP/IP详解卷1 - 系列文 TCP/IP详解卷1 - 思维导图(1) TCP/IP详解卷1 - wireshark抓包分析 引言 在初学TCP/IP协议时,会觉得协议是一种很抽象的东西,通过wi ...
- 《TCP/IP详解卷一》学习笔记
<TCP/IP详解卷一>学习笔记 第1章 概述 第3章 IP:网际协议 第6章 ICMP:internet控制报文协议 第7/8章 Ping/Traceroute程序 第9/10章 IP路 ...
- TCP/IP详解--第十七章
第17章 TCP:传输控制协议 17.1 引言 本章将介绍 TCP为应用层提供的服务,以及 TCP首部中的各个字段.随后的几章我们在了 解TCP的工作过程中将对这些字段作详细介绍. 对TC ...
- TCP/IP详解--第十五章
第15章 TFTP:简单文件传送协议 15.1 引言 TFTP(Trivial File Transfer Protocol) 即简单文件传送协议,最初打算用于引导无盘系统 (通常是工作站 ...
- TCP/IP详解--第一章
说明:专栏中的内容是<TCP/IP详解>这本书,博主分享在此. 第1章概 述 1.1 引言 很多不同的厂家生产各种型号的计算机,它们运行完全不同的操作系统,但 TCP/IP协 ...
- TCP/IP详解--学习笔记(5)-IP选路,动态选路,和一些细节
1.静态IP选路 1.1.一个简单的路由表 选路是IP层最重要的一个功能之一.前面的部分已经简单的讲过路由器是通过何种规则来根据IP数据包的IP地址来选择路由.这里就不重复了.首先来看看一个简单的系统 ...
最新文章
- php5.3.28安装,安装php-5.3.28 时问题
- 关于Cocos2d-x属性和引用
- 非阻塞模式WinSock编程入门
- MFC中的动态创建与运行时识别
- 计算机信息专业又分为哪三种,计算机类型大致分为哪三类
- centos6升级glibc-2.14没有报错,但是验证没有升级成功的问题解决
- 完美仿MSN右下角弹出广告代码并可自动消失,附带关闭按钮
- Y COMBINATOR的六大强悍女人-转自应用电台
- 在 LaTeX 中插入表格
- css实现径向和线性渐变,CSS3的渐变属性 线性渐变 径向渐变 重复线性渐变和径向渐变...
- JavaWEB-Servlet
- 学习单片机我们到底在学习什么?
- Nim游戏和SG函数
- Nginx配置代理多个服务及伪集群实现
- pip 如何指定国内源安装
- 使用Grunt生成雪碧图
- 零经验转型AI产品经理 —— 一些对跨行、跨职能转型者的建议
- Java中length、length()、size()区别
- 安全灵活,华为云桌面成为数字化办公最佳搭档
- Power bi 1.5连接Oracle
热门文章
- Altium Designer原理图元件和PCB元件互相定位
- SSPL的MongoDB再被抛弃,GUN Health也合流PostgreSQL
- SanDisk闪迪推面向VMware Virtual SAN 6的增强型闪存
- TurnipBit:可以带着孩子一起玩编程的MicroPython开发板!
- 未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker...
- PHP学习笔记6:面向对象的PHP
- 查看IIS上面的每个网站分别用了多少内存
- 《Java Web高级编程——涵盖WebSockets、Spring Framework、JPA H
- 卍解,开放基础架构的力量--9月26日免费大型讲座预告
- javascript,令人着迷了!