目錄
網絡傳輸基本流程
引入
封裝
過程梳理
圖解
報文
解包
過程梳理
圖解 -- 同層直接通信的證明
總結
解包時的報頭分離問題
舉例 -- 倒水
介紹
自底向上傳輸時的協議定位問題
介紹
解決方法
協議多路復用
介紹
優勢?
網絡傳輸基本流程
引入
首先,我們明確一個前提,協議如何被體現,就是通過在數據前添加報頭實現的 --?協議的概念+本質+作用+最終表現形式,網絡問題(技術+應用+解決的協議+存在原因),主機的對稱性-CSDN博客
所以,每經過一層協議,就會添加一段報頭
封裝
過程梳理
我們根據信息傳輸的順序自頂向下看
首先是應用層
- 因為我們一般都是使用某種軟件來進行通信,而軟件一般都會進行更新,但版本更新不是強制的,所以會存在新/老版本都要向服務器請求數據的情況
- 那么為了不亂套(新老版本的提供的功能不同,兩者是有差異的),就肯定會為它加上一個版本字段,確保不同版本的軟件能夠正確地解析和處理收到的數據
- 而這個字段,正是在應用層的協議中
- 所以數據到了應用層后,會添加應用層協議的報頭
- 該報頭內就會有版本信息
然后來到傳輸層,該層用來保證可靠性
- 這個可靠性不僅僅保證數據成功運輸,也包括信息的發送順序等等(因為順序亂了,意思就完全不一樣了)
- 比如:
- 所以,協議會定義一個序號,用于為信息排序
- 當數據來到傳輸層,依然會添加該層協議的報頭
- 報頭內包含一系列字段,其中就有序號
同理,當數據來到網絡層時(他解決主機定位問題)
- 數據中依然會繼續添加該層協議的報頭
- 報頭內包括了自己的身份,目標主機是哪個等信息
鏈路層也是一樣的
圖解
- 每層新添加的報頭都在最外側
- 到達每層的數據(也叫做報文)都不一樣
報文
指在網絡中傳輸的數據單元,報文=報頭+有效載荷
- 注意,這個報頭僅僅是當前層協議的報頭,剩下的數據就是有效載荷
- 有效載荷每經歷一層,就會增加字段,增加的恰好是上一層添加的報頭:
完成了這四層后,也就完成了封裝的過程(將數據一層一層用報頭包裹在里面)
解包
過程梳理
當我們將報文發送給對方主機后,對方主機就開始自底向上傳輸
- 恰好,報頭可以被一層一層地解析
- 從圖中可以看到,我們最外層的協議報頭,恰好和[在對方主機中遇到的第一層協議]對應上了
- 又因為,這段報文在鏈路層就已經是二進制序列了,所以指針可以指向這塊內存
- 不僅如此,我們還可以通過指針的強制類型轉換,精準地指向該層的協議報頭
- 剩下的部分,就是有效載荷,而有效載荷的開頭,就是上一層的協議報頭
- 之后將有效載荷交給自己的上一層
- 因為各層協議都是匹配的,重復上述過程,就可以準確地解碼出每層對應的報頭(之前一層一層包起來,現在再一層一層解開)
圖解 -- 同層直接通信的證明
注意看,同層之間,發送的和收到的是同樣的報文
這不就相當于同層之間在進行直接通信嗎?
所以,也就證明了 --? 在邏輯上,每層之間根據約定在進行通信
和封裝對應的,以上過程就被叫做解包?
總結
所以,通信的過程就是不斷進行封裝和解包
?
解包時的報頭分離問題
舉例 -- 倒水
如果我們要把多次倒入的水,再分離出來,這是很難的事情
但如果我們將每次倒入的水都用容器裝起來,再將容器扔進去,再想分離就很簡單了
介紹
而在網絡通信中的封裝和分離過程也是同理
- 在封裝的時候,就應該考慮之后該如何分離
比如:
- 協議里就規定好報頭的大小 / 記錄當前報頭大小和報文大小
?
自底向上傳輸時的協議定位問題
介紹
- 我們經過協議封裝后,得到的報頭是特定協議的(具體選擇哪個協議我們不用管)
- 但是將報文發送給對方主機后,下一層如何知道交給上一層的哪個協議呢
- 畢竟每一層的協議有很多,但我們必須交給封裝數據的那個協議(必須要一一對應才能進行通信)
解決方法
所以,協議里還需要記錄當前協議是誰
- 也就是在報頭里增加一個標識字段,該字段指示上層協議的類型
- 從上到下傳輸時,下一層記錄是上一層的哪一個協議交給我的
- 然后從下到上傳輸時,該層解析自己的報頭后,就可以知道自己該交給誰了
而這個協議標識(也就是決定將有效荷載交給上層哪個協議的能力),是實現協議多路復用的關鍵
協議多路復用
介紹
指在通信過程中,通過使用不同的協議標識來區分和識別多個上層協議的技術
- 確保了在傳輸中的數據,能夠被正確地解析和交付給相應的協議進行處理
優勢?
- 可以同時支持多種上層協議,使得網絡更加靈活和可擴展
- 不同的應用和服務可以使用不同的協議,而這些協議可以在同一通信通道上共存,通過協議標識字段確保數據被正確地路由和處理