首先看一下tcp关闭连接时的四次握手过程:

1.Client向Server发送FIN包,表示Client主动要关闭连接,然后进入FIN_WAIT_1状态,等待Server返回ACK包。此后Client不能再向Server发送数据,但能读取数据。

2.Server收到FIN包后向Client发送ACK包,然后进入CLOSE_WAIT状态,此后Server不能再读取数据,但可以继续向Client发送数据。

3.Client收到Server返回的ACK包后进入FIN_WAIT_2状态,等待Server发送FIN包。
4.Server完成数据的发送后,将FIN包发送给Client,然后进入LAST_ACK状态,等待Client返回ACK包,此后Server既不能读取数据,也不能发送数据。
5.Client收到FIN包后向Server发送ACK包,然后进入TIME_WAIT状态,接着等待足够长的时间(2MSL)以确保Server接收到ACK包,最后回到CLOSED状态,释放网络资源。

6.Server收到Client返回的ACK包后便回到CLOSED状态,释放网络资源。

但是有些爬虫服务器或者WEB服务器为什么有时候会有大量TIME_WAIT状态出现?

从 上面的示意图可以看得出来,TIME_WAIT是主动关闭连接的一方保持的状态,在发完最后一个ack状态后,发起者的状态会调整为TIME_WAIT。 对于爬虫服务器来说他本身就是“客户端”,在完成一个爬取任务之后,他就 会发起主动关闭连接,从而进入TIME_WAIT的状态,然后在保持这个状态2MSL(max segment lifetime  /proc/sys/net/ipv4/tcp_fin_timeout)时间之后,彻底关闭回收资源。2MSL一般是大于30s,小于4分钟. 最小也要30s,再大就没啥意义了.  为什么要这么做?明明就已经主动关闭连接了为啥还要保持资源一段时间呢?这个是TCP/IP的设计者规定 的,主要出于以下两个方面的考虑:

1. 收到ack,但是迷路回包的情况: 防止上一次连接中的包,迷路后重新出现,影响干扰新连接(经过2MSL,上一次连接中所有的重复包都会消失)

2. ack丢失的情况: 在主动关闭方发送的最后一个 ack(fin) ,有可能丢失。这时候对方(被动方)会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。另外这么设计TIME_WAIT 会定时的回收资源,并不会占用很大资源的,除非短时间内接受大量请求或者受到攻击。

如果接收到rst,也就是tcp连接重置,服务端应用有报错。

reset报文发送场景:

RST的标志位,这个标识为在如下几种情况下会被设置。

1.当尝试和未开放的服务器端口建立tcp连接时,服务器tcp将会直接向客户端发送reset报文
2.双方之前已经正常建立了通信通道,也可能进行过了交互,当某一方在交互的过程中发生了异常,如崩溃等,异常的一方会向对端发送reset报文,通知对方将连接关闭
3.当收到TCP报文,但是发现该报文不是已建立的TCP连接列表可处理的,则其直接向对端发送reset报文
4.ack报文丢失,并且超出一定的重传次数或时间后,会主动向对端发送reset报文释放该TCP连接

另外我们做大量api请求时会遇到下面的问题. Broken pipe和Connection reset by peer  .   这其实也是reset的报错一种.

理解tcp关闭连接中的time_wait状态相关推荐

  1. tcp断开连接的几种状态

    FIN_WAIT_1:主动关闭连接的一方等待对方返回ACK包.若Socket在ESTABLISHED状态下主动关闭连接并向对方发送FIN包(表示己方不再有数据需要发送),则进入FIN_WAIT_1状态 ...

  2. TCP 连接中的TIME_WAIT

    原文:http://blog.csdn.net/wangpengqi/article/details/17245349 这就有个细节,一次http请求,谁会先断开TCP连接?什么情况下客户端先断,什么 ...

  3. 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇

    1. 查看系统网络配置和当前TCP状态         在定位并处理应用程序出现的网络问题时,了解系统默认网络配置是非常必要的.以x86_64平台Linux kernelversion 2.6.9的机 ...

  4. TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—基础知识篇...

    最近遇到一个线上报警:服务器出现大量TIME_WAIT导致其无法与下游模块建立新HTTP连接,在解决过程中,通过查阅经典教材和技术文章,加深了对TCP网络问题的理解.作为笔记,记录于此.       ...

  5. TCP面试常见题:time_wait状态产生的原因,危害,如何避免

    http://blog.csdn.net/u013616945/article/details/77510925 MSL(Maximum Segment Lifetime)最大报文生存时间       ...

  6. TCP协议连接的11种状态浅谈

    了解TCP的协议可以在很大程度上帮助我们分析服务器当前的TCP连接状态,同时也是排查一些网络故障的基础,首先来看一下TCP协议的三次握手与四次断开. TCP协议三次握手   1.客户端首先发起连接,也 ...

  7. 【计算机网络】TCP关闭连接问题及注意

    TCP状态: LISTEN:侦听来自远方的TCP端口的连接请求 SYN-SENT:再发送连接请求后等待匹配的连接请求 SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认 ES ...

  8. IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token

    1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动端IM)的数据流交换方式都是Http短连接+TCP或UDP长连接来实现.Http短连接主要用于从服务器读取各种持久化信息 ...

  9. [TCP/IP] TCP关闭连接为什么四次挥手

    1.建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端. 2.而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据 ...

最新文章

  1. Java项目:宿舍管理系统(java+jsp+SSM+Spring+mysql)
  2. 基于Socket的UDP和TCP编程介绍
  3. 《剑指offer》c++版本 8.二叉树的下一个结点
  4. python写入数据到excel_python实现查询的数据写入到excel
  5. linux5 vnc,CentOS 5 下安装配置VNC
  6. 神奇的CAReplicatorLayer
  7. 所有的生意都是在做两件事
  8. hibernate关联映射
  9. 有哪些是你踏入社会才明白的道理?
  10. Java并发:整理自《Java并发编程实战》和《Java并发编程的艺术》
  11. Windows server 2016 安装小度WiFi网卡驱动
  12. python写梦幻西游手游脚本辅助_GitHub - Sandry666/mhxy_fz: 一个基于计算机视觉开发的梦幻西游辅助脚本...
  13. CAN 报文编码学习笔记二:汽车CAN协议测试——发送与接收
  14. 平面设计基本艺术表现形式有哪些
  15. unit英语读音_unit是什么意思_unit翻译_读音_用法_翻译
  16. 如何为SharePoint文档库、文件夹、文件单独设置权限
  17. HTTP 状态返回码
  18. 软件开发团队的管理要素
  19. Linux 命令ps aux命令解析
  20. 企业数字化基础设施技术简介

热门文章

  1. HDU2011 多项式求和
  2. 敏捷方法在测试计划中的应用
  3. Jndroid——用应用开发的思路来开发 Web
  4. Gridcontrol新增行选中有关问题
  5. 现代网络管理员必备技能
  6. 牛客多校2 - Fake Maxpooling(线性递推gcd+单调队列)
  7. matlab扩充内存,matlab扩大内存的方法
  8. 每一个正整数可以表示为3个三角形数之和
  9. 6.OD-Run trace /Hit trace
  10. gh0st源码分析与远控的编写(一)