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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

TCP 协议头全解

發布時間:2023/12/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TCP 协议头全解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TCP 協議頭全解

寫在前面

好久沒有寫在前面了,這次寫下。很久沒有更新,csdn 估計要忘了我了,排名一直在掉,提筆寫這篇文章,說實話,從題目定了,到下筆,中間大概有 3 天之久,到完成可能還更晚。一來是最近可能有點忙,二來有點不知道該如何提筆了,有時候在想 ”意義“ 二字。有時會頹然覺得,所思所想所做,都無甚大意義,大抵如此。

說回技術文章,我看技術文章有個毛病,看長篇大論,很容易就不想看了,密密麻麻寫了一堆,我靠,我根本不想看好嘛。

然鵝,到我寫的時候,也不可避免的會堆一些學術文檔來說明。確實很惡心,但又有啥辦法呢,為了能夠明確主題和主旨,所以加個模塊 《本文將帶你學會》總結一下我這篇文章將為你帶來什么,你能從這里 get 到什么。避免大家浪費時間是不。

文章我盡量寫的簡潔一點,把我在學習過程中疑惑的點整理出來。

害,干貨啊干貨,前有干貨,所以,三連很有用。

本文將帶你學會

1. 從 wireshark 中來看面試中常問的 tcp 三次握手 四次揮手 真正的數據面目到底是什么?

2. 看到 TCP/IP 五層模型的具象化真實表達

3. 網絡傳輸中 TCP 頭全解析

我用 wireshark 抓了我的接口

從 wireshark 看 ”三次握手“ 和 ”四次揮手“

首先帶你們看看,一次接口請求,在網絡中都經歷了什么

上圖,三次握手 建立連接,請求接口傳輸數據。這個時候請求結束,TCP 進行了一波 Keep-Alive

最后服務端向我請求端發起了斷鏈,進行了四次揮手 斷開連接。

三次握手建立連接,四次揮手斷開連接。這個我們在后面講為什么要這么做。重點看數據包中都發了寫什么

首先拿第一個 SYN 請求連接包來舉例看

這里可以具象化地看到,我們所謂的分層都是些什么東西,他們的實際表現形式

TCP/IP 五層最終的表達是什么?

物理層: Frame 11561: 78 bytes on wire (624 bits), 78 bytes captured (624 bits) on interface en0, id 0

數據鏈路層: Ethernet II, Src: Apple_cb:e5 (90::cb:ec:c5), Dst: Huaa:04 (ac:7:40:ea:04)

網絡層: Internet Protocol Version 4, Src: 172.16.25.144, Dst: 192.168.26.144

傳輸層: Transmission Control Protocol, Src Port: 58173, Dst Port: 18080, Seq: 0, Len: 0

應用層: 這里沒有,下面 HTTP 協議就有了

看一眼,HTTP 的

應用層: Hypertext Transfer Protocol

看到這里有些蒙的同學可以看看我之前的文章,補補課復習一下

網絡編程之 Socket 編程 一文看懂

網絡分層流轉—從瀏覽器請求到服務端響應究竟經歷了什么?

本篇重點是 傳輸層協議 TCP ,篇幅問題,就不節外生枝,直接走主線

Transmission Control Protocol 中都存了什么

在這里我要放一下,網絡上都放爛了的圖,當然我會抄一遍,用自己的形式展示出來 [狗頭]

給了圖,不解釋下什么意思,就是耍流氓了,這里大概給個解釋,讓大家對這個設計有個理解

源端口號 Source Port: 一般來說就是客戶端發起請求時使用的端口號,這個在瀏覽其發起請求時會自動分配一個。比如這里我被分配的端口號就是 58173。這個作用是服務端給你返回數據的時候能找到你客戶端的端口

目的端口號 Destintion Port: 這個就是你要訪問的服務的端口號,比較常用的如 8080 ,我這里是 18080。同理,你請求到了服務端總要知道服務是由哪個端口提供的吧。

序號 Sequence Number: TCP 為了保證包的順序到達,就需要給每個包一個需要來標識它的順序,它解決了亂序的問題,當然這個邏輯也是在兩端程序邏輯控制的,真正的包到了網絡中是怎么樣的,那對你來說可就是鞭長莫及干瞪眼了。(祈禱他能平安到達吧)

關于序號的生成規則

TCP 是面向字節流的,這意味著 TCP 在傳輸數據的過程中會為每個字節按照順序進行編號。例如對于傳輸 10 kb 的 HTML 文檔

10 kb = 10 * 1024 byte = 10240 byte 一共 10240 個字節。

序號是 32 位 是 2^32 是 4 294 967 296 = 4G 所以 TCP 可以對 4G 的數據進行編號,超過之后回 0 重新計數

那對于上面的 10 kb 其編號范圍就是 [0,10239]

這里的序號標識的是此報文段中,數據的第一個字節的序號,如上述 10 kb 數據我們分成兩等分傳輸

第一段: 5 kb Sequence Number = 0 ; 其范圍是 [0,5119]

第二段: 5 kb Sequence Number = 5120 ; 其范圍是 [5120,10239]

相信大家可能注意到了一點,超出 4G 重復使用編號的問題,這種情況其實基本不用擔心,一般情況,舊的序號早就到達終點,或者丟失了。

確認序號 Acknowledgement Number: 為了保證可靠性,發出去的包需要確認到達,就有了確認序號,這個解決了丟包的問題,一定時間沒確認收到就重發嘛。我們 TCP 能做啥呢,就是不斷的重傳,寄希望于能得到對端的收到確認,卑微也就至此了。

同樣的 32 位確認序號,表示的是 期望收到對方下一個報文的序號值。

TCP 的可靠就是基于此,我們要確認每個發送出的報文都被確認收到了。

通訊雙方在接到對方的報文后,都需要發送一個對應的確認報文,要告知已經收到,有確認報文就需要確認好

如第一段: 5 kb Sequence Number = 0 ; 其范圍是 [0,5119] 發送過來,此時回 ACK 確認報文 Acknowledgement Number = 5120

標志位 Flags: 標志位共 16 位,首部占 4 位,保留 6 位,剩余 6 位每沒一位標志不同的意思

  • 首部 Header Length 4 位,表示 TCP 報文段首部長度,看了下有的地方也叫它數據偏移,可以理解為 TCP 報文起始位置 到 數據部分 payload 的起始位置 也就是上圖中 [源端口號 , 選項, 填充 ] 這部分數據的大小,4 位 0000 最大為 1111 = 15 ,這里每個數代表 4 byte,所以首部最大是 15 * 4 byte = 60 byte
  • 保留 6 位 保留 6 位默認給 0,用于之后的拓展
  • 標志位 目前 6 位下圖,0 表示沒有,1 表示標識,每位代表不同含義
  • 緊急 Urgent URG 該位為 1 表示后面要說到的 緊急指針 有效,用于告訴系統,此報文段中包含緊急數據,應該盡快傳送,而不是按原有順序排隊傳,緊急嗎,就是要加急傳輸。
  • 確認 Acknowledgment ACK 該位為 1 表示確認序號 Acknowledgement Number 有效,一般稱攜帶 ACK 標志的 TCP 報文段稱為確認報文段,TCP 規定在建立連接后所有的傳輸報文都必須報 ACK 設置為 1
  • 推送 Push PUS 該位為 1 表示該報文高優先級,接收方 TCP 應該盡快將其推送給應用服務,而不用等到 TCP 緩存填滿后再一起發送
  • 復位 Reset RST 該位為 1 表示在 TCP 連接中出現了嚴重的錯誤,需要釋放并重新建立連接,一般攜帶 RST 標志的報文段稱之為 復位報文段
  • 同步 Syn SYN 該位用于標識此報文為同步報文,SYN = 1 ACK = 0 表示此次是 請求建立連接報文段,如果對方同意建立連接,則會返回一個 SYN = 1 ACK = 1 的響應報文。
  • 終止 Fin FIN 用于標識斷開連接,為 1 是表示此報文的數據發送方數據已發送完畢,請求斷開釋放連接,這個在 ”四次揮手“ 時會用到。
  • 窗口大小 Window : 16 位,該字段指定此時允許對方發送的最大數據量,也就是說此數據是我方緩沖區剩余大小,用于控制發送數據的速度

    窗口大小是指,從本端報文的 確認序號 Acknowledgment Number 開始,還允許對方發送的數據量。

    比如 Acknowledgment Number = 100 Window = 60 ,那么標識報文發送方還有 60 字節的接收空間,即序號范圍是 [100,159] 的數據。

    校驗和 CheckSum: 16 位 用于檢測 TCP 報文段在傳輸過程中有沒有損壞,如果損耗則丟棄,采用 CRC 算法,這個是保證 TCP 可靠傳輸的重要一環。 具體生成校驗規則,感興趣同學可以自行搜索算法。

    緊急指針 Urgent Pointer: 16 位 ,當標志位 URG 為 1 時有意義,用于指出報文段中緊急數據的字節數。發送方會將緊急數據插入到本次報文段的最前面,而后面的仍然是普通數據,緊急指針指示的是緊急數據的末尾在本段報文數據的位置。

    給你們看看 16 進制表示,而老說的位 ”01010101“ 而進制傳輸本質是 01 嘛,為啥不給你看 01 ? 因為不好看哈哈

    不想寫了,本文到這,下期再見

    總結

    以上是生活随笔為你收集整理的TCP 协议头全解的全部內容,希望文章能夠幫你解決所遇到的問題。

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