從瀏覽器輸入一個網(wǎng)址開始討論網(wǎng)絡(luò)傳輸?shù)墓ぷ髟?/h2>

確實(shí),從瀏覽器輸入一個地址之后,當(dāng)你按下Enter鍵之后,一系列奇怪的魔法就在發(fā)生,這是一個老生長談的問題了,但能真的仔細(xì)知道全部卻是一個艱難的事情。

網(wǎng)絡(luò)架構(gòu)之五層架構(gòu)

在開始之前,還是必須知道網(wǎng)絡(luò)的架構(gòu)基礎(chǔ)的。目前網(wǎng)絡(luò)架構(gòu)分為兩種,七層架構(gòu)和五層架構(gòu),本人更喜歡五層架構(gòu)(主要是容易記,??)。這個分層如圖:

左側(cè)對應(yīng)的七層架構(gòu)圖,中間的是五層架構(gòu)圖,右側(cè)對應(yīng)的是每個層上具有的協(xié)議。

705728-20160424234827195-1493107425.png

我們使用的應(yīng)用大多都是構(gòu)建于應(yīng)用層之上,必然,瀏覽器也不例外。

現(xiàn)在開始,地址欄鍵入地址,按下Enter鍵,就從這里開始吧(這里我就以鍵入百度https://www.baidu.com作為事例)

先簡單的認(rèn)為數(shù)據(jù)傳遞是從發(fā)送方ip到接收方(百度)ip的一個行為,那雙方ip是如何產(chǎn)生的。

發(fā)送方ip的產(chǎn)生 --- DHCP協(xié)議

關(guān)于本本機(jī)的ip從何而來,主要有兩種方式,1. 手動配置 2. 自動配置

而自動配置,簡單一些進(jìn)行介紹,這個要從DHCP協(xié)議說起,先看以下兩張圖

image.png

手動配置方式:通過手動配置ip地址,子網(wǎng)掩碼。但是這種方式并不適用普通用戶,普通用戶不可能知道當(dāng)前網(wǎng)絡(luò)的網(wǎng)絡(luò)號,主機(jī)號,以及子網(wǎng)掩碼應(yīng)該是多少。而且這種配置方式非常的不靈活,在同一個子網(wǎng)下的ip被固定,其他人無法使用。另一點(diǎn)則是這臺設(shè)備跟換了一個網(wǎng)絡(luò)環(huán)境,就沒有辦法上網(wǎng)了。

image.png

動態(tài)配置:動態(tài)配置依托于DHCP協(xié)議,在每個子網(wǎng)下,會有一臺DHCP服務(wù)器,存放著改子網(wǎng)的所有可配置ip,當(dāng)我們打開電腦后,電腦會自動發(fā)發(fā)出一個請求ip的地址的廣播到DHCP服務(wù)器,服務(wù)器會檢查是否還存有可分配的ip,如有則響應(yīng)給請求的電腦,并標(biāo)記該ip已經(jīng)被使用。(至于這些ip以后如何被釋放,重新稱為可分配的ip則是另一個話題)。

來看一下請求的ip的報文,通過5層網(wǎng)絡(luò)框架的結(jié)構(gòu)后是如何的?

image.png

接收方(百度)ip的產(chǎn)生 --- DNS解析

在瀏覽器地址欄中輸入的是一個網(wǎng)址(百度),這個網(wǎng)址易于人的記憶,但是對于電腦而已就是頭痛的事情。所有這個時候就需要DNS了,將它解析成一個電腦能夠理解的ip地址。

它是如何工作的:

每個子網(wǎng)下都會有一臺DNS服務(wù)器,在這臺服務(wù)器中存放著域名和ip地址的映射表,從這里可以獲取到百度的ip地址。這里只是說了這個DNS資源服務(wù)器的存在。那我是通過何種途徑獲取到DNS服務(wù)器中的ip地址呢?

這里就要說到以太網(wǎng)的信息傳遞方式——廣播,首先在互聯(lián)網(wǎng)發(fā)送任何一個消息,都會經(jīng)過網(wǎng)絡(luò)五層架構(gòu)的封裝,形成一條可以被廣播的信息。如下圖這種方式:

protocol.png

DNS解析的請求報文最終被封裝如下:其中的Http報文部分,則包括了發(fā)送端的網(wǎng)址域名等信息。DNS服務(wù)器會獲取到域名,到服務(wù)器中的域名ip映射表比較,如果有則響應(yīng)報文,回到發(fā)送方,發(fā)送發(fā)送方也就知道了目標(biāo)地址的ip信息。如果沒有則會對消息轉(zhuǎn)發(fā)到公共DNS服務(wù)器,比如google的DNS服務(wù)器,獲取之后也會在本子網(wǎng)的DNS服務(wù)進(jìn)行緩存,以便以下次請求。這便是DNS解析的過程

image.png

到這里你已經(jīng)這道了雙方通信的基礎(chǔ)ip的產(chǎn)生了,那開始下一步的研究吧

是否在同一個子網(wǎng)下

在知道發(fā)送方和接收方的ip之后,第一件是則是判斷雙方是否在一個子網(wǎng)絡(luò)下,如果在同一個子網(wǎng)下則不需要跨過網(wǎng)關(guān),直接在子網(wǎng)內(nèi)進(jìn)行數(shù)據(jù)傳輸。

如何判斷是否在一個子網(wǎng)下,其實(shí)很簡單,只需要用你的子網(wǎng)掩碼和雙方的ip按位與,得到的結(jié)果如果是一樣的,則在同一個網(wǎng)絡(luò)內(nèi),不一樣則不再同一個網(wǎng)絡(luò)中。這里的區(qū)別是,不在同一個子網(wǎng)下,發(fā)送的報文數(shù)據(jù)包中的以太網(wǎng)首部中的MAC地址是接收方網(wǎng)卡的MAC地址,不是接收方主機(jī)的地址。

路由表

判斷出發(fā)送方和接收方不再同一個子網(wǎng)下,就必然需要來到穿越茫茫負(fù)責(zé)的網(wǎng)絡(luò),來到對方的身邊,那是根據(jù)什么才能到接收方的身邊?—— 路由器

image.png

上圖是一張基本的網(wǎng)絡(luò)架構(gòu)圖,每個云代表這一個子網(wǎng),箭頭代表著數(shù)據(jù)的流向。從中可以看出數(shù)據(jù)是由路由進(jìn)行轉(zhuǎn)發(fā)的。其實(shí)每個路由中會維護(hù)一個路由表,會存放著這子網(wǎng)的ip,以及通過一些列復(fù)雜的路由探測,找到一條通往接收方網(wǎng)絡(luò)的路徑,從而發(fā)送給目標(biāo)子網(wǎng)。

子網(wǎng)下獲取接收方的MAC地址 —— ARP協(xié)議

經(jīng)過路由等操作,報文信息已經(jīng)來到了接收方的子網(wǎng)中了,那如何知道具體那一臺主機(jī)呢。其實(shí)通過ip地址的主機(jī)號已經(jīng)可以確定是那一臺主機(jī)了,那此時是否就可以進(jìn)行通信了呢?—— 不能

以前我同樣有這樣的疑問,都找到你了,為什么不能通信呢。用一個比方,千里迢迢到美國找到一個叫做“特朗普”的總統(tǒng),他是唯一的,根據(jù)他的ip(美國(相當(dāng)于網(wǎng)絡(luò)號)-特朗普(相當(dāng)于主機(jī)號))。雖然找到了他,但是語言通,無法溝通??。此時就需要一個雙方都能夠接受的東西進(jìn)行交流,這個就是MAC地址的作用。

根據(jù)ip地址找到MAC地址的協(xié)議,稱為ARP協(xié)議(地址解析協(xié)議)

在每個子網(wǎng)下,會有一臺服務(wù)器保存這子網(wǎng)下所有ip和MAC地址的映射。這個時候需要獲取MAC地址,就會向子網(wǎng)內(nèi)發(fā)送一個廣播,獲取ip對應(yīng)主機(jī)MAC地址,基本結(jié)構(gòu)如下

image.png

此時,跨過千山萬水,發(fā)送方已經(jīng)到接收方面前,能竊竊私語了。

數(shù)據(jù)響應(yīng)

數(shù)據(jù)進(jìn)行交互邏輯處理后,則會將數(shù)據(jù)返回給接收方,這個過程稱為響應(yīng)。我們來看下瀏覽器的inpect下response header中的信息。其中每個字段都代表了某種信息。

如:
Expires:表示緩存的過期時間
Remote Address: 則是DNS解析后的遠(yuǎn)程地址

image.png

image.png

當(dāng)拿到了響應(yīng)的信息后,剩下的事情則是瀏覽器要做的。加載資源,解析html,構(gòu)建抽象語法樹,渲染頁面,以及解析JS等。

總結(jié)

本文旨在熟悉消息在網(wǎng)絡(luò)中的傳輸過程中會經(jīng)歷什么樣的過程。對其中每一種協(xié)議并沒有進(jìn)行深入的研究,如果展開,每一種協(xié)議都值得用一篇文章來介紹。當(dāng)然也可以根據(jù)提到的再去深入挖掘,必然讓你更加熟悉網(wǎng)絡(luò)的每一個環(huán)節(jié)。

相信,事物的發(fā)展都是有其規(guī)律的。知道為什么會更駕輕就熟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容