1. 程式人生 > >當我的瀏覽器輸入域名後,發生了什麽?

當我的瀏覽器輸入域名後,發生了什麽?

wid 深入 連接 bubuko 轉發 一個 用戶管理 好的 請求報文

我們以百度為例子,當我在瀏覽器的中輸入網址www.baidu.com時,發生了什麽?

     技術分享圖片

1.域名解析

  要知道,數據傳輸時所識別的數據鏈路層封裝的幀,並不是通過字符串“www.baidu.com”傳輸的,而是通過對放的MAC地址找到對方的(硬件地址),那麽要想獲得MAC地址,自然也是通過IP地址並通過ARP協議轉換而來的。

  因為應用層只認識IP地址,所以當務之急,要想獲取數據,必須先了解“www.baidu.com”域名所對應的IP地址。

  想到了什麽?DNS服務器——域名解析服務器

  但是我們要知道,我們的網絡環境是錯綜復雜的,所以能自己自立根深解決的問題,盡量不要去麻煩別人,就好比你不確定高速路上堵不堵,你可以在家樓下買到香煙,何必大老遠上高速去上海買呢?

  技術分享圖片

  a)瀏覽器會從主機的Hosts文件中查看是否有百度域名和IP地址的映射。

   Hosts文件是一個用於存儲計算機網絡中節點信息的文件,它可以將主機名映射到相應的IP地址,實現DNS的功能,它可以由計算機的用戶進行控制。

   (PS:所以如果我們修改它,將www.baidu.com的對應IP改為127.0.0.1,看看會發生什麽?)

  b)如果Hosts文件沒有,瀏覽器會查看自己的緩存。(由上面 PS 中的結果可以得出結論順序為先 a) 再 b) 還是先 b) 再 a))。

  c)當上面兩個方法都行不通時,只能去請求DNS服務器來獲取IP地址,這個過程用圖片更好理解

  我們先來看一下分布式的域名系統DNS:

  技術分享圖片

  我們以m.xyz.com 向 a.abc.com發送郵件為例,我們m.xyz.com詢問對方域名解析的方式分別是叠代查詢和遞歸查詢,如圖所示:

  技術分享圖片


  技術分享圖片

2.發起連接,構造請求。

  獲取了對方的IP地址後,我們自然要發送相對的HTTP報文(當然因為百度是https://www.baidu.com/,所以在發送HTTP請求報文前要先發送一個HTTPS報文建立一個安全信道,並且確定網站的真實性。)

  a)建立TCP連接,牢記三次握手的過程。

  技術分享圖片

  b)確認連接後發送一個HTTP請求報文。

   在這裏要清楚網絡棧模型封裝HTTP數據包的過程,先是寫入HTTP報文的信息——首行、頭部、空行、內容。再是在傳輸層打包,加上TCP首部,再來到IP層加上IP頭部,通過ARP協議知道對方的MAC地址,到數據鏈路層打包封裝成幀,通過路由轉發,抵達目的MAC地址,再自下而上拆包,知道抵達對方服務器。之後對方服務器寫一個響應報文再用同樣的方式傳回。

  HTTP請求報文的格式:

  技術分享圖片

  需要註意的是,還有兩個很常見的報文方法是 CONNECT 和 GET 。

  CONNECT表示要求用隧道協議連接代理,連接https協議下的域名時經常可以抓到這個類型的包。

  GET表示獲取資源,與POST作用大致相同,最大的不同就是POST有body,而GET沒有。

3.數據轉發

  我們在2中有提及過細粒度上的路由轉發。那麽在粗粒度上發生了什麽?

  a)請求抵達運營商維護的CDN服務器,看看是否有該請求對應響應的靜態頁面。

    CDN的一大作用就是貯存一些在它所管理區域會頻發用到的響應靜態頁面,這在很大程度上就很好的減輕了網絡壓力,用戶不用直接去詢問網站的總部服務器,可以更快得到響應,增加了用戶體驗的幸福感,還減輕了網絡擁塞,兩全其美。

  b)如果CDN沒有,則先詢問百度入口服務器,如果入口服務器有對應請求響應的靜態頁面,那麽可以作為一個反向代理回復請求報文。

    入口服務器的作用也是為了提高用戶體驗的幸福感,入口服務器也會貯存一些常用的靜態頁面,這也不用再深入其他服務器取數據了。

  c)如果入口服務器也沒有,則要深入去相關的服務器取得數據。

    就比如我要看圖片,還有我登錄了賬號的信息,就會從圖片服務器,用戶管理服務器去取響應數據。

  詳情見圖:

  技術分享圖片

  

  

當我的瀏覽器輸入域名後,發生了什麽?