您好,登錄后才能下訂單哦!
因為當Server端收到Client端的SYN連接請求報文后,可以直接發(fā)送SYN+ACK報文。其中ACK報文是用來應(yīng)答的,SYN報文是用來同步的。但是關(guān)閉連接時,當Server端收到FIN報文時,很可能并不會立即關(guān)閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發(fā)的FIN報文我收到了"。只有等到我Server端所有的報文都發(fā)送完了,我才能發(fā)送FIN報文,因此不能一起發(fā)送。故需要四步握手。
這主要是為了防止已失效的連接請求報文段突然又傳到了B,因而產(chǎn)生錯誤。
現(xiàn)假定一種異常情況,即A發(fā)出的第一個連接請求報文段并沒有丟失,而是在某些網(wǎng)絡(luò)節(jié)點長時間滯留了,以致延誤到連接釋放后的某個時間才到達B。本來這是一個早已失效的報文段。但B受到此失效的連接請求報文段后,就誤以為是A又發(fā)出一次新的連接請求,于是就向A發(fā)出確認報文段,同意建立連接。假定不采用第三次報文握手,那么只要B發(fā)出確認,新的連接就建立了。
由于現(xiàn)在A并沒有發(fā)出建立連接的請求,因此不會理睬B的確認,也不會向B發(fā)送數(shù)據(jù),但B卻以為新的運輸連接已經(jīng)建立了,并一直等待A發(fā)來的數(shù)據(jù)。B的許多資源就這樣白白浪費了。
采用三次握手連接,可以防止上述現(xiàn)象的發(fā)生。例如在剛才的異常情況下,A不會向B的確認發(fā)出確認,B由于收不到確認,就知道A并沒有要求建立連接,于是B就不會再建立連接。
TCP還設(shè)有一個保活計時器,顯然,客戶端如果出現(xiàn)故障,服務(wù)器不能一直等下去,白白浪費資源。服務(wù)器每收到一次客戶端的請求后都會重新復位這個計時器,時間通常是設(shè)置為2小時,若兩小時還沒有收到客戶端的任何數(shù)據(jù),服務(wù)器就會發(fā)送一個探測報文段,以后每隔75分鐘發(fā)送一次。若一連發(fā)送10個探測報文仍然沒反應(yīng),服務(wù)器就認為客戶端出了故障,接著就關(guān)閉連接。
原文鏈接: https://www.linuxprobe.com/tcp-usually-question.html
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。