日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图解TCP数据报结构以及三次握手(非常详细)

發布時間:2025/3/12 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图解TCP数据报结构以及三次握手(非常详细) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TCP(Transmission Control Protocol,傳輸控制協議)是一種面向連接的、可靠的、基于字節流的通信協議,數據在傳輸前要建立連接,傳輸完畢后還要斷開連接。

客戶端在收發數據前要使用 connect() 函數和服務器建立連接。建立連接的目的是保證IP地址、端口、物理鏈路等正確無誤,為數據的傳輸開辟通道。

TCP建立連接時要傳輸三個數據包,俗稱三次握手(Three-way Handshaking)。可以形象的比喻為下面的對話:

  • [Shake 1] 套接字A:“你好,套接字B,我這里有數據要傳送給你,建立連接吧。”
  • [Shake 2] 套接字B:“好的,我這邊已準備就緒。”
  • [Shake 3] 套接字A:“謝謝你受理我的請求。”

TCP數據報結構

我們先來看一下TCP數據報的結構:


帶陰影的幾個字段需要重點說明一下:
1) 序號:Seq(Sequence Number)序號占32位,用來標識從計算機A發送到計算機B的數據包的序號,計算機發送數據時對此進行標記。

2)?確認號:Ack(Acknowledge Number)確認號占32位,客戶端和服務器端都可以發送,Ack = Seq + 1。

3)?標志位:每個標志位占用1Bit,共有6個,分別為 URG、ACK、PSH、RST、SYN、FIN,具體含義如下:

  • URG:緊急指針(urgent pointer)有效。
  • ACK:確認序號有效。
  • PSH:接收方應該盡快將這個報文交給應用層。
  • RST:重置連接。
  • SYN:建立一個新連接。
  • FIN:斷開一個連接。
對英文字母縮寫的總結:Seq 是?Sequence 的縮寫,表示序列;Ack(ACK) 是?Acknowledge 的縮寫,表示確認;SYN 是?Synchronous 的縮寫,愿意是“同步的”,這里表示建立同步連接;FIN 是 Finish 的縮寫,表示完成。

連接的建立(三次握手)

使用 connect() 建立連接時,客戶端和服務器端會相互發送三個數據包,請看下圖:


客戶端調用?socket() 函數創建套接字后,因為沒有建立連接,所以套接字處于CLOSED狀態;服務器端調用 listen() 函數后,套接字進入LISTEN狀態,開始監聽客戶端請求。

這個時候,客戶端開始發起請求:
1) 當客戶端調用 connect() 函數后,TCP協議會組建一個數據包,并設置 SYN 標志位,表示該數據包是用來建立同步連接的。同時生成一個隨機數字 1000,填充“序號(Seq)”字段,表示該數據包的序號。完成這些工作,開始向服務器端發送數據包,客戶端就進入了SYN-SEND狀態。

2) 服務器端收到數據包,檢測到已經設置了 SYN 標志位,就知道這是客戶端發來的建立連接的“請求包”。服務器端也會組建一個數據包,并設置 SYN 和 ACK 標志位,SYN 表示該數據包用來建立連接,ACK 用來確認收到了剛才客戶端發送的數據包。

服務器生成一個隨機數 2000,填充“序號(Seq)”字段。2000 和客戶端數據包沒有關系。

服務器將客戶端數據包序號(1000)加1,得到1001,并用這個數字填充“確認號(Ack)”字段。

服務器將數據包發出,進入SYN-RECV狀態。

3) 客戶端收到數據包,檢測到已經設置了 SYN 和 ACK 標志位,就知道這是服務器發來的“確認包”。客戶端會檢測“確認號(Ack)”字段,看它的值是否為 1000+1,如果是就說明連接建立成功。

接下來,客戶端會繼續組建數據包,并設置 ACK 標志位,表示客戶端正確接收了服務器發來的“確認包”。同時,將剛才服務器發來的數據包序號(2000)加1,得到 2001,并用這個數字來填充“確認號(Ack)”字段。

客戶端將數據包發出,進入ESTABLISED狀態,表示連接已經成功建立。

4) 服務器端收到數據包,檢測到已經設置了 ACK 標志位,就知道這是客戶端發來的“確認包”。服務器會檢測“確認號(Ack)”字段,看它的值是否為 2000+1,如果是就說明連接建立成功,服務器進入ESTABLISED狀態。

至此,客戶端和服務器都進入了ESTABLISED狀態,連接建立成功,接下來就可以收發數據了。

最后的說明

三次握手的關鍵是要確認對方收到了自己的數據包,這個目標就是通過“確認號(Ack)”字段實現的。計算機會記錄下自己發送的數據包序號 Seq,待收到對方的數據包后,檢測“確認號(Ack)”字段,看Ack = Seq + 1是否成立,如果成立說明對方正確收到了自己的數據包。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的图解TCP数据报结构以及三次握手(非常详细)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。