只做兩次握手和三次揮手可以嗎?
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,這樣能保證在新的連接中雙方不會收到舊連接的命令。