网络连接相关问题排查
1. 使用netstat
命令
1.1 参数解释
参数 | 解释 |
---|---|
-a | 显示所有连接和监听端口 |
-t | 仅显示TCP 连接 |
-u | 仅显示UDP 连接 |
-n | 以数字形式显示地址和端口号,而不是尝试解析名称 |
-l | 仅显示在监听状态的套接字 |
-p | 显示使用该链接的进程id(需要root权限) |
-r | 显示路由表 |
-i | 显示网络接口列表及其统计信息 |
1.2 结果列解释
列名 | 解释 |
---|---|
proto | 协议类型(TCP /UDP ) |
Recv-Q | 接收队列中的字节数 |
Send-Q | 发送队列中的字节数 |
Local Address | 本地IP地址和端口 |
Foreign Address | 远程IP地址和端口 |
State | 连接状态(如LISTEN ,ESTABLISHED ,TIME_WAIT 等) |
PID/Program name | 进程id或进程名称 |
1.3 案例解析
1.3.1 找到当前服务器中连接数使用最多的进程
netstat -tunp | awk '{print $7}' | cut -d'/' -f1 | sort | uniq -c | sort -nr | head
命令解释
netstat -tunp
: 显示TCP
和UDP
连接,以数字形式显示地址和端口,并显示进程ID。awk '{print $7}'
:提取上个命令输出中的第7列,通常是PID/Program name
列。cut -d'/' -f1'
:使用/
作为分隔符,从中提取第一个片段,即pid
。sort
:对进程ID进程排序。uniq -c
:统计每个进程ID出现的次数。sort -nr
:按照连接数进行降序排序。head
:显示连接数最多的前10个进程。
结果
[root@my-host-name admin]# netstat -tunp | awk '{print $7}' | cut -d'/' -f1 | sort | uniq -c | sort -nr | head
2198 -
145 1452252
4 2136313
1 Address
1 691
1 2510786
1 1675446
1 1003284
1
- 结果解析
- 连接数使用第二多的进程id已经出来了。
- 但是连接数使用最多的进程id没有打印出来,可以看第2个案例了
1.3.2 查看当前服务器中连接状态的统计
netstat -tunp | awk '{print $6}' | sort | uniq -c | sort -nr | head
- 参数解析不再赘述,参考案例1。
- 结果
[root@my-host-name admin]# netstat -tunp | awk '{print $6}' | sort | uniq -c | sort -nr | head
2323 TIME_WAIT
145 ESTABLISHED
1 Foreign
1
- 结果解析
- 有
2323
个连接处于TIME_WAIT
状态,这在TCP
协议中,是主动发起关闭的一方才会有的状态。 - 有
145
个连接处于ESTABLISHED
状态,和案例1中进程号1452252
对应的连接数差不多,应该是这个进程建立了这么多连接。确认方法参考案例3。 - 接下来我们要找出是哪个进程导致了这么多
TIME_WAIT
状态产生,参考案例3。
- 有
1.3.3 统计产生TIME_WAIT
状态连接的本地端口号前3名。
netstat -tunp | grep TIME_WAIT | awk '{print $4}' | cut -d':' -f2 | sort | uniq -c | sort -nr | head -n 3
参数解析
sort -nr
:降序排序head -n 3
:展示3条数据,结合前面就是展示处于TIME_WAIT
状态最多的3个端口号。
结果
[root@my-host-name admin]# netstat -tunp | grep TIME_WAIT | awk '{print $4}' | cut -d':' -f2 | sort | uniq -c | sort -nr | head -n 3
2236 8090
1 60446
1 59712
- 结果解析
- 可以看出,是
8090
端口产生了这么多的TIME_WAIT
。 - 找出监听
8090
端口的进程,参考案例4。
- 可以看出,是
1.3.4 找出端口对应的进程id
netstat -tunlp|grep 8090
参数解析
-l
:仅显示处于监听状态的socket
。如果不加-l
参数会打印出和8090
端口相关的所有连接,但是我们只想知道是哪个进程在监听8090
端口,所以要加上-l
参数。
结果
[root@my-host-name admin]# netstat -tunlp|grep 8090
tcp6 0 0 :::8090 :::* LISTEN 1452252/java
- 结果解析
- 是一个
Java进程
,进程ID是1452252
,可以通过ps
命令找到是哪个具体的进程了。
- 是一个