一、连接状态

LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:表示处理完毕,等待超时结束的请求数。
LAST_ACK:等待所有分组死掉
CLOSED:无连接是活动的或正在进行

二、TCP状态转移要点

TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。

1、LISTENING状态

FTP服务启动后首先处于侦听(LISTENING)状态。

2、ESTABLISHED状态

ESTABLISHED的意思是建立连接,表示两台机器正在通信。

3、CLOSE_WAIT
对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT,此时我方要调用close()来使得连接正确关闭。

4、TIME_WAIT
我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。

TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分 段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情 况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。     目前有一种避免TIME_WAIT资源浪费的方法,就是关闭socket的LINGER选项。但这种做法是TCP协议不推荐使用的,在某些情况下这个操作可能会带来错误。

5、SYN_SENT状态

SYN_SENT状态表示请求连接,当你要访问其它的计算机的服务时首先要发个同步信号给该端口,此时状态为SYN_SENT,如果连接成功了就变为 ESTABLISHED,此时SYN_SENT状态非常短暂。但如果发现SYN_SENT非常多且在向不同的机器发出,那你的机器可能中了冲击波或震荡波之类的病毒了。这类病毒为了感染别的计算机,它就要扫描别的计算机,在扫描的过程中对每个要扫描的计算机都要发出了同步请求,这也是出现许多 SYN_SENT的原因。

根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用。

具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket,甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务。

TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证。

三、TCP协议中有TIME_WAIT这个状态

存在TIME_WAIT主要有两个原因:

  1. 防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
  2. 可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发 fin,如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

1、查看网络连接数

netstat -an |grep xx |wc -l             查看某个/特定ip的连接数
netstat -an |grep TIME_WAIT|wc -l       查看连接数等待time_wait状态连接数
netstat -an |grep ESTABLISHED |wc -l    查看建立稳定连接数量# 查看不同状态的连接数数量
[root@localhost ~]# netstat -an | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'
LISTEN 7
ESTABLISHED 2

一般情况下,系统的socket资源默认5000个。(非官方)

2、查看每个ip跟服务器建立的连接数

[root@localhost ~]# netstat -nat|grep "tcp"|awk ' {print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn
4
3 0.0.0.0
2 192.168.79.1# PS:正则解析:显示第5列,-F : 以:分割,显示列,sort 排序,uniq -c统计排序过程中的重复行,sort -rn 按纯数字进行逆序排序)

3、查看每个ip建立的ESTABLISHED/TIME_OUT状态的连接数

[root@localhost ~]# netstat -nat|grep ESTABLISHED|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn
2 192.168.79.1

四、怎么解决大量Time_Wait 通过调整内核参数

vim /etc/sysctl.conf # 编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30 # 然后执行 /sbin/sysctl -p 让参数生效。

配置说明:

net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1  表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;

net.ipv4.tcp_fin_timeout = 30修改系統默认的 TIMEOUT 时间。

如果以上配置调优后性能还不理想,可继续修改一下配置:

vi /etc/sysctl.confnet.ipv4.tcp_keepalive_time = 1200
# 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。net.ipv4.ip_local_port_range = 1024 65000
# 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。net.ipv4.tcp_max_syn_backlog = 8192
# 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。net.ipv4.tcp_max_tw_buckets = 5000
# 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。
# 默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量。
# 但是对于 Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

四、怎么解决请求结束后,存在大量ESTABLISHED没有被释放

初步推断是tomcat服务器回收session时出了问题,这个一般都跟服务器的Timeout设置有联系。
查看tomcat的配置文件 server.xml

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

检查配置得出20000毫秒的时候acceptCount=”100” ,明显不合理,最大连接数也太小了吧。

所以进一步优化:

connectionTimeout="20000" 改为 connectionTimeout="100"
acceptCount="100" 改为 acceptCount="5000"

查看TCP连接状态及问题排查相关推荐

  1. netstat查看TCP连接状态

    这篇文章主要记录一下使用netstat查看tcp连接状态的实例 tcp的连接状态主要是通过三次握手和四次挥手进行状态转移,关于三次握手和四次挥手的详情可以看我的上一篇文章<总结三次握手和四次挥手 ...

  2. linux查看tcp连接状态_Linux使用lsof查看打开的文件和网络连接

    lsof是List Open Files的缩写.顾名思义,它用来查看系统中进程打开了哪些文件:因为Linux几乎所有的设备都可以看成是文件,所以lsof经常也可以用来查看管道,sockets的使用状态 ...

  3. linux查看tcp连接状态

    netstat -an |grep tcp   查看所有tcp连接包括LISTEN状态 netstat -an |grep ESTABLISHED   查看所有正在连接中的tcp连接 如果需要统计tc ...

  4. CentOS查看系统连接状态

    1.查看TCP连接状态 netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn netstat -n | awk '/^tcp/ {++S[$NF]} ...

  5. 查看 并发请求数及其TCP连接状态

    服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数 ps -ef|grep httpd| ...

  6. 查看Apache的并发请求数及其TCP连接状态

    查看Apache的并发请求数及其TCP连接状态: Linux命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a] ...

  7. 查看Apache并发请求数及其TCP连接状态 --张宴

    [ 2007-7-20 18:30 | by 张宴 ]     [文章作者:张宴 本文版本:v1.1 最后修改:2007.07.27 转载请注明出处:http://blog.s135.com] 这两天 ...

  8. 查看httpd并发请求数及其TCP连接状态

    服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数 ps -ef|grep httpd| ...

  9. TCP 连接状态及相关命令学习

    在平时的开发工作中,我们都使用被封装完好的 TCP/HTTP 库去完成需求开发,很少关心底层 TCP 的连接状态,但是一旦遇到较难定位的线上事故,往往都是因为 TCP 连接参数或者使用姿势不对导致的, ...

最新文章

  1. 只因接了一个电话,程序员被骗 30 万!
  2. ArUco估计位姿原理
  3. window.location.Reload()和window.location.href 区别
  4. 数据结构 图的广度优先遍历 C++
  5. Swing实现全屏(覆盖任务栏和不覆盖任务栏)
  6. qt5 交叉编译webkit_基于QT平台的交叉编译环境搭建的架构分析
  7. 输出语句 WriteLine 与格式化输出 1006 c#
  8. crack翻译成中文_crack是什么意思_crack在线翻译_英语_读音_用法_例句_海词词典
  9. 7-3 输出最大公约数 (10 分)
  10. Linux之atime,ctime,mtime的区别
  11. java代码发送邮箱_邮件发送 - java代码库 - 云代码
  12. JDBC更新10W级以上数据性能优化
  13. ICD-10/11 查询疾病编码方法
  14. Linux 环境下,搭建 ZooKeeper 集群
  15. 2022年湖北省房地产经纪人(房地产经纪业务操作)练习题及答案
  16. 苹果电脑Chrome浏览器截网页长图
  17. 计算机03年word做母亲节贺卡,word2007怎样制作电子母亲节贺卡
  18. 【毕业设计】深度学习人脸性别年龄识别系统 - python
  19. 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一
  20. 计算机屏幕最小值,虚拟内存最大值最小值如何设置好?

热门文章

  1. 屏幕光标控制(汇编)
  2. 青橙商城项目总结day02
  3. 如何申请使用FSC的商标
  4. 劳动仲裁申请先予执行的规则是怎样的
  5. 红米1s刷机包(卡刷)
  6. (基于Python的毕业设计)微博舆情分析系统(附源码+论文)
  7. 20190911-哔哩哔哩ios开发-笔试
  8. php二维数组倒序,几行代码搞定PHP二维数组排序
  9. XC7K325T+TX2深度学习图像处理卡
  10. 计算机通信电气电子适合女生学,工科哪个专业女生多 适合女生学的专业