Linux查看网络连接数,ss和netstat命令统计
前言
服务器被攻击了?网站访问量突然暴涨?想看看当前有多少人在连接你的服务器?这时候就需要查看网络连接数了。ss 和 netstat 是两个最常用的网络连接查看命令,ss 是新版,速度更快,推荐优先用。本文就讲一下怎么用这两个命令统计网络连接数、排查网络问题。
ss 命令(推荐)
ss 是 iproute2 包自带的,比 netstat 快很多,尤其是连接数很多的时候。
基本用法
ss
显示所有TCP和UDP连接。
统计各状态连接数
ss -s
输出示例:
Total: 120
TCP: 80 (estab 30, closed 40, orphaned 0, timewait 20)
Transport Total IP IPv6
RAW 0 0 0
UDP 5 3 2
TCP 80 60 20
INET 85 63 22
FRAG 0 0 0
这就是全局统计,一眼就能看出当前有多少连接。
查看TCP连接
ss -t
只显示TCP连接。
查看所有监听端口
ss -tlnp
参数说明:
-t:TCP-l:只显示监听状态的-n:不解析域名,直接显示IP和端口-p:显示进程名
统计某个端口的连接数
比如统计80端口的连接数:
ss -tn | grep :80 | wc -l
统计各状态的TCP连接数
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn
输出示例:
40 ESTAB
30 TIME-WAIT
10 LISTEN
5 CLOSE-WAIT
netstat 命令
netstat 是老牌命令,很多老脚本还在用。
基本用法
netstat -tlnp
查看监听的TCP端口。
统计各状态连接数
netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
统计某个端口的连接数
netstat -an | grep :80 | wc -l
查看哪个进程在监听某个端口
netstat -tlnp | grep :80
连接状态详解
TCP连接有很多状态,常见的:
| 状态 | 含义 |
|---|---|
ESTABLISHED |
已建立连接,正在通信 |
LISTEN |
监听中,等待连接 |
TIME_WAIT |
主动关闭方等待,防止旧包干扰新连接 |
CLOSE_WAIT |
被动关闭方等待,说明程序没正确关闭连接 |
FIN_WAIT1 |
主动关闭方,等待对方回应 |
FIN_WAIT2 |
主动关闭方,已经收到对方回应 |
重点关注:
ESTABLISHED多:说明当前活跃连接多,正常TIME_WAIT多:说明短连接很多,正常但要注意CLOSE_WAIT多:说明程序有bug,没正确关闭连接
实际排查案例
案例1:看看当前有多少人访问网站
ss -tn | grep :80 | grep ESTAB | wc -l
统计80端口已建立连接的数量。
案例2:看看哪个IP连接最多
ss -tn state established '( sport = :80 )' | awk '{print $4}' | awk -F: '{print $1}' | sort | uniq -c | sort -rn | head -10
输出连接最多的前10个IP。
案例3:看看是不是被攻击了
如果突然有大量 TIME_WAIT 或 CLOSE_WAIT,可能是被攻击了。
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn
常见坑
坑1:连接数多就是被攻击了
连接数多不一定是被攻击。如果是正常的网站访问量上涨,连接数多是正常的。要看连接来源IP分布和连接状态。
坑2:TIME_WAIT 多就优化
TIME_WAIT 是TCP协议的正常机制,不需要太紧张。除非 TIME_WAIT 数量特别多(几万几十万),影响了性能,再考虑优化。
坑3:CLOSE_WAIT 多不处理
CLOSE_WAIT 多说明你的程序有bug,没有正确关闭连接。时间长了会把文件句柄用完,导致新连接建不起来。这是程序问题,要改代码。
总结
查看网络连接数的核心命令:
- ss -s:快速看全局统计
- ss -tlnp:看监听端口和对应进程
- ss -tan | awk '{print $1}' | sort | uniq -c:统计各状态连接数
- netstat:老命令,兼容性好,但慢
推荐用 ss,比 netstat 快很多,尤其是连接数很多的时候。
遇到问题加QQ23979811 协助处理