netstat實現原理

由於最近接手的項目是基於嵌入式Linux openwrt的,一開始覺得會跟以前的服務器開發沒什麼大的區別,可是遇到問題去分析的時候才發現,工具鏈仍是有些差異的,openwrt的netstat是屬於一個叫作busybox的工具集的,這個工具集是專門提供給嵌入式Linux,它的參數很簡單,竟然沒有Linux下netstat的-p選項,所以當我想查看是哪些進程在監聽哪些端口時,發現只能查看有哪些監聽端口,沒法得知是屬於哪一個進程的,lsof也沒有-i選項。node

可是有時候排查問題又必須知道哪一個進程監聽了某個端口,所以就想搞清楚Linux下的netstat是怎麼實現能夠查看監聽端口屬於哪一個進程呢。服務器

首先想法就是去下載busybox的源代碼,可是感受代碼太多了,費時費力,因而靈機一動想到Linux下的另外一個工具strace(追蹤程序調用的系統調用),經過strace來查看netstat執行時都作了什麼操做。socket

截取了strace輸出的某一段,能夠看到,調用open以及readlink遍歷了/proc/3055/fd/目錄下的全部文件,你們都知道這個目錄是進程打開文件的目錄。tcp

在strace輸出的最後,能夠看到調用了open打開/proc/net/udp文件,並讀取裏面的內容將其解析輸出,這裏面就記錄了全部udp鏈接的信息,同時/proc/net/tcp對應tcp鏈接、/proc/net/unix對應Unix socket鏈接。工具

根據這個文件的標頭能夠知道,第二列是local address,可是因爲是16進制編碼,因此須要咱們手動轉換成10進制。編碼

這裏其實能夠發現,/proc/net/udp這個文件中的信息是不包含進程信息的,因此這也是爲何netstat在開始的時候會先遍歷全部/proc/xx/fd目錄,由於netstat能夠經過inode將/proc/net/udp中的行和/proc/xx/fd中的文件關聯起來,這樣就能夠獲得某一行udp鏈接的進程信息(由於inode是惟一的)。unix

因此,分析到這裏,我猜想busybox中的netstat應該是沒有遍歷全部/proc/xx/fd這一步,僅僅是讀取了/proc/net/udp文件並解析輸出。blog

明白了netstat的原理,那麼即便遇到不提供netstat -p選項的嵌入式Linux,咱們也能手動分析出本身想要的信息,進而解決問題。進程

相關文章
相關標籤/搜索