天天看點

為什麼TCP是三次握手而不是兩次握手,為什麼是四次揮手

為什麼是三次握手?

保證可靠的核心就是雙方都需要确認自己發送和接受資訊的功能正常,但因為網絡環境的不穩定性,這一秒能收發下一秒可能網絡核心就發生嚴重擁塞,是以世界上不存在完全可靠的通信協定.

兩次握手會怎樣?

若建立連接配接隻需兩次握手,用戶端并沒有太大的變化,在獲得服務端的應答後進入ESTABLISHED狀态,即确認自己的發送和接受資訊的功能正常.

但如果服務端在收到連接配接請求後就進入ESTABLISHED狀态,不能保證用戶端能收到自己的資訊,此時如果網絡擁塞,用戶端發送的連接配接請求遲遲到不了服務端,用戶端便逾時重發請求,如果服務端正确接收并确認應答,雙友善開始通信,通信結束後釋放連接配接。

此時,如果那個失效的連接配接請求抵達了服務端,由于隻有兩次握手,服務端收到請求就會進入ESTABLISHED狀态,等待發送資料或主動發送資料。但此時的用戶端早已進入CLOSED狀态,服務端将會一直等待下去,這樣浪費服務端連接配接資源.

為什麼是四次揮手?

為什麼TCP是三次握手而不是兩次握手,為什麼是四次揮手

TCP連接配接的釋放一共需要四步,是以稱為『四次揮手』.我們知道,TCP連接配接是雙向的,是以在四次揮手中,前兩次揮手用于斷開一個方向的連接配接,後兩次揮手用于斷開另一方向的連接配接.

第一次揮手:

若A認為資料發送完成,則它需要向B發送連接配接釋放請求.該請求隻有封包頭,頭中攜帶的主要參數為:FIN=1,seq=u.此時,A将進入FIN-WAIT-1狀态.

FIN=表示該封包段是一個連接配接釋放請求.
seq=u,u-是A向B發送的最後一個位元組的序号.
           

第二次揮手:

B收到連接配接釋放請求後,會通知相應的應用程式,告訴它A向B這個方向的連接配接已經釋放.此時B進入CLOSE-WAIT狀态,并向A發送連接配接釋放的應答,其封包頭包含: ACK=1,seq=v,ack=u+1.

ACK=1:除TCP連接配接請求封包段以外,TCP通信過程中所有資料報的ACK都為1,表示應答.

seq=v,v-是B向A發送的最後一個位元組的序号.
ack=u+表示希望收到從第u+個位元組開始的封包段,并且已經成功接收了前u個位元組.A收到該應答,進入FIN-WAIT-狀态,等待B發送連接配接釋放請求.
           

第二次揮手完成後,A到B方向的連接配接已經釋放,B不會再接收資料,A也不會再發送資料。但B到A方向的連接配接仍然存在,B可以繼續向A發送資料。

第三次揮手:

當B向A發完所有資料後,向A發送連接配接釋放請求,請求頭中包含:

FIN=1,ACK=1,seq=w,ack=u+1.随後B進入LAST-ACK狀态.

第四次揮手:

A收到釋放請求後,向B發送确認應答,此時A進入TIME-WAIT狀态.該狀态會持續2MSL時間,若該時間段内沒有B的重發請求的話,就進入CLOSED狀态,撤銷TCB.當B收到确認應答後,也便進入CLOSED狀态,撤銷TCB.

為什麼A要先進入TIME-WAIT狀态,等待2MSL時間後才進入CLOSED狀态? 為了保證B能收到A的确認應答。 若A發完确認應答後直接進入CLOSED狀态,那麼如果該應答丢失,B等待逾時後就會重新發送連接配接釋放請求,但此時A已經關閉了,不會作出任何響應,是以B永遠無法正常關閉。