1. 程式人生 > >TCP連線狀態圖解析

TCP連線狀態圖解析

TCP狀態圖,展示的是TCP從連線建立到連線關閉的整個生命週期,TCP的狀態轉換以及處理流程。TCP面向的是埠,Linux裡面可以通過netstat -a命令檢視連線狀態。筆者遇到Tomcat生成大CLOSE_WAIT狀態的連線問題,故想了解一下TCP的連線機制。

TCP狀態圖縱覽

TCP連線本質是點對點的,理論上無所謂伺服器,客戶端。不過總得有一個程序等待在那裡,對外提供連線的服務,就稱之為伺服器。

下圖是來源於Wikipedia的狀態圖,藍線表示伺服器的執行線路,棕色描述客戶端。

TCP連線狀態圖

總的來說,狀態共4個。連線中、已連線、斷開連線中、已斷開。由於客戶端,伺服器角色,以及連線和斷開的多步過程,使得狀態圖有點複雜。下面嘗試拆開來看看。

TCP建立連線過程

TCP連線,三步握手,大家應該都很熟悉。

TCP握手過程

  1. 客戶端發出SYN連線請求, Sequence設定為一個隨機數A。
  2. 服務端迴應SYN-ACK,ACK內容設定為A+1,Sequence設定為一個隨機數B。
  3. 客戶端迴應ACK,ACK內容設定為B+1,Sequence設定為A+1。

TCP關閉連線過程

TCP關閉連線,4步握手。

TCP關閉連

過程很簡單,不再詳述。值得注意的是主動發起關閉連線的一方,4步完成之
後,會等待一個超時時間再真正的關閉。

Server端典型狀態圖

server端狀態圖

文章開始提到的Tomcat伺服器產生大量CLOSE_WAIT的問題,是由於Tomcat沒有主動傳送最後的FIN訊息。進一步追蹤,發現Client端連線HTTP的Header其中一個為是,Connection: keep-alive,造成伺服器未正常關閉連線。

Client端典型狀態圖

client端狀態圖

示例

TCP連線示例

參考資料