TIME_WAIT的危害与避免
time-wait的产生:
在TCP连接中四次挥手关闭连接时,主动关闭连接的一方(上图中时Client)会在发送最后一条ACK报文后维持一段时长2MSL(MSL指的是数据包在网络中的最大生存时间)的等待时间后才会真正关闭连接到CLOSED状态,该时间段内主动关闭方的状态为TIME_WAIT。即在TIME_WAIT状态时,定义这个连接的四元组(源/目的IP、源/目的端口)不能被使用。
time_wait存在的原因:
为实现tcp连接的可靠释放
情况一: 若主动断开连接方(上图中Client)最后一次ACK报文丢失了,会触发被动方(上图中Server)的超时重传机制,Server再次向Client发送FIN+ACK报文,如果Client在发送完最后一次ACK后立即断开连接(没有TIME_WAIT状态),则Server会收到RST=1的报文响应,表示连接建立异常,而此时并非异常,只是正常的关闭连接过程,进而导致Server端不能正常关闭连接。因此,Client必须维护2MSL的等待时间,确保在Server端第二次发送的FIN+ACK被Client正常接收,收到后Client立即发送ACK给Server,并重新启动2MSL计时器。
情况二:为使旧的重复数据包在网络中因过期而消失。可能存在一些数据包在传输过程中出现异常而导致严重推迟,而在它到来之前发送方已经重发了该报文,并完成其任务。如果在被推迟的报文未抵达前接收方断开了连接,随后又建立了一个与之前相同IP、Port的连接,而之前被推迟的报文在这时恰好到达,而此时此新连接非彼连接,从而会发生数据错乱,进而导致无法预知的情况。因此必须维持一段等待时间,使迟到的报文在网络中完全消失,并且在等待时间内,因为连接并未关闭,所以不能建立相同四元组的新连接,就不会出现数据错乱。
保活计时器
尽管维护了TIME_WAIT状态,双方也并非一定能正确关闭连接,
情况一:若被动关闭连接的一方没有收到对方的最后一条ACK,而重发FIN+ACK,而FIN+ACK也丢失了,并且在TIME_WAIT等待时间内,一直丢包,导致等待时间过后一方关闭连接,而被动关闭的一方因始终没有收到最后一个ACK而无法关闭连接。
情况二:两台主机建立连接成功后,一方因故障断网/断电,而另一方并不知情会一直白白等下去,显然这并不合理。
当发生以上两种情况时,就会用到保活计时器。服务器每收到一次客户的数据,就会重新设置保活计时器,若直到计时器时间内没有收到客户端的数据,服务器就发送一个探测报文段,以后每隔一段时间发送一次,如连续发送n个探测报文让没有收到客户的响应,服务器就认为客户端出现了故障,会主动关闭该连接。
注意:进程退出时,进程所拥有的文件描述符(包含socket)都会被释放,文件会被关闭,也就是会执行close,对于TCP连接来说就是进程会主动关闭连接。机器关机相同(OS会先关闭所有服务再关机)
time_wait造成的危害:
1)在高并发短连接的TCP服务器上,当服务器处理完请求后主动请求关闭连接,这样服务器上会有大量的连接处于TIME_WAIT状态,服务器维护每一个连接需要一个socket,也就是每个连接会占用一个文件描述符,而文件描述符的使用是有上限的,如果持续高并发,会导致一些连接失败。
2)网络情况不好时,如果主动方无TIME_WAIT等待,关闭前个连接后,主动方与被动方又建立起新的TCP连接,这时被动方重传或延时过来的FIN包过来后会直接影响新的TCP连接;
3)过多的话会占用内存,一个TIME_WAIT占用4k大小
4)同样网络情况不好并且无TIME_WAIT等待,关闭连接后无新连接,当接收到被动方重传或延迟的FIN包后,会给被动方回一个RST包,可能会影响被动方其它的服务连接。
如何避免:
1)设置套接字选项为SO_REUSEADDR,该选项的意思是,告诉操作系统,如果端口忙,但占用该端口TCP连接处于TIME_WAIT状态,并且套接字选项为SO_REUSEADDR,则该端口可被重用。如果TCP连接处于其他状态,依然返回端口被占用。该选项对服务程序重启非常有用。
2)由于time_wait状态是在主动关闭的一方出现的,所以在设计协议逻辑的时候,尽量由客户端主动关闭,避免服务端出现time_wait
TIME_WAIT的危害与避免的更多相关文章
- Linux系统编程温故知新系列 --- 01
1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数 ...
- 微信支付 php发送POST请求
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=20_1 <_xml> <mch_id>132</mc ...
- TCP/IP网络编程
https://blog.csdn.net/a987073381/article/details/52206215 TCP的传输连接分为3个阶段:连接建立(三次握手).数据传送和连接释放(四次 ...
- Linux 从4.12内核版本开始移除了 tcp_tw_recycle 配置。 tcp_max_tw_buckets TIME-WAIT 稳定值
被抛弃的tcp_recycle_小米云技术-CSDN博客_sysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recy https://blog.csdn.ne ...
- 三次握手 四次握手 原因分析 TCP 半连接队列 全连接队列
小结 1. 三次握手的原因:保证双方收和发消息功能正常: [生活模型] "请问能听见吗""我能听见你的声音,你能听见我的声音吗" [原理]A先对B:你在么?我在 ...
- 【网络编程】time_wait状态产生的原因,危害,如何避免
转自:https://blog.csdn.net/u013616945/article/details/77510925 做略微修改 仅供个人学习 1. time_wait状态如何产生? 在tcp ...
- TIME_WAIT引起Cannot assign requested address报错
1. 问题描述 有时候用redis客户端(php或者java客户端)连接Redis服务器,报错:"Cannot assign requested address." 原因是客户端 ...
- Time_wait问题小结
TIME_WAIT的产生原因 因为TCP连接是双向的,所以在关闭连接的时候,两个方向各自都需要关闭.先发FIN包的一方执行的是主动关闭:后发FIN包的一方执行的是被动关闭.主动关闭的一方会进入TIME ...
- (转)理解TIME_WAIT,彻底弄清解决TCP: time wait bucket table overflow
转载自http://blog.51cto.com/benpaozhe/1767612: 一直对这个问题知其然而不知其所以然,这些日子再次碰到,看了很多的资料,彻底解决一下,呵呵,先上个图,所有理解围绕 ...
随机推荐
- elasticsearch在linux上的安装,Centos7.X elasticsearch 7.6.2
本文环境:Elasticsearch7.6.2目前最先版本 centos7.X JDK1.8 elasticsearch介绍 官网:https://www.elastic.co/cn/pr ...
- Hadoop调试记录(2)
自从上次调通hbase后很久没有碰hadoop了,今日想写一个mapreduce的小程序.于是先运行了下自带的wordcount示例程序,却报错了. 信息如下: kevin@ubuntu:~/usr/ ...
- java 第六周上机练习 04.09
1.编写一个简单程序,要求数组长度为5,静态赋值10,20,30,40,50,在控制台输出该数组的值. int [] arr= {10,20,30,40,50}; for(int i=0;i<a ...
- JQ前端上传图片显示在页面以及发送到后端服务器
// 单张上传照片 html: <div class="azwoo"></div> <div class="azwot"& ...
- Redis 哨兵模式(Sentinel)
上一篇我们介绍了 redis 主从节点之间的数据同步复制技术,通过一次全量复制和不间断的命令传播,可以达到主从节点数据同步备份的效果,一旦主节点宕机,我们可以选择一个工作正常的 slave 成为新的主 ...
- 1065 A+B and C (64bit) (20分)(水)
Given three integers A, B and C in [−], you are supposed to tell whether A+B>C. Input Specificati ...
- java中封装,继承,多态,接口学习总结
### 一:封装java中封装是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问.要访问该类的代码和数据,必须通 ...
- 构建LNMP
构建LNMP 案例1:部署LNMP环境 案例2:构建L ...
- docker-compose中加入nginx 日志和部署下载
服务器部署了nginx镜像,所以加入一个日志查看,添加一下静态页面下载. 1.查看nginx镜像怎么部署的 nginx: image: nginx ports: - '80:80' volumes: ...
- 使用VirtualBox+Vagrant快速搭建Linux虚拟机环境
1. 软件准备 下载.安装Virtual Box https://www.virtualbox.org/wiki/Downloads 下载.安装Vagrant https://www.vagrantu ...