Linux服务器有大量的TIME_WAIT状态
我们经常会遇到在服务器上看到大量的TIME_WAIT,它们占用进程不释放,最后会导致所有进程数被耗完,服务器负载增高等生产事故,具体是什么原因导致的呢?我们先来看看TCP的三次握手四次挥手都是怎样的一个过程。
TCP三次握手
三次握手的过程如下图:
具体的过程如下:
(1)、客户端主动发起连接,向服务端监听的端口发送SYN包和一个随机的序列seq到服务端;
(2)、服务端收到SYN包后,回复客户端,发送ACK包(收到的seq加1)和一个随机序列到客户端;
(3)、客户端收到ACK包后,回复服务端,发送一个ACK包(收到的seq加1);
由上图可以看到具体的状态变化,值得注意的是SYN_RECV状态,有时候我们会发现服务器上有大量的SYN_RECV状态,看到这个一般就可以确定是著名的SYN泛洪攻击,它就是用大量的伪终端来连接服务端,服务端回复ACK(也就是步骤2),由于这些终端都不存在,所以就会在第二部卡住了,造成服务端有大量的SYN_RECV状态,不断的消耗TCP进程数,导致正常业务无法建立正常连接。详细过程请移步至百度百科。
TCP四次挥手
四次挥手的过程如下图:
具体过程如下:
(1)、客户端主动发起断开连接,发送FIN包到服务端;
(2)、服务端收到FIN包后回复ACK包给客户端;
(3)、服务端发起断开连接,发送FIN包到客户端;
(4)、客户端收到FIN包后回复ACK给服务端;
具体过程还是比较简单,详情可以由上图可知。这里要注意三个状态:CLOSE_WAIT、TIME_WAIT和FIN_WAIT2。
其中CLOSE_WAIT是出现在被动断开方,如上图就是服务端。如果服务端出现大量的CLOSE_WAIT状态,一般情况下是由于程序中没有正常调用close()关闭连接,所以出现这个问题一般是会结合开发一起找原因。
FIN_WAIT2状态会等待服务端发送SYN断开连接,如果服务端一直没有发送断开,客户端会等待tcp_fin_timeout时间断开socket连接,如果有大量的FIN_WAIT2状态,就要检查服务端的应用程序是否调用close()关闭连接,如果一时查不出原因,可以修改内核参数tcp_fin_timeout的时间,比如:net.ipv4.tcp_fin_timeout=30。
而对于TIME_WAIT,它只会出现在主动断开方,也就是上图中的客户端。之所以有TIME_WAIT这个状态而不是直接编程CLOSED状态主要有以下两个原因:
(1)、保证服务端能够正常收到最后一个ACK包,确保是正常断开,可靠释放;
(2)、防止数据错乱。假如没有这个TIME_WAIT状态,假设当前有一条连接,因某些原因先关闭,紧接着又以相同的四元组建立一条新的连接,由于TCP无法区分这两条连接有什么不同,就可能会发生这样的情况:发送数据可能会发送到上一条连接中,这就会出现一些数据混乱的问题。
TIME_WAIT状态有一个默认过期时间,默认是2MSL(最大生存时间),不同的操作系统默认的MSL是不一样的。如果有大量的TIME_WAIT,就会造成本地端口不释放,无法通过这个端口建立新的连接,如果本地端口都用完了,就会出现无法建立TCP连接来访问服务端了。
解决方法一般有两种(具体需要根据自身情况来定):
1、调节内核参数,以CentOS为例,主要的参数有tcp_max_tw_buckets、tcp_tw_recycle、tcp_tw_reuse这三个配置项。
(1)、tcp_max_tw_buckets:该配置项用来防范简单的DoS攻击 ,在某些情况下,可以适当调大,但绝对不应调小。
(2)、tcp_tw_recycle:该配置项可用于快速回收处于TIME_WAIT状态的socket以便重新分配。默认是关闭的,必要时可以开启该配置。
(3)、tcp_tw_reuse:开启该选项后,kernel会复用处于TIME_WAIT状态的socket,当然复用的前提是“从协议角度来看,复用是安全的”。
2、修改应用程序。
(1)、将TCP短连接改造为长连接。通常情况下,如果发起连接的目标也是自己可控制的服务器时,它们自己的TCP通信最好采用长连接,避免大量TCP短连接每次建立/释放产生的各种开销;如果建立连接的目标是不受自己控制的机器时,能否使用长连接就需要考虑对方机器是否支持长连接方式了。
(2)、通过getsockopt/setsockoptapi设置socket的SO_LINGER选项。
Linux服务器有大量的TIME_WAIT状态的更多相关文章
- linux服务器,发现大量TIME_WAIT
linux服务器,发现大量TIME_WAIT 今天登陆linux服务器,发现大量TIME_WAIT参考资料:http://coolnull.com/3605.html 酷喃|coolnull| » 大 ...
- LINUX下解决netstat查看TIME_WAIT状态过多问题
来源:多3度热爱 的BLOG 查看连接某服务端口最多的的IP地址 netstat -nat |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c ...
- LINUX下解决netstat查看TIME_WAIT状态过多问题(转)
原文连接:www.itokit.com/2012/0516/73950.html # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c 16 CLOSIN ...
- 服务器TCP连接中 TIME_WAIT 状态过多
今天查看服务器的TCP连接数,发现其中 TIME_WAIT 状态的太多了: # netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a ...
- Linux-TCP/IP TIME_WAIT状态原理
TIME_WAIT状态原理---------------------------- 通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态. 客户端主动关闭连接时,会发送最后一个a ...
- TCP/IP TIME_WAIT状态原理
原文转载:http://elf8848.iteye.com/blog/1739571 IME_WAIT状态原理 ---------------------------- 通信双方建立TCP连接后,主动 ...
- 001_TCP/IP TIME_WAIT状态原理及监控实战
一.原理 <1>TIME_WAIT状态原理---------------------------- 通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态. 客户端主动 ...
- 网络--TIME_WAIT状态
MSL时间 MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 .MSL在RFC 1122 ...
- [转]Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解
一.Linux服务器上11种网络连接状态: 图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1.TCP三次握手;2.数据传送;3.TCP四次挥手. 注:以下说明最好能结合”图:T ...
随机推荐
- 队列的含义以及C语言实现顺序队列
队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构. 什么是队列 与栈结构不同的是,队列的两端都"开口",要求数据只能从 ...
- C++_编程前奏
计算机硬件系统 计算机操作系统的五大组成部分 计算机操作系统的组成部分 构成 控制器 指令寄存器(IR)/程序计数器(PC)/操作控制器(OC) 运算器 算数逻辑单元/累加器/状态寄存器/通用寄存器 ...
- 09-sass
一.sass和scss sass最初是为了配合haml设计的,不需要大括号,用tab缩进 从第三代开始,保留缩进风格,完全向下兼容普通的css代码 二.下载配置sass compass是sass的一个 ...
- Simple Chat Application for Python
一.知识点介绍: asyncore .asynchat模块使用 由于 Python 是一门带 GIL 的语言,所以在 Python 中使用多线程处理IO操作过多的任务并不是很好的选择.同时聊天服务器将 ...
- Mac 窗口管理软件 Spectacle
我个人使用的窗口管理软件是 Magnet(本人在 Mac 下付费的首款软件,记得是 6 元~),今天为大家介绍一款类似的开源软件. 简介 Spectacle 是一款可以快速调整窗口大小与位置的开源软件 ...
- 上班无聊,自己用python做个小游戏来打发时间
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取t.cn ...
- stand up meeting 1/7/2016
part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 调研下滑条的存在问题,尝试替换方案 6 全面实行替换 ...
- X - Ehab and Path-etic MEXs CodeForces - 1325C
MMP,差一点就做对了. 题目大意:给你一个树,对这个树的边进行编号,编号要求从0到n-1,不可重复,要求MEX(U,V)尽可能的小, MEX(x,y)的定义:从x到y的简单路径上,没有出现的最小编号 ...
- Springboot:第一个Springboot程序(一)
1.创建Springboot项目 选择创建Springboot项目: 填写项目基本信息: 选择Springboot版本以及web依赖(内嵌tomcat): 创建完成: 创建完成后 等待构建maven项 ...
- JS在线代码编辑器多种方案monaco-editor,vue-monaco-editor
前言 JavaScript在线代码编辑器. 需要代码提示,关键字高亮,能够格式化代码.(不需要在线运行) 简简单单的需求. 方案一: Monaco-editor 简介:微软的开源项目,开源中国上面的在 ...