大家好呀
我是浪前
今天講解的是網絡篇的第二章:UDP協議的封裝分用
我們的協議最開始是OSI七層網絡協議
這個OSI 七層網絡協議 是計算機的大佬寫的,但是這個協議一共有七層,太多了太麻煩了,于是我們就把這個七層網絡協議就簡化為五層了
UDP協議的封裝分用全過程
- TCP/IP 五層網絡協議
- 網絡設備所在分層
- 封裝和分用
- 封裝的全過程:
- 發送方:
- 1: 發送方A的應用層(應用程序) QQ:
- 2: 發送方A的傳輸層:
- 3: 發送方A的網絡層:
- 4: 發送方A的數據鏈路層:
- 5: 發送方A的物理層:硬件設備:
- 分用的全過程:
- 1: 接收方B的物理層:
- 2: 接收方B的數據鏈路層:
- 3: 接收方B的網絡層(IP協議)
- 4:接收方B的 傳輸層(UDP協議)
- 5:接收方B的 應用層 QQ應用程序:
- 交換機A的工作:
TCP/IP 五層網絡協議
舉一個例子:
我在淘寶店鋪買了一個刷子:
商家發貨就要去關注我的收件人地址和電話,發件人地址和電話(這個就是傳輸層要去關注包裹傳輸的起點和終點)
商家要把這個包裹交給快遞公司:
這個TCP/IP協議一共有五層:
應用層:傳輸的數據在應用程序中如何使用
程序在拿到數據之后,要用數據去干什么,解決什么問題(程序員最關注的一層)**
負責我買到這個刷子是用來干什么的?
刷床?刷沙發?打小孩?
傳輸層:關注的是通信的起點和終點
負責關注網絡數據包的起點和終點(從哪里來到哪里去),是端到端的傳輸
負責關注通信的起點和終點,關注網路數據包的起點和終點是端到端的傳輸
網絡層:關注的是通信中的路徑規劃
負責關注起點到終點之間要走哪一條路(路徑規劃)
確定傳輸的路線: 上海 - 南京 - 無錫 - 西安
規劃出哪一條路徑最好?
考慮傳輸效率?傳輸成本?傳輸時間最短?傳輸過程最方便?
網絡層關注的是通信過程中的路徑規劃,
數據鏈路層:負責兩個相鄰的節點之間的傳輸和通信細節,即數據傳輸情況 :
上海到南京 是用飛機空運來運輸
南京到無錫市用鐵路運輸
無錫到西安使用大貨車進行運輸
物理層:網絡通信過程中的硬件設備,基礎設施
通信過程中的物理運輸 公路-鐵路-航線
為什么要寫四層:
因為不算物理層就是四層,為什么?
因為物理層是純硬件的
說是五層,但是下面這四層都是在操作系統內核,硬件,驅動程序中已經實現好了(計算機內置了)
我們作為程序員在網絡編程過程中能夠影響到的也就只有應用層了
應用層對應到應用程序,也就是程序員寫的代碼軟件,需要手動實現
傳輸層和網絡層都是操作系統內核,都是在操作系統的內核中實現的,這兩層都是現成的,不需要手動實現
數據鏈路層和物理層是驅動程序+硬件來實現的
硬件廠商提供了硬件,都會配上一個驅動程序
有了這個驅動程序,系統才可以很好地操作這個硬件
網絡設備所在分層
對于一臺主機,
它的操作系統內核實現了從傳輸層到物理層的內容,也即是TCP/IP五層模型的下四 層;
對于一臺路由器,它實現了從網絡層到物理層,也即是TCP/IP五層模型的下三層;路由器工作在網絡層
對于一臺交換機,它實現了從數據鏈路層到物理層,也即是TCP/IP五層模型的下兩層;交換機工作在數據鏈路層
對于集線器,它只實現了物理層
上面是一個經典的筆試題。
上述的路由器和交換機指的是經典的路由器和交換機
封裝和分用
封裝和分用描述了網絡通信過程中基本的數據傳輸流程
封裝和分用是網絡傳輸數據過程中,最核心的流程
封裝的全過程:
例子如下所示:
A 通過QQ給B發送了一個hello:
這個操作會出現什么流程?
發送方:
1: 發送方A的應用層(應用程序) QQ:
QQ從消息輸入框中獲取到用戶A輸入的hello,hello是一個字符串
QQ就要把這個字符串構成一個應用層的數據包
QQ這樣的程序內部就設置了一個應用層的協議,應用數據包就是按照這個應用層協議約定的格式來構造的
這個格式就是一個字符串的拼接
這個應用層協議往往都是實現這個程序的人自己定義的,其他人都沒有權限修改
但是我們是可以自己約定的:
比如:
我們約定的應用層協議的格式如下:
發送方QQ號;接收方QQ號;發送時間;消息正文
12344;34556;2024-1-1 12:00:00;hello
上述就構成了一個簡單的應用層數據包
應用程序就會調用系統提供的API把這個應用層數據包交給傳輸層
2: 發送方A的傳輸層:
會把上述的應用層數據包作為一個整體再構造成為一個傳輸層的數據包
這個傳輸層涉及到的協議最重要的就是這個TCP和UDP協議:
此處我們假定是使用UDP協議來進行通信,此時就會構造一個UDP的數據包
這個UDP數據包一共包含兩個部分:
- 報頭(header)
- 載荷(payload)
載荷里面的東西就是應用層數據包
如下圖所示:
形如上述,添加報頭的過程就是==封裝==
其實就是拼接字符串
只不過拼接的是報頭,具有一定的結構
例子:
商家發貨一件衣服,不能夠直接發,一般都是要先進行包裝,使用塑料袋子進行包裝
包裝的作用是什么?
給快遞套上包裝,既能夠起到保護作用,又能夠用來貼標簽
標簽上就可以寫一些用來發送快遞的關鍵信息
上述的封裝的過程就是這個衣服被包裝的過程
封裝的作用是什么?
我們這里的UDP報頭雖然不能夠起到保護的作用,但是可以起到“貼標簽”類似的效果
就能夠承載一些關鍵的用來轉發數據的信息
**對于UDP報頭來說,UDP報頭是一個二進制數據,承載的最重要的信息就是源端口和目的端口,這兩個端口就是被記載在UDP報頭中
當我們拼接好一個傳輸層的數據包之后呢,就要把這個數據包進一步交給下層,網絡層繼續進行封裝了
交給下層指的是下層協議提供一組API(函數),上層調用這個API(函數),并且把剛才構造好的數據 通過參數傳過去,下層協議就可以來處理這個數據了)
源端口和目的端口是在傳輸層
源IP和目的IP是在網絡層
傳輸層的數據打包好了之后,數據會繼續被交給網絡層:
3: 發送方A的網絡層:
網絡層涉及到的最核心的協議就是IP協議:
在網絡層包含很多的屬性,最重要的屬性就是源IP和目的IP
網絡層的IP協議把剛才傳輸層的UDP數據包作為一個整體,把這個整體作為IP協議的載荷,然后拼上IP協議的報頭,構造成為一個數據包:
內容如下:
- IP協議的報頭
- IP協議的載荷
如圖所示:
在這個IP協議報頭中:
也會包含一些輔助轉發的關鍵信息,此處最關鍵的信息就是源IP和目的IP
此時構造完成一個完整的IP數據包之后,IP協議繼續調用數據鏈路層的API,把數據再交給數據鏈路層這里的協議進行處理
網絡層數據打包好了之后,會繼續把數據交給數據鏈路層來進一步打包
4: 發送方A的數據鏈路層:
數據鏈路層涉及到的核心協議叫做以太網:
此處,我們使用“以太”來作為網絡傳輸的介質
以太網就是日常見到的有線網絡
我們日常使用的網線也是“以太網線”,日常使用的網口也是“以太網口”
日常使用的交換機也是“以太交換機”
**以太網數據幀:
以IP數據包作為一個整體,在這個IP數據包的前面加上一個以太網幀頭,后面加上一個幀尾
中間是載荷
如下圖所示:
以太網幀頭中最重要的信息是源mac地址,目的mac地址
這樣的數據封裝好了之后還要繼續向下走,交給物理層
5: 發送方A的物理層:硬件設備:
**把上述的這樣的以太網數據幀這樣的二進制結構(一串 0 1 0 1) 這樣的數據:
將這樣的數據轉化為光信號(光纖)/電信號(網線)/電磁波(無限wifi)
然后進行發送
此時經過上面的一系列操作,從上層協議到下層協議,層層給數據包添加報頭,終于是把這個hello這個數據給發送出去了,(剛出家門)
以上就是封裝的過程
數據發送出去之后,就會經過一些列的交換機和路由器進行轉發,A和B一般來說不是直接網線連接的,中間還要經過很多的交換機/路由器設備進行轉發
這個中間過程我們先不談,接下來先說明清楚
當數據到達接收方B之后,接收方B要對數據進行一個“分用”的過程
分用的全過程:
**下面是接收方B發生的事情:
我們先來假定這個數據包已經到達B的網卡了,看這個B會如何處理這個數據包
接收方B的這個處理數據包的過程就是 "分用"的過程
1: 接收方B的物理層:
物理層收到的數據 是光信號/電信號/電磁波,物理層就會把這些物理信號轉換為數字信號(二進制的 0 1 0 1 )
在轉換之后會得到一個以太網的數據幀,進一步會把這個數據幀交給數據鏈路層處理
2: 接收方B的數據鏈路層:
通過以太網協議,針對以太網數據進行解析,會解析出以太網幀頭和以太網幀尾,以及中間的載荷
以太網:發送方和接收方得使用一樣的協議才行
我們這里進行解析: 把以太網幀頭去掉,以太網幀尾去掉
如圖所示:
按照以太網數據幀的格式來解析,取出其中的載荷,之后再交給上層協議:
3: 接收方B的網絡層(IP協議)
網絡層是按照IP協議的格式來解析,取出其中的載荷,再交給上層協議
此時去掉IP報頭之后:
4:接收方B的 傳輸層(UDP協議)
按照UDP協議格式來解析,取出其中的載荷,再交給上層協議:
此時就去掉UDP報頭,取出剩下的載荷,交給上層協議:
5:接收方B的 應用層 QQ應用程序:
此時應用層拿到數據之后,在根據端口號來判斷把數據交給哪個應用程序
QQ這個程序就要解析這個數據,這個解析過程也是按照前面程序員自定義的應用層協議展開的
此時按照QQ應用程序內部的應用層協議格式來解析數據~
如何解析的?
就是把上圖中的數據按照分號進行切割,就得到了這里的QQ號信息,發送時間,發送消息的正文
此時QQ程序拿到這些數據之后,就會彈出一些提示,并且把消息/消息的發送者/發送時間 都顯示到聊天窗口上
以上就是分用的過程
分用的過程就是封裝的逆向過程
數據報并不是發送方一發送出去就立馬到了接收方那里,而是在網絡中間還會經歷一個轉發的過程
通過路由器/交換機來進行轉發,
在真實情況下,并不是一出門就直接到了,而是兩個主機一般都不是直接通過網線直連的,而是通過一系列的交換機或者路由器來進行數據轉發的
但是實際上即使是經過交換機或者路由器,上述的封裝分用過程,也還是同樣適用的
只不過,封裝分用的程度不一定是到應用層(不一定是五層都有,可能是只涉及到了幾層)
比如:
對于經典交換機來說,就只需要封裝分用到數據鏈路層即可
對于經典的路由器來說,就只是需要封裝分用到網絡層即可
如果數據報在中間的轉發過程中,轉發到了路由器上,那么也要經歷一個封裝分用的過程,只不過是封裝分用到網絡層:
當路由器拿到數據之后,路由器會將數據解析到網絡層,拿到IP地址之后,決定下一步如何傳輸,
下一步傳輸的時候,又會重新經過網絡層,數據鏈路層,和物理層的封裝才能從路由器中傳輸出去
*如果數據報被轉發到了交換機上,那么就會在交換機上進行一個封裝分用到數據鏈路層的過程,
所以封裝分用這個過程在網絡通信中是貫穿始終的,數據經歷的每一個節點都要進行封裝分用的過程
交換機A的工作:
下述是A的光電信號;
交換機A的物理層就會把從A發出的光電信號轉換成以太網數據幀二進制數據交給數據鏈路層:
而在交換機上面也是實現了數據鏈路層的:
此時交換機A的數據鏈路層就會對上述的數據進行解析:
這個解析過程,一方面要去除載荷部分,另一方面要解析到幀頭的關鍵信息
- 去除載荷
- 解析幀頭
根據幀頭中的信息,決定下一步把數據往哪里進行發送,根據這個情況再進一步地構造出新的以太網數據幀~
新的數據幀如下圖所示:
把這個新的數據繼續通過物理層發送出去
這里的以太網幀頭,對于交換機來說,已經夠用了,就不需要再進行解析了
剛剛是交換機,現在是路由器:路由器的情況更加復雜一些
要封裝分用到網絡層
當路由器拿到A的光電信號之后:
A的光電信號如下:
先是物理層拿到光電信號,轉成二進制數據交給數據鏈路層:
數據鏈路層對上述的數據進行解析,去掉以太網幀頭,拿出載荷,交給IP協議
如下圖所示:
IP協議又會進一步對這個數據進行解析,解析IP報頭,再一次取出載荷,
路由器為什么要解析IP報頭?
因為路由器需要通過IP報頭中的目的IP來知道具體接下來如何轉發
取出的數據 會被IP協議重新進行封裝操作:
即剛剛取出的數據會被重新加上(封裝上)IP報頭
如下圖所示:
數據被重新封裝上IP報頭之后,會被交給數據鏈路層,繼續加上幀頭和幀尾
如下圖所示:
此時我們又構成了一個數據鏈路幀,此時這個數據再交給物理層,去轉成光電信號,繼續傳輸
此時我們的路由器只是封裝分用到網絡層,說明路由器并不在乎UDP數據和應用層數據
對于一臺主機,
它的操作系統內核實現了從傳輸層到物理層的內容,也即是TCP/IP五層模型的下四層;
對于一臺路由器,它實現了從網絡層到物理層,也即是TCP/IP五層模型的下三層;
路由器是工作在網絡層的
對于一臺交換機,它實現了從數據鏈路層到物理層,也即是TCP/IP五層模型的下兩層:
交換機是工作在數據鏈路層的
對于集線器,它只實現了物理層
上述的路由器和交換機指的是經典的路由器和交換機
事實上的路由器和交換機的功能更加復雜強大
很多的交換機也具有一些路由器的功能,也可以工作在網絡層
很多的路由器也具有一些交換機的功能,也可以工作在數據鏈路層
甚至有些交換機路由器還可以工作在應用層
如果交換機要截取/解析你所傳輸的數據,那么就會封裝分用到應用層,把hello拎出來看看
在上述圖片中的每一個節點都會涉及到封裝分用的過程
所以網絡傳輸數據不是一個簡單的事情,背后有大量的工作 ,只不過這些工作都是硬件&驅動
&操作系統 幫我們完成了
注意:
我們在描述一個網絡上傳輸的數據“單位”可能會用到幾個術語:
包(packet): 網絡數據包
使用場景: IP數據包
段(segment):網絡數據段
使用場景: TCP數據段
報(datagram) : 網絡數據段
使用場景: UDP數據段
幀(frame) : 網絡數據幀
使用場景: 以太網數據幀
上述的幾個術語都是網絡傳輸的基本單位。
我們今天就學習到這里,下次見~