连接与 inode 关联
/proc/net/tcp 与 /proc/net/udp 列出内核维护的连接表,但地址与端口以十六进制呈现,IPv4 地址还是小端字节序。表中每行带一个套接字 inode 号,用它去 /proc/<pid>/fd 下匹配 socket 链接,就能回答「这条连接由哪个进程持有」。
基本信息
| 文件 | /proc/net/tcp、/proc/net/udp、/proc/net/tcp6、/proc/net/unix |
|---|---|
| 地址格式 | 十六进制小端,需按字节反转后转为点分十进制 |
| 端口格式 | 十六进制整数 |
| inode 列 | 连接行中的套接字编号 |
| 关联方式 | /proc/<pid>/fd/ 下形如 socket:[编号] 的链接 |
| 权限要求 | 查看全部进程的 fd 需要 root |
典型使用场景
- 找出外联连接对应的持有进程
- 确认监听端口由哪个服务进程占用
- 配合 unix 套接字分析本地进程间通信
- 内存镜像分析时校验连接的归属
- 排查被隐藏进程持有的网络连接
最小示例
最小示例
cat /proc/net/tcp # 原始连接表
awk 'NR>1 {print $2, $3, $4, $10}' /proc/net/tcp | head # 地址、端口、状态、inode
# 校验换算:0100007F:0019 对应 127.0.0.1:25
python3 -c "import socket,struct; print(socket.inet_ntoa(struct.pack('<I', int('0100007F',16))))"
ls -l /proc/*/fd 2>/dev/null | grep 'socket:\[' | head # 用 inode 反查持有进程
ss -tanp | head # 已解析好的对照视图输出逐列读法
| 列 | 含义 | 注意 |
|---|---|---|
| local_address | 本地地址与端口 | 十六进制,需按小端解码 |
| rem_address | 远端地址与端口 | 全为 0 表示尚未连接 |
| st | 连接状态码 | 01 为已建立,0A 为监听 |
| inode | 套接字编号 | 用于关联到持有进程 |
| uid | 创建套接字的用户 | 与进程属主交叉核对 |
地址与端口都按十六进制显示,解码前先确认字节序:IPv4 是四字节小端,直接按整数读会得到错误地址。
inode 号会随连接建立与关闭而变化,采集到的连接表只代表那一刻的状态,需要与 ss 输出一起记录采集时间。
处于 TIME_WAIT 等结束态的连接不再对应进程的 fd,这类条目不应算作活跃连接。
在容器内查看该文件得到的是容器网络命名空间的连接表,与宿主上的视图并不相同;跨命名空间比对前先确认所处环境。
遍历大量进程的 fd 目录会在高负载主机上造成明显 IO 压力,建议先用 ss 缩小待查范围。