1. 程式人生 > >計算機網路TCP“三次握手”

計算機網路TCP“三次握手”

終於有時間寫這篇文章了,最近真的比較忙!

TCP協議  三次握手

  引言:我們知道,TCP是面向連線的協議(相較於UDP無連線的協議),會在傳送資料之前先在 傳送端 & 接收端 之間建立一條連線,所以實現了可靠傳輸。而運輸連結是用來傳送TCP報文的。TCP運輸連線的建立,是面向連線的通訊協議傳送資料之前必需的一個步驟。

 一次傳輸涉及到三個步驟:

  • 建立連線(本篇所涉及)
  • 傳送資料
  • 釋放連線

  在建立連線時,有趣的“三次握手”就粉墨登場了。

  所謂三次握手,其實是傳送端&接收端在傳送資料之前的 一次握手,傳送了三次報文而已。下面具體說明連線建立(握手)的過程。

  Notice:傳送端以及接收端 通常指 客戶端和它所請求的伺服器,書上一般是這樣寫的,但這裡我還是採用 傳送端&接收端 來敘述。

  在傳送之初,傳送端程序(應用層) 先建立傳輸控制塊(Transmission Control Block, PCB)。當要向某端傳送資料(TCP報文段)時:

傳送端:--------------------1

  發出連線請求報文段(規定不能攜帶資料,但要消耗序號,以便識別應答報文段)先將報文段首部的 同步位SYN = 1, 並選擇一個初始序號 seq = x, 發出此報文段(傳送埠&目的埠等也要設定好),進入 SYN-SENT

(同步請求已傳送)狀態。

接收端:(此前一直處於Liscen 偵聽狀態,就像伺服器一樣)----------------------2

  收到連線請求報文段後,若同意連線(就像伺服器允許訪問,不允許就返回錯誤碼),向傳送端 傳送確認連線報文段:同樣 同步位SYN = 1,確認位 ACK = 1(表明確認報文段有效/這是有效回答報文段), 同樣需要選擇報文序號 seq = y, 應答號ack = x+1(表明是對序號x的請求報文段的確認應答),向原發送端發出此報文段(埠要繫結好),進入SYN-RCVD(同步接受)狀態。

傳送端:--------------------3

  收到確認連線報文段後,再次向接收端給出確認

(Why?後續文章會解釋):已經達到了同步,於是此報文段就不再需要SYN,直接 確認ACK = 1 seq = x+1ack = y+1,傳送報文段。傳送端進入ESTABLISHED(運輸連線已建立)狀態。

接收端

  收到傳送端的確認後,進入ESTABLISHED(運輸連線已建立)狀態。(未傳送報文,不算在內)

  傳送資料......

  釋放連線......(後面文章)。

  其實,在我看來,“三次握手”即“三報文握手”,就像是 表白 一樣。下面是有趣的理解:

“三次握手”------表白版

男生:---------------------1

  “小姐姐, 我喜歡你, 你喜歡我嗎?”  SYN=1, seq=x                進入表白傳送完成狀態

漂亮姐姐:---------------2

  (如果同意)“啊!是嗎!我也喜歡你呢!”  SYN=1, ACK=1, seq=y, ack=x+1   進入表白接受狀態

男生:---------------------3

  “那小姐姐以後就是我的啦!” ACK=1, seq=x+1, ack=y+1            進入戀愛狀態

漂亮姐姐:進入戀愛狀態。