网络连接相关问题排查

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命令找到是哪个具体的进程了。
上次更新时间: