上圖左爲tcp鏈接的狀態機,每一個圓矩形爲一個狀態,每一個狀態有一行或者兩行,第一行爲該狀態的名稱, 第二行(有的話)爲該狀態能(或者須要)發送的報文。 虛線箭頭路徑爲服務器的常見狀態轉移路線。虛線框爲關閉鏈接的狀態集合。每一個狀態轉移都是經過事件 觸發,通常爲收到一些特定的報文。 上圖右爲時間線下的狀態轉移示意圖,分爲常見和特殊狀況。服務器
端口未打開時爲此狀態。至關於初始狀態和終止狀態。tcp
當服務器打開端口監聽時,服務器等待客戶端進行鏈接(被動)。事件
客戶端主動對服務器進行鏈接,會向服務器發送SYN報文。
有時候,服務器也會從LISTEN狀態轉到該狀態,說明服務器端進行主動鏈接,可是__極爲罕見__。 此外,主動關閉鏈接或者客戶端在必定時間範圍內徹底沒有接到任何報文(超時)時,該狀態會進入 CLOSED狀態,結束鏈接。圖片
服務器處於LISTEN狀態,當收到客戶端發送的SYN報文時,變爲該狀態。服務器處於該狀態時須要完成 與客戶端的握手流程,將會發送SYN和對此前客戶端發送SYN報文的ACK確認。
當服務器收到客戶端發送的RST報文後,說明客戶端但願取消鏈接,此時服務器會回到LISTEN狀態; 此外,服務器在必定時間範圍內徹底沒有接到任何報文(超時)時,會關閉監聽端口,到達CLOSED終止狀態, 服務器主動關閉端口監聽時,會進入FIN_WAIT_1狀態。it
客戶端(服務器)收到服務器(客戶端)對本身此前的SYN報文的ACK確認後,進入此狀態,代表已經創建了鏈接。服務器端
創建鏈接雙方中的一方主動關閉鏈接時,會發送FIN報文,進入該狀態。請求
主動關閉鏈接的一方收到被動方的對FIN的ACK確認報文後,進入該狀態。im
主動關閉鏈接的一方在監聽對本身FIN報文的ACK確認報文期間收到對方的FIN報文時進入該狀態。
該狀態說明雙方都在此段時間段內主動請求關閉。客戶端
主動請求關閉的一方收到對方的FIN報文後,會對該FIN報文進行ACK確認,那麼此時進入該狀態。
該狀態等待2MSL的時間,若收不到對方的FIN報文,說明對方已經收到本身發出的ACK確認報文,最終 鏈接關閉,進入CLOSED。
有時候,FIN_WAIT_1會直接進入該狀態,狀況在於被動方恰好在發送ACK(FIN)的同時捎帶了FIN,代表本身也 要關閉了,不過此狀況也__比較罕見__,而且能夠經過先進入FIN_WAIT_2在進入TIME_WAIT來代替。img
被動關閉的一方收到FIN報文時,進入該狀態,該狀態須要發送對FIN報文的ACK確認。
被動一方也關閉鏈接時,將發送FIN報文,進入該狀態。收到本身發出的FIN的ACK確認報文後,關閉鏈接, 進入CLOSED