1.先趣談三次握手鍊接
在開始正式的講TCP三次握手連接前,先來一小段對話,來讓你腦中有個大概的框架。
下面展示 對話情景
。
對話介紹:
角色:祖安人(客戶端) , 萌新(服務器)。
背景:歡快的祖安人在一局匹配中被不知名的0/20/0隊友"歡快"的結束遊戲,於是
祖安人加了那個 0/20/0 隊友(ID 萌新)的好友,想要以祖安人的最高禮節帶他玩一
把遊戲。故事開始前... ...
遊戲加載100%,祖安人以傳統個最隆重的禮儀開始了友好互動。
“祖安大舞臺... ...”
故事就到這裏結束了,這裏用一個小對話簡單的描述了三次握手連接,先有一個印象,下面開始來正式介紹 TCP的三次握手連接。
2.TCP三次握手:報文段交換
看了上面那個小對話,接下來我們看正式的TCP三次握手:
看完上面的圖我們可以清楚的看到,TCP三次握手:報文段 的交換的較詳細的過程。但是裏面的一些細節可能就有點難搞了,例如: SYN,seq,ACK等等這些,所以接下來先補充複習一下TCP報文段的相關知識 。
- TCP報文段結構
然後從上到下解釋:
- 源端口號和目的端口號:
源端口號和目的端口號各佔2個字節,被用於多路複用/分解來自或者送到上層應用
的數據。
- 序號seq:
佔32比特,也就是4個字節。一個報文段的序號是該報文段首字節的字節流編號。
- 確認號ack:
佔4個字節。確認號就是主機正在等待的數據的下一個字節序號。
例如:客戶發送的第一個報文段的序號 seq = 99;那麼服務器發送的報文段的
確認號: ACK= 100
- 首部長度
佔4個字節。該字段指示了以32個字節的字爲單位的TCP首部長度;
因爲TCP選項字段通常爲空,所以TCP的首部一般是20字節(比UDP首部多12字節)。
- 保留未用:
佔6個字節。跟它名字一樣的意思。
- 標誌字段(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,正常傳輸數據。
- 接收窗口字段:
佔16個字節。該字段用於指示接收方願意接收的字節數量。
- 因特網檢驗和:
佔2個字節。該字段用於對TCP頭部和數據進行檢驗。
- 緊急數據指針:
佔2個字節。用來記錄"緊急數據"的位置。
- 選項:
可選與變長的選項字段,該字段用於發送方與接收方協商最大報文段長度(MSS)時,
或在告訴網絡環境下用作窗口調節因子時使用。首部字段中還定義了時間戳選項。
- 數據:
應用層提供的數據,也是TCP的一部分。
這些就是TCP首部的相關知識,瞭解、複習一下。下面開始分析 三次握手。
- 三次握手分析
- 客戶端首先向服務器端的發送一個特殊的TCP報文段 (SYN = 1, seq = client_isn),報文段首部SYN 被置 1, 建立連接請求;另外,客戶端會隨機的選擇一個初始序號 client_isn放在序號字段中,並且該報文段中不包含應用層數據。
- 客戶端發送的 SYN報文段(建立連接請求)到達服務器後,服務器端會返回允許建立連接的報文段,確認號: ack = client_sin + 1 , 服務器自己的序號字段sever_isn,也會返回SYN = 1(因爲此時連接還沒建立好)。
這個允許連接的報文段實際上表明瞭:“我收到了你發起連接的SYN分組,該分組
帶有你的初始序號client_isn。我同意建立該連接。我自己的初始序號是
sever_isn” 該允許連接的報文段有時被稱爲 SYNACK報文段(SYNACK segment)。
摘自《計算機網絡-自頂向下》
- 在客戶端收到了 SYNACK報文段之後,需要返回對 SYNACK報文段的應答,也就是對服務器的允許連接的報文段進行確認。
應答分析:
因爲連接已經建立,所以 SYN比特被置爲0,並且在以後的每一個報文段中,SYN比特都將被置爲0;確認號 ack = server_isn + 1。
當服務器端收到客戶端上述的應答報文段之後,一條完整的TCP連接就建立好了。
3.問:爲什麼發送方要發出第三個確認報文呢?
答:避免已經失效的的連接請求報文傳送到對方,引起錯誤。
三次握手是爲了雙方同步自己的序列號,第三段報文是一個確認報文。如果確認報文還需要對方確認的話,將會無限循環確認。(個人理解)
這裏可以用上面的小對話來分析一下:
如果沒有第三個確認報文,萌新就會繼續在那裏等,這時如果你剛好是一個文曲星下凡的小可愛,你和萌新還沒進入遊戲(沒有達到最初目的),電競文曲星的你就開始和萌新友愛的各種互動了。(個人理解)