1. 程式人生 > >TCP的三次握手和四次揮手的過程?三次握手改成兩次或者四次可以嗎為什麼?

TCP的三次握手和四次揮手的過程?三次握手改成兩次或者四次可以嗎為什麼?

知識回顧:TCP協議是面向連線的協議。

TCP運輸連線的三個階段:建立連線,資料傳輸,釋放連線

用三次握手建立連線

用四次揮手釋放連線

seq(序號):TCP連線位元組流中每一個位元組都會有一個編號,而本欄位的值指的是本報文段所傳送資料部分第一個位元組的序號。
ack(確認號):表示期望收到的下一個報文段資料部分的第一個位元組的編號,編號為ack-1及以前的位元組已經收到。
SYN:當本欄位為1時,表示這是一個連線請求或者連線接受報文。
ACK:僅當本欄位為1時,確認號才有效。
FIN:用來釋放一個連線。當本欄位為1時,表示此報文段的傳送端資料已傳送完畢,要求釋放運輸連線。

連線建立階段:
第一次握手:客戶端的應用程序主動開啟,並向服務端發出請求報文段。其首部中:

SYN=1,seq=x
第二次握手:伺服器應用程序被動開啟。若同意客戶端的請求,則發回確認報文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y
第三次握手:客戶端收到確認報文之後,通知上層應用程序連線已建立,並向伺服器發出確認報文,其首部:ACK=1,ack=y+1。當伺服器收到客戶端的確認報文之後,也通知其上層應用程序連線已建立。
在這個過程中,通訊雙方的狀態如下圖,其中CLOSED:關閉狀態、LISTEN:收聽狀態、SYN-SENT:同步已傳送、SYN-RCVD:同步收到、ESTAB-LISHED:連線已建立

 

連線釋放階段:
第一次揮手:資料傳輸結束以後,客戶端的應用程序發出連線釋放報文段,並停止傳送資料,其首部:

FIN=1,seq=u第二次揮手:伺服器端收到連線釋放報文段之後,發出確認報文,其首部:ack=u+1,seq=v。此時本次連線就進入了半關閉狀態,客戶端不再向伺服器傳送資料。而伺服器端仍會繼續傳送。
第三次揮手:若伺服器已經沒有要向客戶端傳送的資料,其應用程序就通知伺服器釋放TCP連線。這個階段伺服器所發出的最後一個報文的首部應為:FIN=1,ACK=1,seq=w,ack=u+1
第四次揮手:客戶端收到連線釋放報文段之後,必須發出確認:ACK=1,seq=u+1,ack=w+1。 再經過2MSL(最長報文端壽命)後,本次TCP連線真正結束,通訊雙方完成了他們的告別。
在這個過程中,通訊雙方的狀態如下圖,其中:
ESTAB-LISHED:連線建立狀態、FIN-WAIT-1:終止等待1狀態、FIN-WAIT-2:終止等待2狀態、CLOSE-WAIT:關閉等待狀態、LAST-ACK:最後確認狀態、TIME-WAIT:時間等待狀態、CLOSED:關閉狀態

 

TCP作為一種可靠傳輸控制協議,其核心思想:既要保證資料可靠傳輸,又要提高傳輸的效率,而用三次恰恰可以滿足以上兩方面的需求!

不能改成兩次,第三次是為了防止已經失效的連線請求報文段突然又傳到了伺服器端,因而發生錯誤。客戶端有可能因為網路阻塞等原因會發送多個請求報文,這時伺服器就會建立連線,浪費掉許多伺服器的資源

沒有必要四次,是為了提高傳輸效率