skip to content
FaiChou's blog

Debug network on linux

/ 5 min read

nload

nload 是一个网卡级实时监控工具, 直接输入 nload 命令就可以实时查看网卡的 upload / download 速率以及累计传输量。通过左右键盘可以切换不同的网卡。

vnstat

vnstat 统计的是所有经过网络接口的流量,直接从内核获取网络接口的计数器信息(如 /proc/net/dev)。

$ vnstat
Database updated: 2025-11-18 10:50:00
ens17 since 2025-09-22
rx: 17.80 GiB tx: 9.59 GiB total: 27.39 GiB
monthly
rx | tx | total | avg. rate
------------------------+-------------+-------------+---------------
2025-10 8.71 GiB | 4.93 GiB | 13.64 GiB | 43.74 kbit/s
2025-11 6.23 GiB | 2.55 GiB | 8.79 GiB | 50.05 kbit/s
------------------------+-------------+-------------+---------------
estimated 10.72 GiB | 4.38 GiB | 15.10 GiB |
daily
rx | tx | total | avg. rate
------------------------+-------------+-------------+---------------
yesterday 210.56 MiB | 53.32 MiB | 263.88 MiB | 25.62 kbit/s
today 89.09 MiB | 21.22 MiB | 110.30 MiB | 23.73 kbit/s
------------------------+-------------+-------------+---------------
estimated 197.36 MiB | 47.00 MiB | 244.36 MiB |

nethogs

hog 在英文里指“贪婪的家伙(猪)、占资源的东西”,所以 nethogs 是找出哪些进程在疯狂吃网速。可以很直观的看到哪一个进程跑多少网速。

nethogs

iftop

实时显示每个网络连接的带宽占用,让你知道“这台机器正在和谁通信、每条连接跑多少流量”。

它在最顶部有个刻度,下面每一条连接如果有数据传输会有背景来表示,进度条越长代表占用的带宽越大。

每一个连接有左右两个箭头,代表数据传输的方向。

最右侧的三列代表2s,10s,40s 的平均带宽。

最下面 TX 代表发送,RX 代表接收。cum 代表累计,peak 代表峰值。

一般建议使用 S 和 D 来开启源端口和目标端口。

iftop

ss

ss(Socket Statistics) 查看网络连接、路由表、接口统计信息等, 比 netstat 强大,性能更好,ss 直接从内核(netlink)读取 socket 信息。核心功能如下:

  • 查看所有 TCP/UDP/UNIX socket
  • 查看连接状态(ESTAB, TIME-WAIT, CLOSE-WAIT, SYN-SENT…)
  • 查看局部和对端地址
  • 查看进程(-p)
  • 查看 socket 内核细节(-i)
  • 过滤比 netstat 强太多(state, dst, src, sport, dport, addr…)
参数含义
-tTCP
-uUDP
-xUNIX socket
-a全部(包括监听)
-l只看监听
-p显示 PID + 进程名
-n不解析 DNS/服务名
-4/-6只看 IPv4 / IPv6
-i内核 socket info(最有价值)
-s统计(总概要)
-rresolve host names

常用命令如下:

# 看所有 TCP + 进程名
$ ss -tp
# 看所有正在建立的连接(ESTAB)
$ ss -t state established
# 看某个端口的连接(比如 443)
$ ss -tna '( sport = :443 or dport = :443 )'
# 看所有监听的 TCP 端口
$ ss -ltn
# 显示所有目标端口是 80(HTTP)或 443(HTTPS)的连接
$ ss -t dst :80 or dst :443
# 显示所有源地址是 192.168.1.100 的连接
$ ss src 192.168.1.100
# 显示所有连接到远程 IP 8.8.8.8 的连接
$ ss dst 8.8.8.8

在 linxu 中 /etc/services 配置文件像一个电话薄,记录了端口号和服务名称的映射关系,默认情况下 ss 会去自动查找这个记录将端口号转换为服务名称,如果加上 -n 参数,那么它就不会去查找这个表,而是直接显示端口号。

-r 参数代表尝试解析主机名, 会将对应的 ip 地址解析为域名,比如 192.168.1.100:56789 142.251.211.46:443 会解析为 my-pc.local:56789 lga34s31-in-f14.1e100.net:https

一个进程可能监听某个端口,那么它的状态就是 listen, 可以使用 -l 来过滤所有监听状态的 sockets。如果有一个远端服务对其建立了连接,那么它的状态就是 established。当使用 -a 参数时,就会包含所有的状态,包括 established, listen, time-wait, close-wait, syn-sent, syn-recv, fin-wait-1, fin-wait-2 等。另外,不止是 tcp 和 udp, UNIX socket 也会被 ss -a 命令显示出来。要想单独显示 unix socket,可以使用 -x 参数。

而 ss -s 的统计则不包括 unix socket,只统计 INET:

$ ss -s
Total: 393
TCP: 390 (estab 240, closed 134, orphaned 0, timewait 122)
Transport Total IP IPv6
RAW 0 0 0
UDP 3 0 3
TCP 256 97 159
INET 259 97 162
FRAG 0 0 0