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 位每沒一位標志不同的意思
窗口大小 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 ? 因為不好看哈哈
不想寫了,本文到這,下期再見
總結
- 上一篇: 集成电路
- 下一篇: 如何搭建谷歌离线地图服务