理解tcp关闭连接中的time_wait状态
首先看一下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状态相关推荐
- tcp断开连接的几种状态
FIN_WAIT_1:主动关闭连接的一方等待对方返回ACK包.若Socket在ESTABLISHED状态下主动关闭连接并向对方发送FIN包(表示己方不再有数据需要发送),则进入FIN_WAIT_1状态 ...
- TCP 连接中的TIME_WAIT
原文:http://blog.csdn.net/wangpengqi/article/details/17245349 这就有个细节,一次http请求,谁会先断开TCP连接?什么情况下客户端先断,什么 ...
- 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇
1. 查看系统网络配置和当前TCP状态 在定位并处理应用程序出现的网络问题时,了解系统默认网络配置是非常必要的.以x86_64平台Linux kernelversion 2.6.9的机 ...
- TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—基础知识篇...
最近遇到一个线上报警:服务器出现大量TIME_WAIT导致其无法与下游模块建立新HTTP连接,在解决过程中,通过查阅经典教材和技术文章,加深了对TCP网络问题的理解.作为笔记,记录于此. ...
- TCP面试常见题:time_wait状态产生的原因,危害,如何避免
http://blog.csdn.net/u013616945/article/details/77510925 MSL(Maximum Segment Lifetime)最大报文生存时间 ...
- TCP协议连接的11种状态浅谈
了解TCP的协议可以在很大程度上帮助我们分析服务器当前的TCP连接状态,同时也是排查一些网络故障的基础,首先来看一下TCP协议的三次握手与四次断开. TCP协议三次握手 1.客户端首先发起连接,也 ...
- 【计算机网络】TCP关闭连接问题及注意
TCP状态: LISTEN:侦听来自远方的TCP端口的连接请求 SYN-SENT:再发送连接请求后等待匹配的连接请求 SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认 ES ...
- IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token
1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动端IM)的数据流交换方式都是Http短连接+TCP或UDP长连接来实现.Http短连接主要用于从服务器读取各种持久化信息 ...
- [TCP/IP] TCP关闭连接为什么四次挥手
1.建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端. 2.而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据 ...
最新文章
- Java项目:宿舍管理系统(java+jsp+SSM+Spring+mysql)
- 基于Socket的UDP和TCP编程介绍
- 《剑指offer》c++版本 8.二叉树的下一个结点
- python写入数据到excel_python实现查询的数据写入到excel
- linux5 vnc,CentOS 5 下安装配置VNC
- 神奇的CAReplicatorLayer
- 所有的生意都是在做两件事
- hibernate关联映射
- 有哪些是你踏入社会才明白的道理?
- Java并发:整理自《Java并发编程实战》和《Java并发编程的艺术》
- Windows server 2016 安装小度WiFi网卡驱动
- python写梦幻西游手游脚本辅助_GitHub - Sandry666/mhxy_fz: 一个基于计算机视觉开发的梦幻西游辅助脚本...
- CAN 报文编码学习笔记二:汽车CAN协议测试——发送与接收
- 平面设计基本艺术表现形式有哪些
- unit英语读音_unit是什么意思_unit翻译_读音_用法_翻译
- 如何为SharePoint文档库、文件夹、文件单独设置权限
- HTTP 状态返回码
- 软件开发团队的管理要素
- Linux 命令ps aux命令解析
- 企业数字化基础设施技术简介