確實,從瀏覽器輸入一個地址之後,當你按下Enter鍵之後,一系列奇怪的魔法就在發生,這是一個老生長談的問題了,但能真的仔細知道全部卻是一個艱難的事情。
網路架構之五層架構
在開始之前,還是必須知道網路的架構基礎的。目前網路架構分為兩種,七層架構和五層架構,本人更喜歡五層架構(主要是容易記,?)。這個分層如圖:
左側對應的七層架構圖,中間的是五層架構圖,右側對應的是每個層上具有的協議。
我們使用的應用大多都是構建於應用層之上,必然,瀏覽器也不例外。
現在開始,位址列鍵入地址,按下Enter鍵,就從這裡開始吧(這裡我就以鍵入百度https://www.baidu.com作為事例)
先簡單的認為資料傳遞是從傳送方ip到接收方(百度)ip的一個行為,那雙方ip是如何產生的。
傳送方ip的產生 --- DHCP協議
關於本本機的ip從何而來,主要有兩種方式,1. 手動配置 2. 自動配置
而自動配置,簡單一些進行介紹,這個要從DHCP協議說起,先看以下兩張圖
**手動配置方式:**通過手動配置ip地址,子網掩碼。但是這種方式並不適用普通使用者,普通使用者不可能知道當前網路的網路號,主機號,以及子網掩碼應該是多少。而且這種配置方式非常的不靈活,在同一個子網下的ip被固定,其他人無法使用。另一點則是這臺裝置跟換了一個網路環境,就沒有辦法上網了。
**動態配置:**動態配置依託於DHCP協議,在每個子網下,會有一臺DHCP伺服器,存放著改子網的所有可配置ip,當我們開啟電腦後,電腦會自動發發出一個請求ip的地址的廣播到DHCP伺服器,伺服器會檢查是否還存有可分配的ip,如有則響應給請求的電腦,並標記該ip已經被使用。(至於這些ip以後如何被釋放,重新稱為可分配的ip則是另一個話題)。
來看一下請求的ip的報文,通過5層網路框架的結構後是如何的?
接收方(百度)ip的產生 --- DNS解析
在瀏覽器位址列中輸入的是一個網址(百度),這個網址易於人的記憶,但是對於電腦而已就是頭痛的事情。所有這個時候就需要DNS了,將它解析成一個電腦能夠理解的ip地址。
它是如何工作的:
每個子網下都會有一臺DNS伺服器,在這臺伺服器中存放著域名和ip地址的對映表,從這裡可以獲取到百度的ip地址。這裡只是說了這個DNS資源伺服器的存在。那我是通過何種途徑獲取到DNS伺服器中的ip地址呢?
這裡就要說到乙太網的資訊傳遞方式——廣播,首先在網際網路傳送任何一個訊息,都會經過網路五層架構的封裝,形成一條可以被廣播的資訊。如下圖這種方式:
DNS解析的請求報文最終被封裝如下:其中的Http報文部分,則包括了傳送端的網址域名等資訊。DNS伺服器會獲取到域名,到伺服器中的域名ip對映表比較,如果有則響應報文,回到傳送方,傳送傳送方也就知道了目標地址的ip資訊。如果沒有則會對訊息轉發到公共DNS伺服器,比如google的DNS伺服器,獲取之後也會在本子網的DNS服務進行快取,以便以下次請求。這便是DNS解析的過程
到這裡你已經這道了雙方通訊的基礎ip的產生了,那開始下一步的研究吧
是否在同一個子網下
在知道傳送方和接收方的ip之後,第一件是則是判斷雙方是否在一個子網路下,如果在同一個子網下則不需要跨過閘道器,直接在子網內進行資料傳輸。
如何判斷是否在一個子網下,其實很簡單,只需要用你的子網掩碼和雙方的ip按位與,得到的結果如果是一樣的,則在同一個網路內,不一樣則不再同一個網路中。這裡的區別是,不在同一個子網下,傳送的報文資料包中的乙太網首部中的MAC地址是接收方網路卡的MAC地址,不是接收方主機的地址。
路由表
判斷出傳送方和接收方不再同一個子網下,就必然需要來到穿越茫茫負責的網路,來到對方的身邊,那是根據什麼才能到接收方的身邊?—— 路由器
上圖是一張基本的網路架構圖,每個雲代表這一個子網,箭頭代表著資料的流向。從中可以看出資料是由路由進行轉發的。其實每個路由中會維護一個路由表,會存放著這子網的ip,以及通過一些列複雜的路由探測,找到一條通往接收方網路的路徑,從而傳送給目標子網。
子網下獲取接收方的MAC地址 —— ARP協議
經過路由等操作,報文資訊已經來到了接收方的子網中了,那如何知道具體那一臺主機呢。其實通過ip地址的主機號已經可以確定是那一臺主機了,那此時是否就可以進行通訊了呢?—— 不能
以前我同樣有這樣的疑問,都找到你了,為什麼不能通訊呢。用一個比方,千里迢迢到美國找到一個叫做“川普”的總統,他是唯一的,根據他的ip(美國(相當於網路號)-川普(相當於主機號))。雖然找到了他,但是語言通,無法溝通?。此時就需要一個雙方都能夠接受的東西進行交流,這個就是MAC地址的作用。
根據ip地址找到MAC地址的協議,稱為ARP協議(地址解析協議)
在每個子網下,會有一臺伺服器儲存這子網下所有ip和MAC地址的對映。這個時候需要獲取MAC地址,就會向子網內傳送一個廣播,獲取ip對應主機MAC地址,基本結構如下
此時,跨過千山萬水,傳送方已經到接收方面前,能竊竊私語了。
資料響應
資料進行互動邏輯處理後,則會將資料返回給接收方,這個過程稱為響應。我們來看下瀏覽器的inpect下response header中的資訊。其中每個欄位都代表了某種資訊。
如: Expires:表示快取的過期時間 Remote Address: 則是DNS解析後的遠端地址
當拿到了響應的資訊後,剩下的事情則是瀏覽器要做的。載入資源,解析html,構建抽象語法樹,渲染頁面,以及解析JS等。
總結
本文旨在熟悉訊息在網路中的傳輸過程中會經歷什麼樣的過程。對其中每一種協議並沒有進行深入的研究,如果展開,每一種協議都值得用一篇文章來介紹。當然也可以根據提到的再去深入挖掘,必然讓你更加熟悉網路的每一個環節。
相信,事物的發展都是有其規律的。知道為什麼會更駕輕就熟。