netstat命令一般用來查看IP/Port佔用情況,在網絡程序員那裏就可以用於檢測數據發送/接收的端口是否正確。比如最近在做“視頻實時傳輸”項目時就是用它發現問題的。所以有必要看懂netstat命令輸出結果的含義,下面給出三個典型的結果:
說明:Tserver01爲一個UDP服務器測試程序,用於接收客戶端的請求數據,然後回傳另一組數據到客戶端。
UDP ——傳輸協議爲UDP協議
0.0.0.0:1234 ——本地IP/Port信息。
其中0.0.0.0有兩種解釋:
1、0.0.0.0代表本機上可用的任意地址。 比如0.0.0.0:1234表示本機上所有地址的1234端口,這樣多ip計算機就不用重複顯示了。
2、0.0.0.0爲默認路由,即要到達不在路由表裏面的網段的包都走0.0.0.0這條規則。
其實,我們可以“通用”理解爲代表“本機地址”,1234在程序中體現爲綁定的1234端口號
0.0.0.0:*——目的地址IP/Port信息。
其中0.0.0.0:*依然有兩種解釋:
1、此程序只作了綁定套接字操作,沒有發送數據到目的地址,也就是沒有目的地址。(此時可以是客戶端已經發起並建立了與本服務器的通訊,也可以是客戶端沒有開啓。總之是服務器沒有向外部發出數據)
2、有目的地址,且發送了數據,但是由於是UDP傳輸,沒有用connect函數建立兩端連接。
而作爲此測試程序就是:採用UDP協議,並在回傳數據時採用了connect綁定客戶端地址,但是客戶端並沒有開啓,導致並沒有建立連接。
由上述的知識,可以直接得到如下信息:
解釋:
Tserver01程序採用UDP協議傳輸數據,綁定本地115.28.183.194:1234地址信息,並調用connect函數綁定目的地址221.212.116.50:9781建立了本地—>目的的連接。(至於是否發送數據並不知曉)
解釋:
videoserver程序綁定本地套接字接受客戶端X的連接(0.0.0.0:1234—>0.0.0.0:*),同時綁定了另一個套接字(IP/Port),並調用connnect函數與客戶端Y建立連接並通信(X 和Y可以是同一個客戶端)。
(PS:程序問題也就是在這裏發現的,我們明明通過客戶端2與服務器建立端口號是1234的NAT穿透,但是實際程序卻用另一個沒有被“穿透的”44268隨機端口向客戶端2發送數據,導致數據傳輸到內網後被丟棄。)
此命令此時簡單的做一下本地/目的地址間是否正確的測試,而且是本地—>目的的單向測試,即目的客戶端是否向本地服務器發起了連接是看不出來的(需要在客戶端運行的主機進行測試。)如果需要更爲詳細的數據發送問題的測試,可以運行tcpdump命令進行抓包查看。推薦博客:http://blog.chinaunix.net/uid-11140746-id-2903933.html