TCP三次握手和四次揮手的必要性

只做兩次握手和三次揮手可以嗎?

1、三次握手

前提:C和S建立連接的充分必要條件是C和S能分別保證自己發(fā)送的信息對方能收到。

現(xiàn)在討論:
完成一次握手:

C和S都不能保證自己發(fā)送的信息對方能收到。(因為都沒收到對方給自己的回應(yīng))

完成兩次握手:

C能保證自己發(fā)送的信息對方已收到,因為第二次握手確實收到S的回應(yīng)。
但S卻不能保證自己發(fā)送的信息C能收到(第一次握手只能說明對方能給自己發(fā)送信息,自己給對方發(fā)送的信息卻無法保證能不能送達)

完成三次握手:

C和S都能保證自己發(fā)送的信息對方已收到。

總結(jié):

第二次握手,C能保證自己發(fā)送的信息對方已收到
第三次握手,S能保證自己發(fā)送的信息對方已收到

2、四次揮手

前提:C和S斷開連接的必要條件是C和S都能保證對方完成了數(shù)據(jù)的傳輸
顯然主動要斷開的一方是已經(jīng)完成數(shù)據(jù)的傳輸?shù)?/em>

假如是C主動斷開
完成一次揮手

第一次揮手C表明自己完成數(shù)據(jù)的傳輸,并且要斷開連接
顯然一次揮手達不到斷開的條件

完成兩次揮手

第二次揮手S告訴C自己還在傳輸數(shù)據(jù)。
顯然兩次揮手達不到斷開的條件

完成三次揮手

第三次揮手,S告訴C自己完成了數(shù)據(jù)的傳輸,你可以斷開連接了,此時將自己設(shè)置為LAST_ACK狀態(tài)。
這里可能有人就有疑問了,這里S揮手告訴C完成了數(shù)據(jù)傳輸,C斷開連接,然后S斷開連接就可以啊。
但實際情況是C不能立即斷開,要給S發(fā)送最后一道ACK命令,進入TIME_WAIT狀態(tài)并等待兩個MSL(報文的最大生命周期)后關(guān)閉連接,S收到最后一個ACK命令后關(guān)閉連接。因為實際的網(wǎng)絡(luò)傳輸都是有延遲的,如果第三次揮手后C立即斷開連接,那么如果C重啟后可能會因為之前的網(wǎng)絡(luò)延遲收到S重復(fù)發(fā)送的FIN命令,也有可能建立新連接時給S發(fā)送SYN信號,此時S卻還在等待上一個連接的ACK命令,造成TCP連接錯亂的問題。因此,C不能立即斷開并且要給S發(fā)一個ACK命令,要其斷開連接。
總結(jié):三次揮手達到了斷開的條件,但不能立即斷開,要等待一個安全期后再斷開。

完成四次揮手

第四次揮手是C給S發(fā)送最后一道ACK命令,保證S收到斷開命令,并且在這段等待時間內(nèi)回應(yīng)S因為網(wǎng)絡(luò)延遲的重復(fù)的FIN命令等。


為什么C要等待兩個MSL?
MSL是指一個報文在傳輸過程中最大的生命周期,如果網(wǎng)絡(luò)良好,一段報文很快送達,生命周期結(jié)束。如果網(wǎng)絡(luò)很差,這段報文就會花費較長時間送達。但這個時間不能無期限延長。于是規(guī)定了一個最大生命周期MSL。一但超過MSL,這個報文就會被丟棄掉。而傳輸過程,一次收發(fā)最大花費2MSL,將等待時間設(shè)置為2MSL,這樣能保證在新的連接中雙方不會收到舊連接的命令。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容