趣談TCP三次握手連接

1.先趣談三次握手鍊接

在開始正式的講TCP三次握手連接前,先來一小段對話,來讓你腦中有個大概的框架。
下面展示 對話情景

對話介紹:
角色:祖安人(客戶端) , 萌新(服務器)。
背景:歡快的祖安人在一局匹配中被不知名的0/20/0隊友"歡快"的結束遊戲,於是
祖安人加了那個 0/20/0 隊友(ID 萌新)的好友,想要以祖安人的最高禮節帶他玩一
把遊戲。故事開始前... ...
祖安人萌新你好!兄弟可以一起玩遊戲嗎?當然可以啊!好的!那就開始遊戲把!祖安人萌新
遊戲加載100%,祖安人以傳統個最隆重的禮儀開始了友好互動。
“祖安大舞臺... ...” 

故事就到這裏結束了,這裏用一個小對話簡單的描述了三次握手連接,先有一個印象,下面開始來正式介紹 TCP的三次握手連接

2.TCP三次握手:報文段交換

看了上面那個小對話,接下來我們看正式的TCP三次握手
在這裏插入圖片描述
看完上面的圖我們可以清楚的看到,TCP三次握手:報文段 的交換的較詳細的過程。但是裏面的一些細節可能就有點難搞了,例如: SYN,seq,ACK等等這些,所以接下來先補充複習一下TCP報文段的相關知識

- TCP報文段結構

TCP報文段結構@author Baymax
然後從上到下解釋:

  1. 源端口號和目的端口號:
源端口號和目的端口號各佔2個字節,被用於多路複用/分解來自或者送到上層應用
的數據。
  1. 序號seq:
佔32比特,也就是4個字節。一個報文段的序號是該報文段首字節的字節流編號。
  1. 確認號ack:
佔4個字節。確認號就是主機正在等待的數據的下一個字節序號。
例如:客戶發送的第一個報文段的序號 seq =  99;那麼服務器發送的報文段的
確認號: ACK= 100
  1. 首部長度
 佔4個字節。該字段指示了以32個字節的字爲單位的TCP首部長度;
 因爲TCP選項字段通常爲空,所以TCP的首部一般是20字節(比UDP首部多12字節)。
  1. 保留未用:
 佔6個字節。跟它名字一樣的意思。
  1. 標誌字段(flag field):
佔6個字節。
1.確認號ACK :用於指示確認字段中的值是有效的,即該報文段包括一個對已被成功接
收報文段的確認。
		ACK = 1,確認號纔會生效

2.緊急URG :用來指示報文段裏存在着被髮送端的上層實體置爲"緊急"的數據。緊急
數據的最後一個字節由16比特的緊急數據指針指出。並且當緊急數據存在並且給出
指向數據尾的指針的手,TCP必須通知接收端的上層實體。
				當URG=1表示緊急指針有效。

3.推送PSH: 用來指示接收方應該立即將數據交給上層。

4.復位RST: 用來主動釋放連接。
   			當RST = 1時,釋放連接並重新建立連接。
   			
5.SYN:     用來在建立連接時。
   			當SYN = 1 時,表明這是一個連接請求報文段。
6.終止FIN 
FIN=1時,表示數據已全部傳輸完成,發送方不會再傳輸數據,並且要求釋放當前
連接。
FIN=0,正常傳輸數據。
  1. 接收窗口字段:
佔16個字節。該字段用於指示接收方願意接收的字節數量。
  1. 因特網檢驗和:
佔2個字節。該字段用於對TCP頭部和數據進行檢驗。
  1. 緊急數據指針:
佔2個字節。用來記錄"緊急數據"的位置。
  1. 選項:
可選與變長的選項字段,該字段用於發送方與接收方協商最大報文段長度(MSS)時,
或在告訴網絡環境下用作窗口調節因子時使用。首部字段中還定義了時間戳選項。
  1. 數據:
應用層提供的數據,也是TCP的一部分。

這些就是TCP首部的相關知識,瞭解、複習一下。下面開始分析 三次握手

- 三次握手分析

在這裏插入圖片描述

  1. 客戶端首先向服務器端的發送一個特殊的TCP報文段 (SYN = 1, seq = client_isn),報文段首部SYN 被置 1, 建立連接請求;另外,客戶端會隨機的選擇一個初始序號 client_isn放在序號字段中,並且該報文段中不包含應用層數據
  2. 客戶端發送的 SYN報文段(建立連接請求)到達服務器後,服務器端會返回允許建立連接的報文段,確認號: ack = client_sin + 1 , 服務器自己的序號字段sever_isn,也會返回SYN = 1(因爲此時連接還沒建立好)。
這個允許連接的報文段實際上表明瞭:“我收到了你發起連接的SYN分組,該分組
帶有你的初始序號client_isn。我同意建立該連接。我自己的初始序號是
sever_isn” 該允許連接的報文段有時被稱爲 SYNACK報文段(SYNACK segment)

摘自《計算機網絡-自頂向下》

  1. 在客戶端收到了 SYNACK報文段之後,需要返回對 SYNACK報文段的應答,也就是對服務器的允許連接的報文段進行確認。
    應答分析:
    因爲連接已經建立,所以 SYN比特被置爲0,並且在以後的每一個報文段中,SYN比特都將被置爲0;確認號 ack = server_isn + 1

當服務器端收到客戶端上述的應答報文段之後,一條完整的TCP連接就建立好了。

3.問:爲什麼發送方要發出第三個確認報文呢?

答:避免已經失效的的連接請求報文傳送到對方,引起錯誤。
  
三次握手是爲了雙方同步自己的序列號,第三段報文是一個確認報文。如果確認報文還需要對方確認的話,將會無限循環確認。(個人理解)

這裏可以用上面的小對話來分析一下:

祖安人萌新你好!兄弟可以一起玩遊戲嗎?當然可以啊!好的!那就開始遊戲把!祖安人萌新

如果沒有第三個確認報文,萌新就會繼續在那裏等,這時如果你剛好是一個文曲星下凡的小可愛,你和萌新還沒進入遊戲(沒有達到最初目的),電競文曲星的你就開始和萌新友愛的各種互動了。(個人理解)

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