經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼

飛天小牛肉發表於2021-02-22

? 盡人事,聽天命。博主東南大學碩士在讀,熱愛健身和籃球,樂於分享技術相關的所見所得,關注公眾號 @ 飛天小牛肉,第一時間獲取文章更新,成長的路上我們一起進步

? 本文已收錄於 CS-Wiki(Gitee 官方推薦專案,現已 1.0k+ star),致力打造完善的後端知識體系,在技術的路上少走彎路,歡迎各位小夥伴前來交流學習

 

0. 前言

在瀏覽器的位址列輸入一個 URL 後回車,背後到底發生了什麼才能使得一個介面完美的展現在我們眼前?

今天講解的這道題目,由於其涉及大量網路協議,可以非常直觀的看出諸位小夥伴對計算機網路體系的整體把握程度,所以自然成為了各大公司的面試常客。

在瀏覽中輸入 URL 並且獲取響應的過程,其實就是瀏覽器和該 URL 對應的伺服器的網路通訊過程。比如我們輸入 www.baidu.com,那麼會返回一個百度搜尋的介面,這其實就是瀏覽器和百度伺服器之間的網路通訊過程。瀏覽器就是客戶端,用於發出請求,而百度的伺服器就是服務端,用於接收並響應請求。

下面我們就來詳細講解這個龐大的網路通訊過程。

1. 解析 URL

不知道有沒有同學會混淆域名和 URL 的概念,可以這樣理解,URL 就是我們輸入的網址,而網址裡面含有域名。舉個例子:www.baidu.com/veal98 是一個網址,而 www.baidu.com 就是伺服器的域名。

URL 各元素的組成如下(當然,下述請求檔案的路徑名可以省略):

經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼

這個 URL 請求的目標伺服器上的檔案路徑就是:

經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼

那麼首先,瀏覽器做的第一步就是解析 URL 得到裡面的引數,將域名和需要請求的資源分離開來,從而瞭解需要請求的是哪個伺服器,請求的是伺服器上什麼資源等等。

2. 瀏覽器封裝 HTTP 請求報文

URL 進行解析之後,瀏覽器確定了目標伺服器和檔名,接下來就需要根據這些訊息封裝成一個 HTTP 請求報文傳送出去。舉個 HTTP 請求報文的例子:

關於 HTTP 協議詳細可見 HTTP 協議的前世今生 這篇文章,這裡不再贅述

經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼

解釋一下封裝,這是一個貫穿整個計算機網路的概念。就是說傳送端在層與層之間傳輸資料時,每經過一層必定會被打上一個該層所屬的首部資訊。反之,接收端在層與層之間傳輸資料時,每經過一層就會把該層對應的首部資訊消去

經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼

3. DNS 域名解析獲取 IP 地址

封裝好 HTTP 請求報文後,在正式還有一項準備工作沒有做,那就是獲取目標伺服器的 IP 地址。

雖然解析得到了域名,理論瀏覽器已經知道目標伺服器是誰了。但是實際上,域名並不是目標伺服器真正意義上的地址,網際網路上每一臺計算機都被全世界唯一 IP 地址標識著,但是 IP 地址並不方便記憶,所以才設計出了域名。

那麼就需要解析域名獲取目標伺服器的 IP 地址。不然空有一個方便記憶的域名咋知道這個請求到底傳送到哪裡去呢。由域名轉換得到 IP 地址就是 DNS 協議做的事情,如下:

關於 DNS 詳細的內容各位可以回顧 超詳細 DNS 協議解析 這篇文章,比如什麼是域名,域名伺服器,遞迴查詢和迭代查詢等等,寫的已經足夠詳細,此處只列出 DNS 的解析過程。

1)首先搜尋瀏覽器的 DNS 快取,快取中維護著一張域名與 IP 地址的對應表;

2)若沒有命中,則繼續搜尋作業系統的 DNS 快取

3)若仍然沒有命中,則作業系統將域名傳送至本地域名伺服器,本地域名伺服器查詢自己的 DNS 快取,查詢成功則返回結果(注意:主機和本地域名伺服器之間的查詢方式是遞迴查詢);

4)若本地域名伺服器的 DNS 快取沒有命中,則本地域名伺服器向上級域名伺服器進行查詢,通過以下方式進行迭代查詢(注意:本地域名伺服器和其他域名伺服器之間的查詢方式是迭代查詢,防止根域名伺服器壓力過大):

  • 首先本地域名伺服器向根域名伺服器發起請求,根域名伺服器是最高層次的,它並不會直接指明這個域名對應的 IP 地址,而是返回頂級域名伺服器的地址,也就是說給本地域名伺服器指明一條道路,讓他去這裡尋找答案

  • 本地域名伺服器拿到這個頂級域名伺服器的地址後,就向其發起請求,獲取許可權域名伺服器的地址

  • 本地域名伺服器根據許可權域名伺服器的地址向其發起請求,最終得到該域名對應的 IP 地址

4)本地域名伺服器將得到的 IP 地址返回給作業系統,同時自己將 IP 地址快取起來

5)作業系統將 IP 地址返回給瀏覽器,同時自己也將 IP 地址快取起來

6)至此,瀏覽器就得到了域名對應的 IP 地址,並將 IP 地址快取起來

配合下圖直觀理解:

經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼

需要注意的是,DNS 使用的是 UDP 協議,也就是說上面各種請求的轉發,都是基於 UDP 這個無連線協議的。

4. 建立 TCP 連線

獲取到了目標伺服器的 IP 地址之後,瀏覽器就知道我等下請求要發給誰了,這個時候就可以開始傳送封裝好了的 HTTP 請求報文了,那麼既然需要傳送請求,必然就需要 TCP 通過三次握手為瀏覽器和伺服器之間建立可靠的連線,保證雙方都具有可靠的接收和傳送能力

這裡又是一道經典的面試題:TCP 三次握手和四次揮手,詳細可見 關於 TCP 三次握手和四次揮手,滿分回答在此 這篇文章。

三次握手過程如下圖:

經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼

5. 瀏覽器傳送請求

TCP 三次握手完成後,瀏覽器與目標伺服器之間就建立了一個可靠的虛擬通道,於是瀏覽器就可以傳送自己的 HTTP 請求了。

需要注意的是,HTTP 請求報文或者響應報文在 TCP 連線通道上進行傳輸的時候,由於這些報文比較大,為了更容易和準確可靠的傳輸,TCP 會將 HTTP 報文按序號分割成若干報文段並加上 TCP 首部,分別進行傳輸。接收方在收到這些報文段後,按照序號以原來的順序重組 HTTP 報文

6. 負責傳輸的 IP 協議

實際上,TCP 在三次握手建立連線、四次握手斷開連線、以及連線建立過程中的收發資料(TCP 報文段)等各階段操作時,都是通過 IP 協議進行傳輸的,IP 協議將這些階段的資料新增 IP 首部封裝成 IP 資料包再進行傳輸。

IP 資料包的首部存有源 IP 地址目標 IP 地址。所謂源 IP 地址 就是傳送方的 IP 地址;目標 IP 地址就是通過 DNS 域名解析得到的目標伺服器的 IP 地址。

事實上,IP 協議身處的網路層規定的是:資料包要通過怎樣的路徑(傳輸路線)才能到達對方計算機,並傳送給對方。不理解這句話的詳細解釋馬上就來,繼續往下讀。

7. 使用 ARP 協議憑藉 MAC 地址通訊

關於 IP 協議、IP 地址、MAC 地址等詳細請看 別再恐懼 IP 協議(萬字長文 | 多圖預警) 這篇文章。

上面說了,IP 協議的作用是把各種資料包傳送給對方,而要保證確實傳送到對方那裡,則需要滿足各類條件,其中必要的兩個就是 IP 地址 和 MAC 地址。

MAC 地址也是用來唯一標識一個接入網際網路的裝置的,可能不禁有小夥伴要問,既然網路層已經有了唯一標識的 IP 地址,為啥還需要 MAC 地址?

看下面這幅圖,在網路上,通訊的雙方在同一區域網內的情況是很少見的,通常是需要多臺計算機和網路裝置的中轉才能連線到對方。而在進行中轉時,就需要利用下一站中轉裝置的 MAC 地址來搜尋下一個中轉目標

經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼

  • 網路層指定了從哪個主機(「源 IP 地址」)傳送到哪個主機(「目的 IP 地址」)。源 IP 地址和目標 IP 地址在傳輸過程中是不會變化的

  • 而資料鏈路層則是根據 MAC 地址在一個接一個的區間中進行傳輸的,每個區間內的出發地址即「源 MAC 地址」,每個區間內的目的地址即「目的 MAC 地址」。顯然,隨著資料的傳輸,源 MAC 地址和目的 MAC 地址會不斷的發生變化

    比如上圖,網路層告知了 1-2-3 路線,也就是說指明瞭這幾個路由器的 IP 地址。那麼資料鏈路層就會根據這幾個 IP 地址對應的 MAC 地址依次找到 1、2、3,並在他們之間傳輸資料

? 這麼說吧,舉個形象點的例子:我們把資料鏈路層當成乘坐高鐵從蘇州到南京,再在南京轉乘到北京,再在北京轉乘到西藏的旅客,那麼網路層就相當於每個車站的工作人員,在資料鏈路層每次轉乘時,網路層為其購買了一張標有下一個 MAC 地址的車票。因此,即使旅客(資料鏈路層)不知道其最終目的地也沒有關係,工作人員(網路層)會給你做出指引。

實際上,網路層做出指引的過程,我們將其稱為路由控制,其中又涉及到了路由協議比如 OSPF 等

經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼

 

那麼,將 IP 地址轉化為 MAC 地址,從而在資料鏈路層精確的傳輸資料的協議就是 ARP 協議

ARP 是藉助 ARP 請求與 ARP 響應兩種型別的包確定 MAC 地址的。並且每個主機都有一個 ARP 快取記憶體,裡面有本區域網上的各主機和路由器的 IP 地址到 MAC 地址的對映表

如下圖所示,假定主機 A 向同一鏈路上的主機 B 傳送 IP 資料包,已知主機 A 和主機 B 的 IP 地址,它們互不知道對方的 MAC 地址:

經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼

1)首先,主機 A 為了獲得主機 B 的 MAC 地址,它會先去查詢自己的 ARP 快取記憶體中有沒有主機 B 的相關記錄;

2)如果主機 A 的 ARP 快取記憶體中沒有主機 B 的 IP 地址到 MAC 地址的對映,主機 A 就會通過廣播的方式傳送 ARP 請求包(該包攜帶自己的 IP 地址 和 MAC 地址 以及 目標主機的 IP 地址),表明自己想要獲得主機 B 的 MAC 地址;

2) 由於廣播請求可以被同一個鏈路上的所有主機或路由器接收,因此如果這條鏈路上某個主機或路由的 IP 地址與這個 ARP 請求包中包含的目標主機的 IP 地址相同,那麼這個節點就將自己的 MAC 地址塞入 ARP 響應包中返回給主機 A;

經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼

當然,ARP 響應包是以單播的形式進行傳送的,畢竟 ARP 請求包中已經包含了主機 A 的 IP 地址,所以主機 B 非常清楚這個響應包應該傳送給誰。

大部分網路協議在設計的時候,都是保持極度剋制的,不需要的互動就砍掉,能合併的資訊就合併,能不用廣播就用單播,以此讓頻寬變得更多讓網路變得更快。

3)主機 A 在收到主機 B 發過來的 ARP 響應包後,向其 ARP 快取記憶體中寫入主機 B 的 IP 地址到 MAC 地址的對映。

經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼

當然,快取是有一定期限的,超過這個期限,快取的內容將被清空。這也使得即使 MAC 地址和 IP 地址的對映關係發生了變化,也依然能夠正確的將資料包傳送給目標地址。

8. 伺服器響應請求

瀏覽器的 HTTP 請求報文通過 TCP 三次握手建立的連線通道被切分成若干報文段分別傳送給伺服器,伺服器在收到這些報文段後,按照序號以原來的順序重組 HTTP 請求報文。然後處理並返回一個 HTTP 響應。當然,HTTP 響應報文也要經過和 HTTP 請求報文一樣的過程。

看下方這個圖回顧一下(圖片來源《圖解 HTTP》):

經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼

9. 斷開 TCP 連線

瀏覽器和伺服器都不再需要傳送資料後,四次揮手斷開 TCP 連線,詳細可見 關於 TCP 三次握手和四次揮手,滿分回答在此 這篇文章。

10. 瀏覽器顯示介面

瀏覽器接收到伺服器返回的資料包,根據瀏覽器的渲染機制對相應的資料進行渲染

總結

遮蔽掉底層細節,籠統的總結一下上述過程:

應用層:

  • 瀏覽器封裝 HTTP 請求報文

  • DNS 解析域名獲得目標伺服器地址

傳輸層:

  • 建立連線

  • 把應用層傳過來的 HTTP 請求報文進行分割,並在各個報文上打上標記序號及埠號轉發給網路層

網路層:

  • 利用 ARP 協議根據 IP 地址獲取作為通訊目的地的 MAC 地址後轉發給鏈路層

服務端在鏈路層收到資料,按序往上層傳送,一直到應用層接收到瀏覽器傳送來的 HTTP 請求報文,然後處理該請求並返回 HTTP 響應報文,瀏覽器接收到響應報文之後解析渲染介面。最後 TCP 斷開連線。

 

? 關注公眾號 | 飛天小牛肉,即時獲取更新

  • 博主東南大學碩士在讀,利用課餘時間運營一個公眾號『 飛天小牛肉 』,2020/12/29 日開通,專注分享計算機基礎(資料結構 + 演算法 + 計算機網路 + 資料庫 + 作業系統 + Linux)、Java 基礎和麵試指南的相關原創技術好文。本公眾號的目的就是讓大家可以快速掌握重點知識,有的放矢。希望大家多多支援哦,和小牛肉一起成長 ?

  • 並推薦個人維護的開源教程類專案: CS-Wiki(Gitee 推薦專案,現已 1.0k+ star), 致力打造完善的後端知識體系,在技術的路上少走彎路,歡迎各位小夥伴前來交流學習 ~ ?

相關文章