netstat命令 nc命令 使用詳解

 

# 網絡連接 監聽 8080端口
$ nc -l 8080

# 網絡連接 172.22.177.89 8080端口
$ nc 172.22.177.89 8080

然後兩個服務就可以互相通信了

 

 

netstat -tunpc | grep 8036
-t  查找tcp請求
-u 查找udp請求
-n 使用ip代替域名
-p 顯示pid(權限不足會導致某個進程不能顯示出pid)
-c 沒秒刷新一次

```
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1904/sshd           
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1750/cupsd          
tcp        0      0 0.0.0.0:44567               0.0.0.0:*                   LISTEN      1713/rpc.statd      
tcp        0      0 0.0.0.0:10050               0.0.0.0:*                   LISTEN      1965/zabbix_agentd  
```


2.1 關於Proto,Recv-Q,Send-Q等列的具體含義
Proto:協議名(tcp協議還是udp協議)

recv-Q:網絡接收隊列
表示收到的數據已經在本地接收緩衝,但是還有多少沒有被進程取走,recv()
如果接收隊列Recv-Q一直處於阻塞狀態,可能是遭受了拒絕服務 denial-of-service 攻擊。

send-Q:網路發送隊列
對方沒有收到的數據或者說沒有Ack的,還是本地緩衝區.
如果發送隊列Send-Q不能很快的清零,可能是有應用向外發送數據包過快,或者是對方接收數據包不夠快。

這兩個值通常應該爲0,如果不爲0可能是有問題的。packets在兩個隊列裏都不應該有堆積狀態。可接受短暫的非0情況。

從步驟一的結果中可以看到22端口對應的鏈路的 send-Q中堆積了大量的數據包 ,可以判定是發送數據給目的地址的時候出現了阻塞的問題,導致了包堆積在本地緩存中,不能成功發出去。

netstat 輸出內容詳解

1.列出所有 tcp與udp 端口
netstat -tulnp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1904/sshd           
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1750/cupsd          
tcp        0      0 0.0.0.0:44567               0.0.0.0:*                   LISTEN      1713/rpc.statd      
tcp        0      0 0.0.0.0:10050               0.0.0.0:*                   LISTEN      1965/zabbix_agentd  
tcp        0      0 172.172.230.211:3306        0.0.0.0:*                   LISTEN      31849/mysqld        
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1576/rpcbind        
tcp        0      0 172.172.230.211:46327       172.172.100.3:80            TIME_WAIT   -                   
tcp        0      0 172.172.230.211:46329       172.172.100.3:80            TIME_WAIT   -                   
tcp        0     52 172.172.230.211:22          172.172.173.222:50043       ESTABLISHED 6095/sshd           
tcp        0      0 172.172.230.211:46326       172.172.100.3:80            TIME_WAIT   -                   
tcp        0      0 172.172.230.211:5401        172.172.100.3:443           TIME_WAIT   -                   
tcp        0      0 :::22                       :::*                        LISTEN      1904/sshd           
tcp        0      0 ::1:631                     :::*                        LISTEN      1750/cupsd          
tcp        0      0 :::11776                    :::*                        LISTEN      1713/rpc.statd      
tcp        0      0 :::10050                    :::*                        LISTEN      1965/zabbix_agentd  
tcp        0      0 :::111                      :::*                        LISTEN      1576/rpcbind        
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2下面分析每一項的含義
2.1 關於Proto,Recv-Q,Send-Q等列的具體含義
Proto:協議名(tcp協議還是udp協議)

recv-Q:網絡接收隊列
表示收到的數據已經在本地接收緩衝,但是還有多少沒有被進程取走,recv()
如果接收隊列Recv-Q一直處於阻塞狀態,可能是遭受了拒絕服務 denial-of-service 攻擊。

send-Q:網路發送隊列
對方沒有收到的數據或者說沒有Ack的,還是本地緩衝區.
如果發送隊列Send-Q不能很快的清零,可能是有應用向外發送數據包過快,或者是對方接收數據包不夠快。

這兩個值通常應該爲0,如果不爲0可能是有問題的。packets在兩個隊列裏都不應該有堆積狀態。可接受短暫的非0情況。

從步驟一的結果中可以看到22端口對應的鏈路的 send-Q中堆積了大量的數據包 ,可以判定是發送數據給目的地址的時候出現了阻塞的問題,導致了包堆積在本地緩存中,不能成功發出去。

2.2 Local Address 解釋

1)Local Address 部分的0.0.0.0:22 表示監聽服務器上所有ip地址的所有(0.0.0.0表示本地所有ip),比如你的服務器是有172.172.230.210和
172.172.230.11兩個ip地址,那麼0.0.0.0:22此時表示監聽172.172.230.210,172.172.230.211,127.0.0.1三個地址的22端口

2):::22 這個也表示監聽本地所有ip的22端口,跟上面的區別是這裏表示的是IPv6地址,上面的0.0.0.0表示的是本地所有IPv4地址
NOTE
“:::” 這三個: 的前兩個"::",是"0:0:0:0:0:0:0:0"的縮寫,相當於IPv6的"0.0.0.0",就是本機的所有IPv6地址,第三個:是IP和端口的分隔符

3)127.0.0.1:631 這個表示監聽本機的loopback地址的631端口(如果某個服務只監聽了迴環地址,那麼只能在本機進行訪問,無法通過tcp/ip 協議進行遠程訪問)

4)::1:631 這個表示監聽IPv6的迴環地址的631端口,::1這個表示IPv6的loopback地址

5)172.172.230.211:3306 這裏我們看到我們的mysqld進程監聽的是172.172.230.211的3306端口,這是因爲我們在啓動的時候指定了bind_address=172.172.230.211參數,如果不指定bind_address的話,mysqld默認監聽:::3306(本機所有ip地址的3306端口 -IPv6)

2.3 Foreign Address
與本機端口通信的外部socket。顯示規則與Local Address相同

2.4 State
鏈路狀態,共有11種
state列共有12中可能的狀態,前面11種是按照TCP連接建立的三次握手和TCP連接斷開的四次揮手過程來描述的。

狀態    描述
LISTEN    首先服務端需要打開一個socket進行監聽,狀態爲LISTEN./* The socket is listening for incoming connections. 偵聽來自遠方TCP端口的連接請求 */
SYN_SENT    客戶端通過應用程序調用connect進行active open.於是客戶端tcp發送一個SYN以請求建立一個連接.之後狀態置爲SYN_SENT./*The socket is actively attempting to establish a connection. 在發送連接請求後等待匹配的連接請求 */
SYN_RECV    服務端應發出ACK確認客戶端的 SYN,同時自己向客戶端發送一個SYN. 之後狀態置爲SYN_RECV/* A connection request has been received from the network. 在收到和發送一個連接請求後等待對連接請求的確認 */
ESTABLISHED    代表一個打開的連接,雙方可以進行或已經在數據交互了。/* The socket has an established connection. 代表一個打開的連接,數據可以傳送給用戶 */
FIN_WAIT1    主動關閉(active close)端應用程序調用close,於是其TCP發出FIN請求主動關閉連接,之後進入FIN_WAIT1狀態./* The socket is closed, and the connection is shutting down. 等待遠程TCP的連接中斷請求,或先前的連接中斷請求的確認 */
CLOSE_WAIT    被動關閉(passive close)端TCP接到FIN後,就發出ACK以迴應FIN請求(它的接收也作爲文件結束符傳遞給上層應用程序),並進入CLOSE_WAIT./* The remote end has shut down, waiting for the socket to close. 等待從本地用戶發來的連接中斷請求 */
FIN_WAIT2    主動關閉端接到ACK後,就進入了 FIN-WAIT-2 ./* Connection is closed, and the socket is waiting for a shutdown from the remote end. 從遠程TCP等待連接中斷請求 */
LAST_ACK    被動關閉端一段時間後,接收到文件結束符的應用程 序將調用CLOSE關閉連接。這導致它的TCP也發送一個 FIN,等待對方的ACK.就進入了LAST-ACK ./* The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原來發向遠程TCP的連接中斷請求的確認 */
TIME_WAIT    在主動關閉端接收到FIN後,TCP 就發送ACK包,並進入TIME-WAIT狀態。/* The socket is waiting after close to handle packets still in the network.等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認 */
CLOSING    比較少見./* Both sockets are shut down but we still don’t have all our data sent. 等待遠程TCP對連接中斷的確認 */
CLOSED    被動關閉端在接受到ACK包後,就進入了closed的狀態。連接結束./* The socket is not being used. 沒有任何連接狀態 */
UNKNOWN    未知的Socket狀態。/* The state of the socket is unknown. */
備註
SYN: (同步序列編號,Synchronize Sequence Numbers)該標誌僅在三次握手建立TCP連接時有效。表示一個新的TCP連接請求。
ACK: (確認編號,Acknowledgement Number)是對TCP請求的確認標誌,同時提示對端系統已經成功接收所有數據。
FIN: (結束標誌,FINish)用來結束一個TCP回話.但對應端口仍處於開放狀態,準備接收後續數據。

2.5 PID/Program
PID即進程id,Program即使用該socket的應用程序

13 . 列出所有的網絡連接

lsof -i

14. 列出所有tcp 網絡連接信息

lsof  -i tcp

15. 列出所有udp網絡連接信息

lsof  -i udp

16. 列出誰在使用某個端口

lsof -i :3306

在終端下輸入lsof即可顯示系統打開的文件,因爲 lsof 需要訪問核心內存和各種文件,所以必須以 root 用戶的身份運行它才能夠充分地發揮其功能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章