1. 程式人生 > >瀏覽器訪問一個頁面的步驟詳解

瀏覽器訪問一個頁面的步驟詳解

面試時經常被問到:瀏覽器訪問一個頁面的時候背後的步驟是怎樣的?我往往是把HTTP請求和響應講了一下。現在想想,感覺僅僅回答HTTP請求和響應有點太窄了。所以,這裡主要從計算機網路的角度將瀏覽器訪問一個頁面的背後的過程進行一個較為詳細的解讀。

域名->IP

當在瀏覽器中訪問一個網址的時候,首先要做的就是找到域名所對應的伺服器的IP地址。瀏覽器通常有三個途徑來找IP地址。
  1. 快取。包括瀏覽器的DNS快取和OS的DNS快取。
  2. HOST檔案。瀏覽器會去本地的HOST檔案中尋找域名對應的IP地址。
  3. 域名伺服器查詢。向本地域名伺服器求助(一般是路由器),如果得不到還得向更高層次的域名伺服器(根域名伺服器、頂級域名伺服器、許可權域名伺服器)求助。本地域名伺服器向高階域名伺服器查詢可以是迭代查詢或遞迴查詢。

HTTP

得到伺服器的IP地址後,需要向伺服器請求所要載入網頁的資源(HTML檔案、圖片等)。這些資源的請求和獲取可以通過HTTP完成。而HTTP協議位於應用層,其是建立在傳輸層的TCP協議的基礎之上。想要完成HTTP請求和響應還需要通過TCP建立一個瀏覽器跟伺服器的連線。

TCP連線

HTTP的預設埠是80。HTTPS的預設埠是443。當沒有特別指定的時候,伺服器的埠就是預設埠。瀏覽器的請求方埠是動態埠(範圍49152~65535),並不固定。TCP連線的建立需要通過“三次握手”來完成。而TCP連線的建立還需要通過許多傳輸層以下協議棧的協議來提供支援:
  • 需要通過網路層IP協議來完成瀏覽器所在主機到伺服器主機間的資料傳輸。
  • 需要通過ARP協議完成IP地址到硬體地址的解析。
  • 需要通過OSPF(一種內部閘道器協議)完成路由選擇。
  • ......

HTTP

當建立起TCP連線後,就可以傳送HTTP請求了。瀏覽器向伺服器傳送一個HTTP請求來請求資源。伺服器收到一個HTTP請求後,對請求進行相應的處理
,比如說身份的驗證、根據使用者身份確定資源的具體內容(比如使用者的個人資訊頁面,根據使用者ID從資料庫獲取相應資訊再生成html檔案)。在完成相應的處理後,通過HTTP響應將資源傳送給瀏覽器。當然,有可能在處理的時候發生一些情況,比如說:使用者身份驗證失敗,該使用者身份不夠許可權訪問該資源,伺服器處理過程中出現錯誤等。所以,在HTTP響應中還要加入相應的狀態碼以告訴瀏覽器當前請求的處理狀態。在HTTP響應後,面臨著是否釋放TCP連線的問題。這就是HTTP中的長連線短連線問題。
  • 短連線在客戶端和伺服器進行一次HTTP操作後就中斷連線。
  • 長連線在客戶端和伺服器進行HTTP操作後的一定時間內仍保持連線。
  • HTTP 1.0預設是短連線。
  • HTTP 1.1預設是長連線。
  • 可以通過頭部欄位Connection來決定長連線(keep-alive)或是短連線。

TCP的釋放

TCP連線的釋放需要通過“四次揮手”來完成。

瀏覽器的渲染

當瀏覽器收到伺服器返回的HTTP響應後,需要對HTTP響應的內容進行解析,並渲染到螢幕上。例如,HTTP響應的內容是一個HTML檔案,那麼瀏覽器對HTML檔案進行解析,並把其表示的內容渲染到螢幕上。HTML檔案中可能還包含了外部檔案,比如說圖片,那麼還要再重複一下之前的過程,再從伺服器中獲取該檔案。

快取

瀏覽器可以對拿到手的資源進行快取,避免對一個資源的重複請求獲取,節約時間提升效能。資源的快取狀態是由HTTP header來決定的。瀏覽器快取可以分為兩類:強快取協商快取
  • 強快取:上一次的HTTP互動中,伺服器通知了瀏覽器一個快取時間,在該時間內對該資源的請求都可以直接使用快取。
  • 協商快取:向伺服器傳送請求,伺服器會根據這個請求的request header的引數來判斷是否命中,如果命中則返回304狀態碼告訴瀏覽器可以直接使用快取,否則就重新處理請求並返回資源。
    • 判斷命中與否主要是通過對request header中的If-Modified-Since和Etag欄位與伺服器上資源的資訊進行比對分析得出的。
參考: