輸入url以後發生了什麼

wxc_Huang發表於2020-11-19

參考連結

瀏覽器輸入 URL 後發生了什麼?

請求資源型別

靜態資源

如果請求的是靜態資源,那麼流量有可能到達 CDN 伺服器,利用中間伺服器作快取

動態資源

如果請求的是動態資源,流量可能依次經過代理/閘道器、Web 伺服器、應用伺服器、資料庫

DNS 解析過程

  • 先檢查 host 檔案是否有相應對映,若沒有,檢查本地 DNS 伺服器是否有快取;
  • 若沒有,瀏覽器向 本地 DNS 伺服器 發起請求,採用 遞迴或者迭代查詢 的方式依次向 根域名伺服器、頂級域名伺服器、權威域名伺服器 發起查詢請求,直至找到一個或一組 IP 地址,返回給瀏覽器

在這裡插入圖片描述

HTTP 請求過程

  • DNS 解析拿到伺服器 IP 地址後,瀏覽器再通過系統 呼叫 Socket 介面與伺服器 443 埠進行通訊
  • 整個過程可以分解為建立連線、傳送 HTTP 請求、返回 HTTP 響應、維持連線、釋放連線五個部分

建立連線(三次握手)

  • 在連線建立之前,伺服器 必須做好接受連線的準備,通過 呼叫 socket、bind、listen 和 accept 四個函式來完成 繫結公網 IP、監聽 443 埠和接受請求 的任務
  • 客戶端 通過 socket 和 connect 兩個函式 主動開啟連線,給伺服器傳送帶有 SYN 標誌位 的分組,隨機生成一個 初始序列號 x,以及附帶 MSS(Maximum Segment Size,最大段大小)等額外資訊
  • 伺服器 必須 確認收到客戶端的分組 ,傳送帶有 SYN+ACK 標誌位的分組,隨機生成一個 初始序列號 y確認號為 x+1,以及附帶 MSS 等額外資訊。當一端收到另外一端的 MSS 值時,會根據兩者的 MSS 取最小值來決定隨後的 TCP 最大報文段大小
  • 客戶端 確認收到伺服器的分組,傳送帶有 ACK 標誌位的分組,確認號為 y+1,從而建立 TCP 連線

傳送 HTTP 請求

  • 建立起安全的加密通道後,瀏覽器開始傳送 HTTP 請求
  • 請求報文請求行、請求頭、空行、實體(Get 請求沒有)組成
    • 請求頭:由通用首部、請求首部、實體首部、擴充套件首部組成
      • 通用首部:無論是請求報文還是響應報文都可以使用,比如 Date;
      • 請求首部:只有在請求報文中才有意義,分為 Accept 首部、條件請求首部、安全請求首部和代理請求首部這四類
      • 實體首部作用於實體內容,分為內容首部和快取首部這兩類
      • 擴充套件首部表示使用者自定義的首部,通過 X- 字首來新增
      • 注意:HTTP 請求頭是不區分大小寫的,它基於 ASCII 進行編碼,而實體可以基於其它編碼方式,由 Content-Type 決定

返回 HTTP 響應

  • 伺服器接受並處理完請求,返回 HTTP 響應
  • 響應報文 格式基本等同於請求報文,由 響應行、響應頭、空行、實體 組成
  • 區別於請求頭:響應頭有自己的響應首部集,比如 Vary、Set-Cookie,其它的通用首部、實體首部、擴充套件首部則共用
  • 此外,瀏覽器和伺服器必須保證 HTTP 的傳輸順序,各自維護的佇列中請求/響應順序必須一一對應,否則會出現亂序而出錯的情況。

維持連線

  • 完成一次 HTTP 請求後,伺服器並不是馬上斷開與客戶端的連線
  • 在 HTTP/1.1 中,Connection: keep-alive 是預設啟用的,表示 持久連線 ,以便處理不久後到來的新請求,無需重新建立連線而增加慢啟動開銷,提高網路的吞吐能力

斷開連線(四次揮手)

  • 伺服器向客戶端傳送 Alert 報文,型別為 Close Notify,通知客戶端不再傳送資料,即將關閉連線,同樣,這條報文也是經過加密處理的
  • 伺服器 通過呼叫 close 函式 主動關閉連線,向客戶端傳送帶有 FIN 標誌位的分組序列號為 m
  • 客戶端 確認收到該分組 ,向伺服器傳送帶有 ACK 標誌位的分組,確認號為 m+1
  • 客戶端 傳送完所有資料後,向伺服器傳送帶有 FIN 標誌位 的分組,序列號為 n
  • 伺服器 確認收到該分組 ,向客戶端傳送帶有 ACK 標誌位的分組,序列號為 n+1
  • 客戶端 收到確認分組後,立即進入 CLOSED 狀態
  • 同時,伺服器 等待 2 個 MSL (Maximum Segment Lifetime,最大報文生存時間) 的時間後,進入 CLOSED 狀態

在這裡插入圖片描述

相關文章