上一篇博客說了三次握手爲什麼是是三次(點這裏),那麼現在就介紹一下四次揮手。大家都知道TCP是全雙工的,再建立連接時的三次握手中的SYN和ACK一起發送,這裏就會有疑問,爲什麼在四次揮手的時候沒有將SYN和ACK一起發送呢?帶着這個問題繼續向下看,答案就在其中。
說到四次揮手,顧名思義,就是在關閉連接的時候雙方一共要操作四次,來看一下這四次都是怎麼操作的:
從圖中可以看出來,在四次揮手的時候雙方一共進入了六種狀態,這六種狀態就是理解四次揮手的關鍵所在,我們來看一下
四次揮手的狀態
-
FIN_WAIT_1:這個狀態和FIN_WAIT_2狀態都在再等待對方的回覆,但是這兩種狀態是有區別的,FIN_WAIT_1就是主動方在ESTABLISHED狀態的時候,想要主動關閉連接,向對方發送FIN報文,這時候就進入了FIN_WAIT_1狀態。當他收到對方回覆的ACK報文後,就進入了FIN_WAIT_2狀態。 但是在實際操作中是很難遇到FIN_WAIT_1狀態的,因爲無論對方是什麼情況都應該立刻迴應ACK報文,但是FIN_WAIT_2狀態還是可以在主動方中用netstat看到的。
-
FIN_WAIT_2:上面已經對FIN_WAIT_2講解過了,當主動方進入FIN_WAIT_2時,就表示着半連接狀態,也就是主動方還有數據要發給對方,這個數據就是之後的ACK,所有他要等一會兒才關閉連接。
-
CLOSE_WAIT:這個狀態從表面也可以看出它的作用,就是等待關閉。當被動方接收到FIN時,會立刻回覆一個ACK給對方,接下來就是進入CLOSE_WAIT狀態。在這個狀態中,被動方需要考慮自己還有沒有數據要發送給對方,如果有可以繼續發送,如果沒有了就可以關閉連接了,發送一個FIN給對方。 這個狀態其實也就是給自己一個緩衝的時間,讓自己處理完需要處理的事,然後去關閉連接。
-
TIME_WAIT:這個狀態就是一段時間後進行一些操作。當主動方收到了對方發來的FIN報文,併發出ACK報文,接下來就等2MSL就可以進入CLOSED狀態了。其實,如果主動方在FIN_WAIT_1狀態下,收到了對方的FIN+ACK標誌的報文,就可以跳過FIN_WAIT_2狀態直接進入TIME_WAIT狀態了。
-
LAST_ACK:這個狀態從表面不難不理解他的意思,這個狀態就是被動方發送了FIN報文後,最後等待對方的ACK報文,收到ACK報文後就可以進入CLOSED狀態了。
-
CLOSED:上面提到了幾次這個狀態,相比也猜出來了,這個狀態表示的就是連接中斷,已經關閉。
在上面的TIME_WAIT狀態中有提到過2MSL,那麼什麼是2MSL呢?那麼來詳細說一下TIME_WAIT狀態和裏面的2MSL。