1 為什么需要分層?
你問我為啥需要分層?那必然是有好處的?。?/p>
我們來(lái)回顧一下面向接口編程有什么特點(diǎn)~
- 對(duì)于使用方來(lái)說,不必關(guān)心提供方是如何實(shí)現(xiàn)的, 只需要使用接口即可;
- 對(duì)于提供方來(lái)說,只需要利用封裝的特性,隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié),對(duì)外開發(fā)接口。
而對(duì)于協(xié)議的分層也是類似,后續(xù)比較容易針對(duì)某一層協(xié)議進(jìn)行替換~
- 分層之后,層次之間耦合度降低,上層不必了解下層的細(xì)節(jié),同理,下層也不需要了解上層的細(xì)節(jié)~
- 方便對(duì)某一層的協(xié)議進(jìn)行替換~
- 分層之后,就可以讓程序員在同一時(shí)刻只關(guān)注某一層上的子問題~
2 TCP/IP 五層網(wǎng)絡(luò)模型
TCP/IP 通訊協(xié)議采用了 5 層的層級(jí)結(jié)構(gòu),每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來(lái)完成自己的需求。
- 應(yīng)用層 : 負(fù)責(zé)應(yīng)用程序間的溝通,關(guān)注傳輸過來(lái)的數(shù)據(jù)要干啥用! 我們所聊的網(wǎng)絡(luò)編程主要就是應(yīng)用層。 對(duì)不同種類的應(yīng)用程序它們會(huì)根據(jù)自己的需要來(lái)使用應(yīng)用層的不同協(xié)議,郵件傳輸應(yīng)用使用了SMTP協(xié)議、萬(wàn)維網(wǎng)應(yīng)用使用了HTTP協(xié)議、遠(yuǎn)程登錄服務(wù)應(yīng)用使用了有TELNET協(xié)議。
- 傳輸層 :不考慮中間路徑,只考慮起點(diǎn)和終點(diǎn)~ 負(fù)責(zé)兩臺(tái)主機(jī)之間的數(shù)據(jù)傳輸。如傳輸控制協(xié)議 (TCP),能夠確保數(shù)據(jù)可靠的從源主機(jī)發(fā)送到目標(biāo)主機(jī)。
- 網(wǎng)絡(luò)層 : 主要負(fù)責(zé)兩個(gè)遙遠(yuǎn)的節(jié)點(diǎn)之間的路徑規(guī)劃~(地址管理和路由選擇) 兩個(gè)節(jié)點(diǎn)之間可能有多種路徑可以到達(dá),其作用就是選擇一條最適合的。例如在IP協(xié)議中,通過IP地址來(lái)標(biāo)識(shí)一臺(tái)主機(jī),并通過路由表的方式規(guī)劃出兩臺(tái)主機(jī)之間的數(shù)據(jù)傳輸?shù)木€路(路由)。路由器(Router)工作在網(wǎng)路層。
- 數(shù)據(jù)鏈路層 :主要關(guān)注兩個(gè)相鄰節(jié)點(diǎn)的傳輸~ 負(fù)責(zé)設(shè)備之間的數(shù)據(jù)幀的傳送和識(shí)別。網(wǎng)絡(luò)上相鄰的節(jié)點(diǎn),就是通過網(wǎng)線/光纖/無(wú)線直接連接的設(shè)備。
- 物理層 :網(wǎng)絡(luò)通信中的基礎(chǔ)設(shè)施,網(wǎng)線、光纖、網(wǎng)絡(luò)接口等。
那么在協(xié)議分層的背景下,數(shù)據(jù)是如何通過網(wǎng)絡(luò)傳輸?shù)哪兀?/font>
- 對(duì)于發(fā)送方: 把數(shù)據(jù)從上層到下層,依次交給對(duì)應(yīng)層次的協(xié)議,進(jìn)行封裝~
- 對(duì)于接收方: 把數(shù)據(jù)從下層到上層,依次交給對(duì)應(yīng)層次的協(xié)議,進(jìn)行解析~
即就是所謂的 封裝與分用~ 聽起來(lái)很高大上?別急,下面我們具體來(lái)盤一盤!
3 數(shù)據(jù)的封裝(發(fā)送消息為例)
假如 小黃使用微信發(fā)送一條消息給七七:“今天你寫代碼了嗎?”,在網(wǎng)絡(luò)模型各層會(huì)發(fā)生什么呢?提煉信息如下:
- 發(fā)送方:小黃,接收方:七七
- 消息內(nèi)容:今天你寫代碼了嗎?
注意:以下內(nèi)容以理解為主,數(shù)據(jù)內(nèi)容并不完全準(zhǔn)確,比如數(shù)據(jù)包的結(jié)構(gòu),實(shí)際更復(fù)雜,這里作了簡(jiǎn)化處理~
首先來(lái)到 應(yīng)用層~
微信 App 拿到上述提煉的數(shù)據(jù),封裝成如下的應(yīng)用層數(shù)據(jù)包:
補(bǔ)充: 數(shù)據(jù)包的封裝本質(zhì)上是字符串拼接,為了區(qū)分不同的字段可能還會(huì)引入分隔符、長(zhǎng)度信息等。即實(shí)際的數(shù)據(jù)包可能更復(fù)雜,例如以分號(hào)作為分隔符,上述數(shù)據(jù)包可能為:
5477;7745;2023-04-25;今天你寫代碼了嗎?
應(yīng)用層 -> 傳輸層
拿到上述數(shù)據(jù),應(yīng)用層要調(diào)用傳輸層提供的 api 來(lái)處理這些數(shù)據(jù)!傳輸層的協(xié)議中最典型的是 TCP 與 UDP,這里以 UDP 為例,針對(duì)上述數(shù)據(jù)包進(jìn)行封裝~
補(bǔ)充: 一個(gè)典型的數(shù)據(jù)報(bào)就是由
數(shù)據(jù)報(bào)頭 + 數(shù)據(jù)載荷
組成的~ 可以將數(shù)據(jù)載荷理解為包裝好的快遞~ 該快遞是要有寄件人和收件人相應(yīng)的信息的。而 數(shù)據(jù)報(bào)頭,就相當(dāng)于 快遞信息,加上數(shù)據(jù)報(bào)頭,就相當(dāng)于在快遞箱子上進(jìn)行了一個(gè) “貼標(biāo)簽” 的操作~
傳輸層 -> 網(wǎng)絡(luò)層
將上述傳輸層已經(jīng)有的 UDP 數(shù)據(jù)報(bào)交給網(wǎng)絡(luò)層的協(xié)議,最典型的就是 IP 協(xié)議~ 即拿到上述數(shù)據(jù)報(bào)后,需要進(jìn)行進(jìn)一步的封裝:加上 IP 協(xié)議報(bào)頭~
補(bǔ)充: IP 是找到主機(jī),而端口號(hào)是確定主機(jī)上的 進(jìn)程/程序 ~
網(wǎng)絡(luò)層 -> 數(shù)據(jù)鏈路層
同樣對(duì)上述數(shù)據(jù)報(bào),再次進(jìn)行封裝,最典型的協(xié)議就是 以太網(wǎng) ~
補(bǔ)充: 以太網(wǎng)是最常見的數(shù)據(jù)鏈路層的網(wǎng)絡(luò),比如我們平時(shí)使用的網(wǎng)線上網(wǎng),就是在用以太網(wǎng)~
物理層
物理層拿到上述的以太網(wǎng)數(shù)據(jù)幀,則會(huì)將這樣的 0101 二進(jìn)制數(shù)據(jù)
轉(zhuǎn)化成 光信號(hào)/電信號(hào)/電磁波信號(hào) 進(jìn)行傳輸~
需要注意的是,以上的過程,操作系統(tǒng)已經(jīng)幫我們封裝好了~ 這就是所謂的 TCP/IP 五層網(wǎng)絡(luò)模型的封裝~
4 數(shù)據(jù)的分用(接收消息為例)
數(shù)據(jù)的發(fā)送過程我們了解了,那么又該如何接收呢?
其實(shí)很簡(jiǎn)單,如果說發(fā)送是封裝的過程,那么接收就與之相反,則是分用的過程~
- 發(fā)送方,從上層到下層,依次封裝,新增報(bào)頭~
- 接收方,從下層到上層,依次分用,去掉報(bào)頭~
在此為了方便理解,我們 不考慮發(fā)送方和接收方的中間節(jié)點(diǎn)的轉(zhuǎn)發(fā)過程~
首先,來(lái)到 物理層~
物理層,網(wǎng)卡,接收到高低電平信號(hào),會(huì)對(duì)信號(hào)進(jìn)行解析,還原成 0101的二進(jìn)制序列~
物理層 -> 數(shù)據(jù)鏈路層
上述拿到的 0101二進(jìn)制序列,可以當(dāng)作一個(gè) 以太網(wǎng)數(shù)據(jù)幀 就使用 以太網(wǎng)協(xié)議 進(jìn)行處理:去掉幀頭和幀尾,取出中間的數(shù)據(jù)載荷,上交給網(wǎng)絡(luò)層~
補(bǔ)充: 以太網(wǎng)數(shù)據(jù)幀頭有一個(gè)消息類型,根據(jù)該消息類型可以知道網(wǎng)絡(luò)層是 IP 協(xié)議~
數(shù)據(jù)鏈路層 -> 網(wǎng)絡(luò)層
接收到數(shù)據(jù)鏈路層的數(shù)據(jù)后由網(wǎng)絡(luò)層的 IP 協(xié)議進(jìn)行進(jìn)行解析數(shù)據(jù)報(bào)。最主要的就是去掉 IP 報(bào)頭,取出中間的載荷,上交給傳輸層~
補(bǔ)充: IP數(shù)據(jù)報(bào)報(bào)頭也會(huì)有一個(gè)字段標(biāo)識(shí)傳輸層使用的是何種傳輸協(xié)議~
網(wǎng)絡(luò)層 -> 傳輸層
由 UDP協(xié)議 進(jìn)行解析數(shù)據(jù)報(bào),取出數(shù)據(jù)載荷,上交給應(yīng)用層~
傳輸層 -> 應(yīng)用層
由對(duì)應(yīng)的應(yīng)用程序,解析拿到的應(yīng)用層數(shù)據(jù)報(bào)~ 這里以微信為例,則取出如下的字段,并在程序的界面中顯示出來(lái)~
以上便是 TCP/IP 五層網(wǎng)絡(luò)模型的分用 的流程了~
5 實(shí)際網(wǎng)絡(luò)環(huán)境上的封裝與分用
在真實(shí)的網(wǎng)絡(luò)環(huán)境中,并不會(huì)這么理想,中間是需要經(jīng)過許多中間節(jié)點(diǎn)進(jìn)行轉(zhuǎn)發(fā)的~ 概述圖如下:
幾點(diǎn)說明:
- IP 協(xié)議是一邊傳輸一邊規(guī)劃路徑~
- 重新封裝過程中,源 mac 地址 與 目的 mac 地址 也會(huì)發(fā)生變化~
- 通常,在該過程中,交換機(jī)“二層轉(zhuǎn)發(fā)”,路由器稱為“三層轉(zhuǎn)發(fā)”~
寫在最后
?以上便是本文的全部?jī)?nèi)容啦!創(chuàng)作不易,如果你有任何問題,歡迎私信,感謝您的支持!
?本文被 JavaEE編程之路 收錄點(diǎn)擊訂閱專欄 , 持續(xù)更新中。
?創(chuàng)作不易,如果你有任何問題,歡迎私信,感謝您的支持!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-436166.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-436166.html
到了這里,關(guān)于【JavaEE】從收發(fā)消息的角度理解 TCP/IP 五層網(wǎng)絡(luò)模型的封裝與分用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!