關于 /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 值 → 不同網絡命名空間