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

當我的瀏覽器輸入域名後,發生了什麼?(轉)

文章轉自 https://www.cnblogs.com/shy0322/p/9276883.html

我們以百度為例子,當我在瀏覽器的中輸入網址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)如果入口伺服器也沒有,則要深入去相關的伺服器取得資料。

    就比如我要看圖片,還有我登入了賬號的資訊,就會從圖片伺服器,使用者管理伺服器去取響應資料。

  詳情見圖:

  

 

我們以百度為例子,當我在瀏覽器的中輸入網址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)如果入口伺服器也沒有,則要深入去相關的伺服器取得資料。

    就比如我要看圖片,還有我登入了賬號的資訊,就會從圖片伺服器,使用者管理伺服器去取響應資料。

  詳情見圖: