TCP有限狀態機

先看TCP狀態機圖:服務器

wKiom1c_GEeAkcBnAAKau-JqJuU916.png

                          (謝希任 計算機網絡第六版)網絡

注:粗實線箭頭表示對客戶進程的正常變遷,粗虛線箭頭表示表示對服務器進程的正常變遷,細實線箭頭表示異常變遷ide

咱們先來講說圖中的各個狀態:計算機網絡

CLOSE:起點,即初始狀態;進程

LISTEN:被動打開,服務器端的狀態變爲LISTEN狀態(監聽);get

SYN-RECVD(同步收到):服務器端收到SYN後,狀態爲SYN,發送SYN+ACK;同步

SYN-SENT(同步已發送):應用程序發送SYN後,狀態爲SYN-SENT;it

ESTABLISHED(已創建鏈接):SYN-RECVD收到ACK後,狀態爲ESTABLISHED,SYN-SENT收到SYN+ACK,發送ACK,狀態爲ESTABLISHED;io

CLOSE_WAIT(關閉等待):服務器端在收到FIN後,發送ACK,狀態變爲CLOSE_WAIT,若是此時服務器端還有數據要傳送,那麼就發送,直到數據發送完畢,此時,服務器端發送FIN,狀態變爲LAST-ACK;class

FIN-WAIT-1:應用程序端發送FIN,準備斷開TCP鏈接,狀態從ESTABLISHED狀態變爲FIN-WAIT-1;

FIN-WAIT-2:應用程序端只有收到服務器端ACK信號,並無收到FIN信號,說明服務器端還有數據要傳輸,那麼此時爲半鏈接;

TIME_WAIT:有兩種方式進入該狀態:1.從FIN-WAIT-1進入,此時應用程序端口收到FIN+ACK,並向服務器端口發送ACK;

                                                         2.FIN-WAIT-2進入,此時應用程序端口收到了FIN,而後向服務器發送ACK;TIME-WAIT是爲了實現TCP全雙工鏈接的可靠性閉,用來重發可能丟失的ACK報文,須要持續2MSL,假如應用程序端口在進入TIME_WAIT後,2個MSL時間內並無收到FIN,說明應用程序最後發出的ACK已經收到了;

下面咱們重點來看一看關閉鏈接的狀態轉換:

咱們假設通訊雙方是A,B,A是主動發起關閉方

       (1)A首先主動發起FIN報文,準備關閉TCP鏈接,而後進入FIN-WAIT-1狀態,而後若是A收到了ACK報文,就進入FIN-WAIT-2狀態,而若是A收到ACK+FIN,則進入TIME_WAIT狀態;進入FIN-WAIT-2狀態,說明B還有數據發送給A,而後A發送ACK,並進入TIME-WAIT狀態,當2個MSL內,沒有收到FIN信號,那麼TIME_WAIT狀態就自動轉換爲CLOSED狀態。(爲何呢?咱們假設網絡是不可靠的,最後A發送的ACK信號丟失,那麼B就沒有收到ACK,那麼此時B還須要發送一個FIN給A,這個過程最多須要2MSL,因此若是過了2MSL,沒有再次收到B的FIN,那麼說明A發送的ACK被B收到了,因此可靠性的關閉鏈接)

        (2)被動接受方:B在收到A的FIN報文後,知道A準備關閉TCP鏈接了(注意只是A單方面關閉,也就是說A還能夠收數據,可是不許備發數據了),B將發送ACK給A,而後B進入CLOSE_WAIT狀態,若是此時B也有數據發送給A,那麼就一直髮送好了,反正A不會發送數據了,此時A處於FIN-WAIT-2狀態,當B的數據發送完畢後,那麼B發送FIN給A,B進入LAST-ACK狀態,當收到A發來的ACK信號後,A進入CLOSED狀態。

相關文章
相關標籤/搜索