一、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. 运行jar应用程序引用其他jar包的四种方法

    转载地址:http://www.iteye.com/topic/332580 大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个ja ...

  2. RN 项目导入WebStorm 组件没有依赖

    你需要在项目根目录   $ npm instal 恭喜你完成 但是依然报错 npm config set registry="registry.npmjs.org"  重新配置了一 ...

  3. Logback_日志使用详解(转)

    概述 Logback建立于三个主要类之上:日志记录器(Logger),输出端(Appender)和日志格式化器(Layout).这三种组件协同工作,使开发者可以按照消息类型和级别来记录消息,还可以在程 ...

  4. C#详解format函数,各种格式化

    一.String Format for Double Digits after decimal point This example formats double to string with fix ...

  5. jsp 中 有没有类似java if else语句

    <c:when test=""></c:when> <c:otherwise></c:otherwise> 有if else的功能 ...

  6. 续关于C#的微信开发的入门记录一

    前几天写了一篇博客<关于C#的微信开发的入门记录一>,原文地址:http://www.cnblogs.com/zhankui/p/4515905.html,现在继续完善: 目前很多小伙伴都 ...

  7. C# Json传值与解析

    最近接触了工作室的项目,觉得一个功能的实现有点不好,心想不能就动手改了下,做了才知道我的js是多么的渣,功能是这样的: 我要实现的功能就是当选择学院时,就放松get请请求到后台,后台返回json信息再 ...

  8. HTML实践发现(标签<pre>)

    1. (1).第一种编辑: (2).浏览器中显示: 2. (1).第二种编辑 (2).浏览器中显示: 结果发现:使用标签<pre>,在浏览器中显示的结果与在<pre>下方编写的 ...

  9. 11个并不广为人知,但值得了解的Python库

    这是一篇译文,文中提及了一些不常见但是有用的Python库 原文地址:http://blog.yhathq.com/posts/11-python-libraries-you-might-not-kn ...

  10. asp.net 使用DroDownList来实现二级联动

    今天做新闻发布系统的时候,用到了二级联动,我把使用方法记录下来,以便日后查阅以及帮助新手朋友们.下面是效果图: 下面来讲解一下实现的方法: 1.在.aspx页面中,拖入两个DroDownList控件. ...