ss / netstat 对比

ssnetstat 的现代替代——更快、信息更全。优先用 ss,netstat 仍兼容。

# 看所有 TCP 监听端口
sudo ss -tlnp                  # 简写记法:t=tcp, l=listen, n=数字不解析名字, p=显示进程
sudo netstat -tlnp             # 同上

# 看 UDP 监听
sudo ss -ulnp

# 看所有已建立的连接
sudo ss -tnp

# 看所有连接(含监听)
sudo ss -tunap

输出列含义

Netid  State   Recv-Q  Send-Q  Local Address:Port    Peer Address:Port   Process
tcp    LISTEN  0       128         0.0.0.0:80          0.0.0.0:*           users:(("nginx",pid=1234,fd=6))
tcp    ESTAB   0       0          192.168.1.100:51234   1.2.3.4:443        users:(("curl",pid=5678,fd=3))

State 常见值:

状态 含义
LISTEN 在监听等连接
ESTAB 已建立连接
TIME-WAIT 自己已关,等回收(最多 2MSL)
CLOSE-WAIT 对端已关,自己还没关(应用 bug 信号
SYN-SENT 我发了 SYN,等回
SYN-RECV 我收到 SYN,回了 SYN-ACK,等 ACK

实战:常见查询

1. 看 80 端口被谁监听

sudo ss -tlnp | grep :80
sudo lsof -i :80
sudo fuser 80/tcp

2. 看 nginx 当前连接数

sudo ss -tnp | grep nginx | wc -l

3. 看与某 IP 的所有连接

sudo ss -tnp | grep 1.2.3.4

4. 按状态统计

sudo ss -tn | awk '{print $1}' | sort | uniq -c | sort -rn
# 100 ESTAB
#  35 TIME-WAIT
#  10 CLOSE-WAIT       ← 这个数字大说明应用没正确关连接

lsof:列出打开的文件 / 网络

Linux 哲学"一切皆文件"——socket 也是文件,所以 lsof 能查网络。

sudo lsof -i :80                  # 谁在用 80 端口
sudo lsof -i tcp:443              # TCP 443
sudo lsof -i @1.2.3.4             # 与某 IP 的连接
sudo lsof -i -P -n                # 所有网络连接(-P 不解析端口名 -n 不解析 IP)
sudo lsof -p 1234                 # 进程 1234 打开的所有 fd
sudo lsof -u wadely               # wadely 用户的所有打开 fd
sudo lsof /var/log/syslog         # 谁在读 syslog

端口被占用的排查模板

# 想跑服务但端口被占
$ python -m http.server 5500
OSError: [Errno 98] Address already in use

# 1. 看谁占了
sudo ss -tlnp | grep :5500
sudo lsof -i :5500

# 2. 如果是已死进程的 socket,等 TIME-WAIT 过;或重用端口
SO_REUSEADDR=1 ...

# 3. 如果是另一个进程,杀
sudo kill <pid>

TIME_WAIT 爆多怎么办

高 QPS 服务可能积累大量 TIME-WAIT:

sudo ss -tn state time-wait | wc -l
# 50000

正常:每个连接 4 元组在 TIME_WAIT 期间不能重用(默认 2 分钟)。 应对

  • 启用 tcp_tw_reusesysctl -w net.ipv4.tcp_tw_reuse=1通常安全
  • 别用 tcp_tw_recycle:内核 4.12+ 已移除(NAT 后会出问题)
  • 应用层:用 keep-alive 连接池,少建立短连接

看实时连接(动态监控)

# watch + ss 实时
watch -n 1 'ss -tn state established | wc -l'

# nethogs:按进程看流量
sudo nethogs

端口范围

# 看系统的临时端口范围
cat /proc/sys/net/ipv4/ip_local_port_range
# 32768   60999

短连接服务很多 → 这个范围用完会"端口耗尽"。临时调大:

sudo sysctl -w net.ipv4.ip_local_port_range="10000 65000"

下一篇:远程连接三件套——SSH / SCP / rsync。