Linux

從 /proc 讀取 TCP 連接列表

  • July 21, 2021

我正在嘗試實現列舉每個程序的所有現有 TCP 連接的程式碼(類似於netstat -lptn)。我更喜歡自己實現它,而不是依賴netstat. 為了做到這一點,我正在解析來自/proc/<PID>/net/tcp.

我看到許多 TCP 連接列在下面,/proc/<PID>/net/tcp但沒有按netstat -lptn命令列出。

例如,我看到/proc/1/net/tcp/proc/2/net/tcp有幾個 TCP 連接(在 Ubuntu 16 上嘗試過)。據我了解,/proc/1/net/tcp/sbin/init不應有任何 TCP 連接的程序有關。與之/proc/2/net/tcp相關的kthreadd也不應該有任何 TCP 連接。

你的方法有很多誤解。我會一一介紹。

  1. 套接字與特定程序無關。創建套接字時,它的引用計數為 1。但是通過不同的方法,例如dup2fork和文件描述符傳遞,可以創建對同一個套接字的許多引用,從而導致其引用計數增加。其中一些引用可以來自打開的文件描述符表,它本身可以被許多執行緒使用。這些執行緒可能屬於相同的執行緒組 (PID) 或不同的執行緒組。當您使用該-p標誌時,netstat它將列舉每個程序可訪問的套接字並嘗試為每個已知套接字找到一個程序。如果有多個候選程序,則不能保證它顯示了您感興趣的程序。
  2. /proc/<PID>/net/tcp不僅列出與該程序相關的套接字。它列出了該程序所屬的網路命名空間中的所有 TCPv4 套接字。在預設配置中,系統上的所有程序都將屬於一個網路命名空間,因此對於任何 PID,您都會看到相同的結果。這也解釋了為什麼不使用網路的執行緒/程序在此文件中有內容。即使它本身不使用網路,它仍然屬於其他程序可能使用網路的網路命名空間。
  3. /proc/<PID>/net/tcp包含偵聽和連接的套接字。當你傳遞-l給它時,netstat它只會顯示你正在監聽的套接字。為了使輸出更接近您需要-a而不是-l.
  4. /proc/<PID>/net/tcp僅包含 TCPv4 套接字。您還需要使用/proc/<PID>/net/tcp6它來查看所有 TCP 套接字。

如果您只對與您自己的程序在同一名稱空間中的套接字感興趣,則無需遍歷不同的 PID。您可以改為使用/proc/net/tcpand /proc/net/tcp6since/proc/net是指向/proc/self/net.

引用自:https://unix.stackexchange.com/questions/497912