tcp為什麼是三次握手而四次揮手

通信過程最重要的就是打成一致,而要打成一致需要的最小通信量就是關鍵,因為通信帶寬是需要成本的。這是最重要的原因。

前提:信源與信宿是不對稱的,也就是發送方可以到達目標,並不意味著目標可以到達發送者。

三次握手:

建立連接的關鍵就是原宿雙方都要確定是否能到達對方,如果確認就可以建立連接套接字。

第一次握手:客戶端發送過來,服務器收到後,對於服務器來說客戶端可以到達自己,但是自己是否可以到達客戶端不知道;而對於客戶端來說,自己是否能到達服務器也並不知道。為了信息對等,客戶端需要等待服務器的回應,而服務器需要發送響應包來看看自己是否可以到達發送者;

第二次握手:服務器發送ack數據包到發送者;當客戶端收到包後,對於客戶端說明服務器跟自己是雙向都通的,這是客戶端的信息齊活了;但是服務器並不知道自己的包客戶端是否收到了,所以就產生了第三次握手;

第三次握手:客戶端發送ack+2到服務器,服務器收到這最後一個ack包後信息就對稱了,就可以建立連接socket了。

但是為什麼要四次揮手呢?

這就是安全關閉的需要,因為,信道是不可信的,需要確認通道中雙方發送的數據包都對等了,才能關閉,我們詳細解構下:

任何一端都可以發起關閉;我們就從客戶端發起說起:

第一次揮手:客戶端在發送完最後一個數據包後就想,我done了,想退出,發個fin的包給服務器吧;這是第一次揮手;這個包有兩個含義:1、表明自己要中斷連接了,2、標記了最後一個包的id;潛臺詞就是,這是我最後一個包,如果之前的包都收到了請關閉連接,如果沒收到我等你發重傳的信號;看,這多靠譜!

第二次:服務器接收到請求後,明白客戶端想退出,並知道客戶端發送的最後的數據id;這時,服務器就要做兩件很重要的事情:1、告訴客戶端自己收到了中斷連接的請求,2、檢查包的完整性;這時,服務器會馬上發送一個fin ack給客戶端,告訴他,你等著,我檢查下包是不是都收齊了哈,一會兒給你答覆;

第三次揮手:服務器檢查後,嗯,收齊了,同時,服務器已經收齊了所有數據包,所以可以清理內存了;當然也可以告訴客戶端中斷連接了,也不能讓客戶端等太久,於是主動發送fin的請求包給客戶端;

第四次揮手:客戶端收到後,好嘞,沒白等,總算是包對等了,關了吧,拜拜,發送了最後一個fin ack給服務器,然後自己就清理內存去了。


分享到:


相關文章: