Linux内核不提供现成的套接字状态变迁图,所有示意图均基于RFC 793和源码整理;/proc/net/tcp中状态为十六进制编码,需查表转换;观察状态变化需连续采样与抓包结合;诊断关键在于监听地址绑定方式而非状态图。

Linux内核里没有现成的套接字状态变迁图可直接查看
内核本身不提供图形化或实时渲染的状态变迁图,socket 的状态流转(如 LISTEN → SYN_RECEIVED → ESTABLISHED)是协议栈内部逻辑,不会以“图”的形式暴露给用户空间。你看到的所有状态变迁图,都是基于 RFC 793 和内核源码(如 net/ipv4/tcp_input.c)整理出的静态示意图,不是运行时动态生成的。
/proc/net/tcp 中的状态字段是十六进制编码,不是文字状态
直接读 /proc/net/tcp 时,第4列是状态码(如 01、0A),必须手动查表转换:
-
01→ESTABLISHED -
02→SYN_SENT -
0A→LISTEN -
04→FIN_WAIT1 -
08→CLOSE_WAIT
别指望 cat /proc/net/tcp 输出里写着 “ESTABLISHED” —— 那是 ss 或 netstat 做的翻译。原始内核接口只输出数字,这是为了性能和简洁性。
想观察状态变化过程,得靠抓包 + 状态轮询,不能靠单次快照
单看一次 ss -tn 或 netstat -tn 只能捕获瞬时状态。要看到变迁,必须连续采样并比对:
- 用
watch -n 0.5 'ss -tn state established | wc -l'观察 ESTABLISHED 数量波动 - 配合
tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'抓 SYN/FIN 包,对应状态跃迁点 - 注意:
TIME_WAIT不会出现在ss的默认输出里,得加--all或-a才能看见
很多线上问题(比如连接数卡在 TIME_WAIT)就是靠这种“时间维度对比”才定位出来的,而不是靠某张图。
真正影响诊断效果的是监听地址绑定方式,不是状态图本身
比起纠结状态图,更该第一时间确认的是 Local Address 列的绑定 IP:
-
0.0.0.0:80表示监听所有接口,外部可连 -
127.0.0.1:80表示仅本机可连,外部访问必失败 -
:::80是 IPv6 的INADDR_ANY,行为类似0.0.0.0
很多“服务启动了但连不上”的问题,根源就在这里——状态明明是 LISTEN,但绑错了地址。这时候翻状态变迁图毫无意义。


















