有限狀態機&Time_wait的解讀

1、TCP有限狀態機

wKiom1eXFrfh9COUAAF4dkHVDa8500.png

其中各狀態的含義:

    

狀態含義
closed初始狀態
listen被動打開一方——監聽狀態
syn_sent主動打開一方——連接建立已發送
syn_rcvd被動打開一方——連接建立已接收
established雙方——連接已經建立
fin_wait1主動關閉一方——FIN已發送,等待確認
fin_wait2主動關閉一方——確認已收到,等待對方關閉請求
time_wait主動關閉一方——最後的確認已經發送,需要等待2MSL
close_wait被動關閉一方——詢問我方進程是否還有數據要發送,沒有也要發送FIN進行關閉
last_ack被動關閉一方——我方的fin已經發送,想要收到你的最後的確認
closing

主動關閉一方——在發送完FIN之後沒有收到確認但是收到了對端的FIN

                            (場景:同時發送的FIN)


2、爲什麼需要三次握手

wKioL1eXGpiQ2hQiAADqHK4QXZA980.png

1)合併了連接確認和連接請求,如圖上的2

2)最後一次的ACK,防止了已失效的連接請求報文

   (client向server發送了SYN連接請求報文,但是由於鏈路問題,滯留很久,client認爲這個報文丟失於是又重傳了一次;而在新連接過 

      程中,server收到了這個消失很久的報文,如果沒有三次握手,server就認爲這是一個新連接,於是連接建立,server會向這個新連接

      發送的數據都不會被client處理,server這樣就浪費了很多資源)

3、爲什麼需要四次揮手

wKiom1eXHBfA01WRAAETBW_LZno235.png

1)FIN報文和ACK報文是成對的,並且可以允許有半關閉的情況;一方關閉了自己的發送方向,不在發送數據;但是另外一方還有數據想要發送,這個時候是可以不發送FIN報文,繼續發送數據到對端,對端只不過是關閉了發送方向,接收方向依然可以接收數據

4、time_wait必須等待2MSL時間的理由

1)爲了保證主動關閉一方發送的最後一個ACK報文能過到達被動關閉的一方

    (因爲這個報文有可能丟失,所以被動關閉的一方有可能重傳FIN報文,然後主動一方在2MSL中能收到這個重傳的報文,A在確認一次

       並重啓2MSL)

2)防止“已失效的連接請求報文”,和上面的三次握手中最後一個ACK必須有的那種情況一樣,如果在2MSL中那個連接請求報文到了,我們不對這個遲到的報文做處理,讓其消失;不會讓這次釋放連接完成後,還有舊的連接請求存在。



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