1. 程式人生 > >為什麼是三次握手而不是兩次握手,為什麼是四次揮手

為什麼是三次握手而不是兩次握手,為什麼是四次揮手

為什麼是三次握手?

三次握手可以簡單看做是客戶傳送請求,伺服器對客戶的請求進行確認,客戶對伺服器的確認再進行確認。

如果採用兩次握手,假設下面這種情況,客戶向伺服器傳送請求,伺服器沒有對客戶的請求進行確認(因為網路

的延遲他可能沒有收到這個請求)。客戶收不到這個確認於是過一段時間他在向伺服器發起連線請求並順利完成資料

傳輸,但是過了一段時間這個請求到達了伺服器而伺服器誤以為這是一個新的連線請求於是對這個請求進行確認併發

送確認給客戶但是客戶沒有發起過連線請求因此它不會理會伺服器的確認,伺服器以為這個連線已經建立好了於是一

直等待客戶傳送資料,這樣就會造成伺服器的資源浪費。如果採用三次握手上述情況客戶不會向伺服器的確認進行確

認,這樣伺服器收不到確認它就知道客戶沒有要發起請求的連線,於是不會再等待。

三次握手主要是為了防止已失效的連線請求報文突然到達伺服器,造成伺服器的等待和資源的浪費。

為什麼是四次揮手?

在三次握手的過程中,SYN和ACK是一起傳送的但是在四次揮手的時候FIN和ACK卻不是一起傳送的而是分開發

送的,為什麼呢???那是因為啊,TCP連線是全雙工的也就是說接收到FIN只是說沒有資料再發過來但是還是可以發

送資料的,也就是接受到一個FIN只是關閉了一個方向的資料傳輸,另一個方向還可以繼續傳送資料。在四次揮手的

時候也是這樣前兩次揮手只是確認關閉了一個方向的資料,加上後面兩次揮手才真正的關閉了整個全雙工連線。

當socket在ESTABISHED狀態時,他想主動關閉連線於是向對方傳送FIN請求,傳送完FIN請求後它處於FIN_WA  IT_1狀態,當對方確認ACK報文後則處於FIN_WAIT_2狀態。FIN_WAIT_2表示半連線,也就是有一方要求關閉連線 ,另一方收到請求但是告訴她我還有一些資料要傳送稍後會關閉。TIME_WAIT狀態表示收到對方的FIN併發送出ACK.如果三次握手可能在關閉後還有一個方向沒有關閉。