TCP連線狀態圖解析
阿新 • • 發佈:2018-10-31
TCP狀態圖,展示的是TCP從連線建立到連線關閉的整個生命週期,TCP的狀態轉換以及處理流程。TCP面向的是埠,Linux裡面可以通過netstat -a
命令檢視連線狀態。筆者遇到Tomcat生成大CLOSE_WAIT狀態的連線問題,故想了解一下TCP的連線機制。
TCP狀態圖縱覽
TCP連線本質是點對點的,理論上無所謂伺服器,客戶端。不過總得有一個程序等待在那裡,對外提供連線的服務,就稱之為伺服器。
下圖是來源於Wikipedia的狀態圖,藍線表示伺服器的執行線路,棕色描述客戶端。
總的來說,狀態共4個。連線中、已連線、斷開連線中、已斷開。由於客戶端,伺服器角色,以及連線和斷開的多步過程,使得狀態圖有點複雜。下面嘗試拆開來看看。
TCP建立連線過程
TCP連線,三步握手,大家應該都很熟悉。
- 客戶端發出SYN連線請求, Sequence設定為一個隨機數A。
- 服務端迴應SYN-ACK,ACK內容設定為A+1,Sequence設定為一個隨機數B。
- 客戶端迴應ACK,ACK內容設定為B+1,Sequence設定為A+1。
TCP關閉連線過程
TCP關閉連線,4步握手。
過程很簡單,不再詳述。值得注意的是主動發起關閉連線的一方,4步完成之
後,會等待一個超時時間再真正的關閉。
Server端典型狀態圖
文章開始提到的Tomcat伺服器產生大量CLOSE_WAIT的問題,是由於Tomcat沒有主動傳送最後的FIN訊息。進一步追蹤,發現Client端連線HTTP的Header其中一個為是,Connection: keep-alive,造成伺服器未正常關閉連線。
Client端典型狀態圖
示例
參考資料
- Wikipedia
- 《Computer Networks》