終於有時間寫這篇文章了,最近真的比較忙!
TCP協議 之 “三次握手”
引言:我們知道,TCP是面向連接的協議(相較於UDP無連接的協議),會在傳送數據之前先在 發送端 & 接收端 之間建立一條連接,所以實現了可靠傳輸。而運輸鏈接是用來傳送TCP報文的。TCP運輸連接的建立,是面向連接的通信協議傳送數據之前必需的一個步驟。
一次傳輸涉及到三個步驟:
- 建立連接(本篇所涉及)
- 傳送數據
- 釋放連接
在建立連接時,有趣的“三次握手”就粉墨登場了。
所謂三次握手,其實是發送端&接收端在傳送數據之前的 一次握手,發送了三次報文而已。下面具體說明連接建立(握手)的過程。
Notice:發送端以及接收端 通常指 客戶端和它所請求的服務器,書上一般是這樣寫的,但這里我還是采用 發送端&接收端 來敘述。
在傳送之初,發送端進程(應用層) 先創建傳輸控制塊(Transmission Control Block, TCB)。當要向某端發送數據(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 進入戀愛狀態
漂亮姐姐:進入戀愛狀態。
