- TCP埠監聽的狀態
TCP協議是一種面向連線的協議,它建立連線之前需要透過三次握手(3-way handshake),連線建立後進行資料傳輸,最後透過四次揮手(4-way handshake)關閉連線。TCP協議的狀態機相對複雜,包含多個不同的狀態,每個狀態表示連線的不同生命週期。
常見的TCP埠監聽狀態包括以下幾種:
1.1 LISTEN(監聽)
含義:LISTEN 狀態表示伺服器端的埠正在監聽傳入的連線請求。通常,伺服器程式會在一個或多個埠上處於監聽狀態,等待客戶端發起連線。
特徵:此時沒有資料傳輸,只是等待連線的建立。
應用場景:例如,當你執行一個Web伺服器(如Apache、Nginx)時,通常會在埠80或443上處於LISTEN狀態,等待客戶端的HTTP請求。
命令檢視:
netstat -an | grep LISTEN
1.2 SYN_SENT(同步已傳送)
含義:SYN_SENT 表示客戶端已傳送連線請求(SYN包),等待伺服器確認。是三次握手中的第一步完成後,客戶端的狀態。
特徵:客戶端向伺服器發起連線請求。
應用場景:客戶端發起連線請求後,處於該狀態,直到接收到伺服器的SYN+ACK響應。
1.3 SYN_RECEIVED(同步已接收)
含義:SYN_RECEIVED 狀態表示伺服器接收到客戶端的SYN包,並且已經回應了一個SYN+ACK包,正在等待客戶端的ACK包確認。
特徵:這是三次握手的第二步,連線還沒有完全建立。
應用場景:通常出現在伺服器端,表示已經收到客戶端的連線請求。
1.4 ESTABLISHED(已建立)
含義:ESTABLISHED 狀態表示TCP連線已成功建立,可以開始資料傳輸。這是建立連線後最常見的狀態。
特徵:雙向資料傳輸可以在此狀態下進行。
應用場景:當一個TCP連線完全建立後,伺服器和客戶端可以開始傳輸資料(如HTTP資料傳輸、FTP檔案傳輸等)。
1.5 FIN_WAIT_1(終止等待1)
含義:FIN_WAIT_1 表示主動關閉連線的一方已經傳送了FIN包,通知對方自己準備關閉連線。
特徵:等待對方的ACK響應。
應用場景:主動發起關閉連線的端通常會進入此狀態。
1.6 FIN_WAIT_2(終止等待2)
含義:FIN_WAIT_2 表示接收方已經確認了FIN包,並且準備關閉連線。
特徵:此時雙方都已經同意關閉連線,等待對方的FIN包。
應用場景:在雙向關閉的過程中,雙方會進入這個狀態,直到完全關閉連線。
1.7 TIME_WAIT(時間等待)
含義:TIME_WAIT 狀態表示連線的另一方已經接收到FIN包,並且傳送了最後的ACK包,等待足夠的時間確保對方收到了這個ACK包。
特徵:在TCP連線關閉後,通常會進入該狀態,持續一段時間,以確保最後的確認能到達對方。
應用場景:此狀態通常持續4分鐘(2倍的MSL,最大報文生存時間)。
1.8 CLOSE_WAIT(關閉等待)
含義:CLOSE_WAIT 狀態表示遠端主機已經傳送了一個FIN包,自己還未關閉連線。
特徵:等待應用程式主動關閉連線。
應用場景:當一方已關閉連線(透過FIN包)時,另一方進入此狀態,直到應用程式執行關閉操作。
1.9 LAST_ACK(最後確認)
含義:LAST_ACK 狀態表示本地端已經傳送了FIN包,等待對方確認。
特徵:在關閉連線時,處於此狀態,直到收到最後的ACK確認。
1.10 CLOSED(已關閉)
含義:CLOSED 表示連線已經完全關閉,所有資源已釋放。
特徵:此時連線的埠已不再佔用,TCP連線的生命週期結束。
2. UDP埠監聽的狀態
UDP協議是無連線協議,它與TCP不同。UDP不需要建立和維護連線,因此在作業系統中,UDP埠的狀態相對簡單。
2.1 LISTEN(監聽)
含義:LISTEN 狀態表示UDP埠在等待接收資料包。UDP不需要建立連線,所以監聽狀態是唯一的狀態。
特徵:UDP的應用程式(如DNS、DHCP等)會在特定埠上處於監聽狀態,等待接收客戶端的請求。
命令檢視:
netstat -an | grep 123 # 檢視UDP埠123的監聽狀態
2.2 CLOSED(已關閉)
含義:CLOSED 狀態表示該埠沒有在監聽,也沒有處於任何活動狀態。
特徵:UDP連線的生命週期不復雜,基本是“連線即傳輸”模式,關閉時不需要額外的狀態管理。
3. 如何檢視埠監聽狀態
3.1 使用 netstat 命令
netstat 是一個經典的命令列工具,用於檢視網路連線狀態,顯示系統的網路配置。
netstat -tuln
-t:顯示 TCP 連線
-u:顯示 UDP 連線
-l:顯示監聽狀態的埠
-n:顯示數字形式的IP地址和埠號(而非解析成主機名)
3.2 使用 ss 命令
ss 是 netstat 的替代工具,提供更快的網路連線資訊查詢。
ss -tuln
3.3 使用 lsof 命令
lsof 是一個用於檢視檔案開啟情況的工具,能列出與埠相關的程式。
lsof -i :80