关于 /proc/net/tcp 与 /proc/$pid/net/tcp 的关系分析
关于 /proc/net/tcp 与 /proc/$pid/net/tcp 的关系分析
1. 基础概念
在 Linux 系统中,每个进程必定归属于一个且仅一个网络命名空间(Network Namespace)。这是 Linux 命名空间隔离机制的核心特性之一。
/proc/net/tcp
显示当前网络命名空间中所有TCP连接信息(全局视角)。
/proc/$pid/net/tcp
显示特定进程所属网络命名空间中的TCP连接信息(进程视角)。若进程在主机默认命名空间,则内容与全局文件相同。
2. 核心区别
特性 | /proc/net/tcp | /proc/$pid/net/tcp |
---|---|---|
数据范围 | 当前命名空间所有 TCP 连接 | 仅限该进程所属命名空间的 TCP 连接 |
命名空间感知 | 仅显示当前命名空间 | 跟随进程的命名空间(容器友好) |
权限要求 | 需 root 查看所有连接 | 仅能查看自身进程或权限足够的进程 |
典型用途 | 主机级网络监控 | 进程/容器级网络诊断 |
3. 关键关系
(1) 命名空间隔离性
容器环境:
容器中的进程通常位于独立的网络命名空间。此时:
cat /proc/net/tcp → 显示主机全局连接
cat /proc/$容器PID/net/tcp → 显示容器内的连接
# 查看容器内连接(需先获取容器PID)
docker inspect --format '{{.State.Pid}}' nginx
cat /proc/12345/net/tcp
(2) 数据一致性
若进程在主机默认命名空间中:执行以下命令,输出为空
diff /proc/net/tcp /proc/$pid/net/tcp
若进程在独立命名空间(如容器):
两文件内容完全不同,反映各自命名空间的连接状态。
4. 查看网络空间
(1) 显示当前网络空间
# 通过 inode 确认网络命名空间
ls -l /proc/$$/ns/net
# 示例输出:
lrwxrwxrwx 1 root root 0 Jun 12 16:25 /proc/9208/ns/net -> net:[4026531956]
(2) 查看进程所属网络空间
# 通过 inode 确认网络命名空间
ls -l /proc/$PID/ns/net
# 示例输出:
lrwxrwxrwx 1 root root 0 Jun 12 16:18 /proc/27791/ns/net -> net:[4026531956]
相同 inode 值 → 同一网络命名空间
不同 inode 值 → 不同网络命名空间