一、RST包也常见于断开TCP连接 

几个月前用wireshark抓HTTP包发现有的网络通信在结束的时候没有使用四次握手,而是直接使用RST包。如:

在TCP协议中RST表示复位,用来异常的关闭连接。在发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓冲区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。“异常的关闭连接”是很常见的事情,特别是在使用WinHttp时。

关闭TCP连接除了常见的四次握手之外,还有发送RST包的方式。下边是使用libcurl做的post测试,post成功时正常关闭,否则异常关闭。

结束TCP:四次握手图

结束TCP:发RST包图

二、WinHttp延迟关闭TCP连接

写一个简单的及时退出的控制台WinHttp Demo,可以抓包发现客户端是使用RST包结束连接,而且结束连接的时间不是在WinHttpCloseHandle的时候,而是在控制台程序退出的时候。

WinHttp有一个延迟关闭TCP连接的策略,这样做的目的是为了复用TCP连接。实际测试的时候发现调用了WinHttpCloseHandle后连接没有关闭,接下来如果继续往服务器发送数据,使用的是同一个TCP连接。不知道何时WinHttp会主动触发四次握手,网络上没找到这部分资料,开发者不需要关心。从MSDN问答区找到的资料:“WinHttp底层使用的是连接池,如果连接是由连接池自身关闭的,则会有FIN/ACK,否则就是RST包,跟客户端何时、是否调用了WinHttpCloseHandle没有关系。”,这么说的话,可以猜想,连接池是进程级别的,当进程退出时,连接池“匆忙”的让每一个连接发出了RST包,告诉服务器连接关闭了,说到这儿可能会想到RST包可能丢弃了,没关系,服务器本身有监控策略,譬如我遇到的就有:1分钟无通信,服务器主动触发四次握手关闭连接。延迟关闭是WinHttp库自身为了复用TCP连接而做的策略,因为这种策略而导致发送RST包。

另外,WinHttp中还有一个 TcpTimedWaitDelay的逻辑,但应该跟RST包没有什么关系,它是连接关闭多久之后TCP能释放资源并复用,是关闭之后的事情。我尝试修改了注册表HKLM\System\CurrentControlSet\Services\Tcpip\Parameters中TcpTimedWaitDelay的值,并不影响WinHttp发送RST包或者四次握手所需要的时间(测试的时候等的时间超过了1分钟,虽然我把TcpTimedWaitDelay修改为30秒了)。

本文: http://www.cnblogs.com/cswuyg/p/3516417.html

三、相关资料

1、有人询问了为什么WinHttp关闭连接不是使用四次握手: http://social.msdn.microsoft.com/Forums/vstudio/en-US/e10ee4f4-c4fe-4b34-87b3-03fb7d491376/winhttpclosehandle-half-duplex-close?forum=windowssdk

2、RST包出现场景介绍:http://my.oschina.net/costaxu/blog/127394

3、TCP关闭连接后资源不及时释放:"TCP does not release a connection or reuse its resources until the connection has remained closed for a period specified by the value of the TcpTimedWaitDelayentry"   http://technet.microsoft.com/en-US/library/cc938178

HTTP的RST包与WinHttp延迟关闭TCP连接的更多相关文章

  1. golang 网络编程之如何正确关闭tcp连接以及管理它的生命周期

    欢迎访问我的个人网站获取更佳阅读排版 golang 网络编程之如何正确关闭tcp连接以及管理它的生命周期 | yoko blog (https://pengrl.com/p/47401/) 本篇文章部 ...

  2. muduo 的 shutdown() 没有直接关闭 TCP 连接?

    http://blog.csdn.net/Solstice/article/details/6208634 今天收到一位网友来信: 在 simple 中的 daytime 示例中,服务端主动关闭时调用 ...

  3. 我为 Netty 贡献源码 | 且看 Netty 如何应对 TCP 连接的正常关闭,异常关闭,半关闭场景

    欢迎关注公众号:bin的技术小屋,本文图片加载不出来的话可查看公众号原文 本系列Netty源码解析文章基于 4.1.56.Final版本 写在前面..... 本文是笔者肉眼盯 Bug 系列的第三弹,前 ...

  4. 什么是RST包,什么是三次握手,什么是四次握手 ---请进

    一.RST包.本人学习后总结:RST包用于强制关闭TCP链接. TCP连接关闭的正常方法是四次握手.但四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可 ...

  5. TCP协议RST:RST介绍、什么时候发送RST包

    TCP协议RST:RST介绍.什么时候发送RST包 RST标示复位.用来异常的关闭连接. 1. 发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓冲区中的包,发送RST. 2. 而接收端收 ...

  6. TCP连接的关闭

    原文地址:http://lib.csdn.net/article/computernetworks/17264   TCP连接的关闭有两个方法close和shutdown,这篇文章将尽量精简的说明它们 ...

  7. TCP连接的状态与关闭方式及其对Server与Client的影响

    TCP连接的状态与关闭方式及其对Server与Client的影响 1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用. ...

  8. Linux 内核协议栈之TCP连接关闭

    Close行为: 当应用程序在调用close()函数关闭TCP连接时,Linux内核的默认行为是将套接口发送队列里的原有数据(比如之前残留的数据)以及新加入 的数据(比如函数close()产生的FIN ...

  9. TCP连接的状态与关闭方式,及其对Server与Client的影响

    1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用.特定数据包以及超时等,具体状态如下所示: CLOSED:初始状态, ...

随机推荐

  1. 【HDU】1599 find the mincost route

    题意 \(n(1 \le n \le 100)\)个点\(m(1 \le m \le 1000)\)条加权边的无负环无向图,求一个最小环. 分析 加入有一个环,其编号最大的点为\(L\),那么这个环可 ...

  2. Hive函数大全

    一.关系运算: 1. 等值比较: = 语法:A=B 操作类型:所有基本类型 描述: 如果表达式A与表达式B相等,则为TRUE:否则为FALSE 举例: hive> select 1 from l ...

  3. eclipse常见问题

    使用eclipse进入断点,当弹出"Confir Perspective Switch"视图时,选择"Yes".之后每次进入断点都会自动切换到debug视图. ...

  4. 反编译apk时遇到的问题

    第一次尝试反编译的时候遇到如下问题:Input file (ganzhou) was not found or was not readable 百度之后说是apktool版本2.0以上,编译命令变了 ...

  5. linux下tomcat安装

    1.先安装jdk,我们这里用yum进行安装: yum -y install java-1.7.0-openjdk* 确定是否安装成功: java -version 如果显示jdk的版本信息,说明安装成 ...

  6. UITextView 点击添加文字 光标处于最后方

    #import "ViewController.h" @interface ViewController ()<UITextViewDelegate> @end @im ...

  7. SSHE框架整合(增删改查)

    1.前期准备:jar包(c3p0.jdbc ,各个框架) web.xml文件:spring的   转码的,和Struts2的过滤器 <?xml version="1.0" e ...

  8. eclipse导入项目出现叹号处理方法:

    1.选中该项目名称,单击右键 2.点击Properties 3.选中Java Build Path 4. 5. 6. 7.出现红叉的解决办法 8. 9. 10. 11. 12. 按照以上步骤操作就可以 ...

  9. webpack如何与gulpfile联合的使用

    一.对webpack的一些理解 webpack支持CommonJS的书写形式. CommonJS指一个文件一个模块,但会一次性加载(即同步加载),但在浏览器端不适用这种方式,加载速率什么的,于是引入了 ...

  10. hadoop+tachyon+spark的zybo cluster集群综合配置

    1.zybo cluster 架构简述: 1.1 zybo cluster 包含5块zybo 开发板组成一个集群,zybo的boot文件为digilent zybo reference design提 ...