計算機網路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+1,ack = 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 進入戀愛狀態
漂亮姐姐:進入戀愛狀態。