TCP傳輸中的“三次握手”建立連接和“四次握手”釋放連接過程

TCP的連接管理主要面向三個連接階段,分別是連接建立,傳輸數據,連接釋放。
其中連接的建立和連接釋放是兩個重要的知識點,分別有兩個比較形象的稱呼:三次握手和四次握手。
最近正在學習傳輸層的知識,故借本文對這兩個階段進行簡要整理。

首先必須明確的是TCP協議是採用客戶/服務器的方式,主動發起連接建立的應用進程稱爲客戶機,被動等待連接建立的應用進程稱爲服務器。

三次握手

在這裏插入圖片描述
一次連接建立的過程如下:

  1. 客戶機首先向服務器發送一個TCP請求連接報文,報文不含應用層數據,比較值得注意的是就是報文首部字段,SYN = 1, seq = J;SYN=1表示這是一個請求連接報文,而seq = J 則是表示該報文段的序號,用於確保可靠傳輸(報文不攜帶數據但是仍然消耗一個序號)。
  2. 服務器收到請求連接報文之後,若同意該請求,則爲該TCP分配緩存,然後發送一個確認連接報文,其首部的字段分別爲:SYN= 1,seq = K,ACK = 1, ack = J + 1;SYN=1表示這是一個連接接收報文,seq表示服務器發送報文的序號,ACK是確認位,而ack = J + 1則是表示服務端已經收到了J號報文,下一個報文希望接收的是序號爲 J + 1的報文。
  3. 當客戶端接收到服務器的確認報文之後,需要再向服務端進行確認連接。這是再發送一個普通的確認報文即可。其ACK=1,ack = K+1.

這裏值得注意的一個點就是,爲什麼不能一次或者兩次握手就完成連接?
我們來假設一下,如果使用一次握手那麼會存在什麼樣的問題?
服務端不同意請求或繁忙,但由於是一次握手,客戶端不清楚服務器是否爲其分配了緩存,這樣就會導致後續的數據傳輸失效。
如果只使用二次握手,則會發生:
當服務器同意連接請求之後,發送接收確認報文後,客戶端因爲一些原因(如停機)導致無法傳輸數據,進而無法發送確認連接報文,那麼服務端就會爲這個掉線的客戶端分配多餘的資源,導致資源浪費。

四次握手

在這裏插入圖片描述
TCP的連接釋放可以簡單概括爲兩個階段:

  1. 前兩次握手是爲了終止客戶機到服務器的數據傳輸,但是服務器仍可以向客戶機發送數據
  2. 後兩次握手是爲了終止服務器向客戶機發送數據。

四次握手的過程如下:

  1. 客戶機向其TCP發出一個連接釋放報文,其首部字段 FIN = 1,seq = u。當某一端發起一個附帶FIN=1的報文時,則表示這一端終止發送數據,後續只能被動接收數據。
  2. 服務器接收客戶端釋放報文,返回確認報文,其首部字段爲 ACK=1,seq = v,ack = u + 1。這樣從客戶端到服務器的單向數據傳輸就終止了。但服務器仍然可以向客戶端發送數據
  3. . 若服務端沒有要向客戶端發送的數據了,那麼服務端發出連接釋放報文,其首部字段 FIN = 1,ACK= 1,seq = w,ack = u + 1。
  4. 客戶機接收到連接釋放報文之後,必鬚髮出確認,其中ACK=1,seq = u + 1, ack = w + 1。此時TCP還未真正釋放,必須經過時間等待計時器設置的時間2MSL後,客戶端才進入關閉連接的狀態。

這裏需要清楚一點就是,爲什麼不能三次握手就完成連接的釋放,即省略最後一步,確認報文。。
因爲這裏是TCP協議,通過確認機制來保證可靠傳輸,針對一個非確認報文,接收方需要發送一個確認報文給發送方,如果客戶機未接收到發送方的釋放連接報文,而服務器並不清楚就主動斷開連接,這樣就會使得客戶機繼續保留維護連接的資源,造成資源浪費。一般來說,服務器未接收到確認報文的話,就會觸發超時重傳,確保客戶機接收到連接釋放的報文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章