1、TCP有限狀態機
其中各狀態的含義:
狀態 | 含義 |
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、爲什麼需要三次握手
1)合併了連接確認和連接請求,如圖上的2
2)最後一次的ACK,防止了已失效的連接請求報文
(client向server發送了SYN連接請求報文,但是由於鏈路問題,滯留很久,client認爲這個報文丟失於是又重傳了一次;而在新連接過
程中,server收到了這個消失很久的報文,如果沒有三次握手,server就認爲這是一個新連接,於是連接建立,server會向這個新連接
發送的數據都不會被client處理,server這樣就浪費了很多資源)
3、爲什麼需要四次揮手
1)FIN報文和ACK報文是成對的,並且可以允許有半關閉的情況;一方關閉了自己的發送方向,不在發送數據;但是另外一方還有數據想要發送,這個時候是可以不發送FIN報文,繼續發送數據到對端,對端只不過是關閉了發送方向,接收方向依然可以接收數據
4、time_wait必須等待2MSL時間的理由
1)爲了保證主動關閉一方發送的最後一個ACK報文能過到達被動關閉的一方
(因爲這個報文有可能丟失,所以被動關閉的一方有可能重傳FIN報文,然後主動一方在2MSL中能收到這個重傳的報文,A在確認一次
並重啓2MSL)
2)防止“已失效的連接請求報文”,和上面的三次握手中最後一個ACK必須有的那種情況一樣,如果在2MSL中那個連接請求報文到了,我們不對這個遲到的報文做處理,讓其消失;不會讓這次釋放連接完成後,還有舊的連接請求存在。