1. 程式人生 > >為什麼要3次握手和4次揮手

為什麼要3次握手和4次揮手

TCP的3次握手和4次揮手很好理解,但如果問一句,你思考過為什麼需要這麼複雜的步驟嗎?

 

還是來回顧下這兩個操作,首先明確下TCP是全雙工通訊(2個方向能同時通訊)

(1)3次握手

這裡我用男生和女生聊天的例子來解釋

男生:在幹嘛(第1次握手)  
                                                刷微博 :女生(第2次握手)
男生:哦(第3次握手)  
男生:xxxxx(開始傳輸局)  
                                            xxxxxxxx :女生

客戶端傳送連線請求(第1次握手),服務端返回收到了該請求的確認(第2次握手)

客戶端傳送收到了服務端確認的確認(第3次握手),3次握手之後連線建立完成

問題來了,為什麼要3次?2次握手為什麼不行?

其實2次握手可以完成連線的建立,但會帶來資源浪費的問題


 客戶端              (第2次傳送請求)------------>(第1次傳送請求)-------------->          服務端


假設通訊道路堵塞,第1次的請求未能在限定時間內收到服務端的請求,可能堵塞也可能丟失,於是傳送第2次請求

堵塞結束後,2次的請求自然建立了2個TCP連線,但問題是,第1個連線已經被客戶端放棄了(因為之前的超時客戶端不會在

這個連線上傳輸資料),而服務端開啟了2個連線。此時只有第2個連線是有用的,第1個連線自然就造成了資源的浪費。

 

 

(2)4次揮手

男生:拜拜(第1次揮手)  
                                                    哦 :女生(第2次揮手)
                                              xxxxxx :女生(第3次揮手)
男生:哦(第4次揮手)  

這裡第3次揮手是因為服務端可能存在為傳輸完的資料

這裡服務端在第3次揮手完之後關閉服務端向客戶端的連線,第4次揮手後客戶端向服務端的連線關閉

所以,為什麼要4次揮手?

因為TCP的連線只能由客戶端開始放棄,服務端只能被動接受,客戶端放棄連線後

服務端的資料可能沒傳輸完,所以需要4次揮手才能確保全雙工通訊的關閉。