TCP有限狀態機

先看TCP狀態機圖:

wKiom1c_GEeAkcBnAAKau-JqJuU916.png

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

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

我們先來說說圖中的各個狀態:

CLOSE:起點,即初始狀態;

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

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

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

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

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

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狀態。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章