1. 程式人生 > >socket關於三次握手,四次揮手的理解

socket關於三次握手,四次揮手的理解

socket的建立是全雙工的,所以會有三次握手,但是四次揮手的區別。

         客戶端<------------------------------------------->伺服器

握手1,客戶端請求伺服器建立連線(客戶端發);

握手2,伺服器同意客戶端的請求(客戶端發),並要求和客戶端也建立連線(客戶端收);

握手3,客戶端同意伺服器的請求(客戶端收);

然後,客戶端和伺服器直接進行資料的收發,

(揮手是客戶端和伺服器端都可以主動發起的,這裡以客戶端主動發起為例)

揮手1,客戶端告訴伺服器要中斷客戶端發往伺服器的這條線(客戶端發);

揮手2,伺服器應答客戶端的中斷請求(客戶端發),此刻可能存在伺服器依舊要給客戶端傳送資料的可能,所以不能中斷伺服器發往客戶端這條線,因此這裡就形成了“三次四次的差別”;

然後,伺服器傳送資料到客戶端,

揮手3,伺服器告訴客戶端要中斷伺服器發往客戶端的這條線(伺服器發);

揮手4,客戶端應答伺服器的中斷請求(伺服器發);

四次揮手之後,不是立即斷開連線,客戶端要等待確認伺服器收到了應答資訊,即TIME_WAIT。

寫過socket程式的人都遇到過,客戶端的可執行程式執行結束之後,立刻去再執行這個可執行程式時,會提示這個socket正在被用,過兩分鐘左右,再執行,就不會有提示了,正是TIME_WAIT的原因。