一次網絡請求的處理流程

當用戶打開一個 Web 站點時,瀏覽器會發起一系列的網絡請求,以獲取站點的內容。這個過程涉及到多個環節,包括緩存、代理、DNS 解析、TCP 請求、SSL 請求、HTTP 請求等。本文將詳細介紹這些環節,并提供一些常見的問題排查方法。

一、網絡請求的處理流程

  1. HTTP 強制緩存

HTTP 強制緩存是瀏覽器在本地緩存中查找請求資源的過程。如果資源在緩存中存在且未過期,瀏覽器將直接使用緩存中的資源,而不會向服務器發送請求。這可以顯著提高頁面加載速度。

  1. ServiceWorker

ServiceWorker 是一種在瀏覽器后臺運行的腳本,可以攔截和處理網絡請求。如果 ServiceWorker 存在且已經注冊,它可以在請求到達服務器之前,直接從緩存中返回響應內容。這樣可以進一步提高頁面加載速度,甚至在離線情況下也能提供內容。

  1. 設備連接到互聯網

如果瀏覽器無法從緩存或 ServiceWorker 中獲取資源,它將嘗試連接到互聯網。這一步需要確保設備的網絡連接正常,否則請求將無法繼續。

  1. 網絡代理

在網絡請求過程中,用戶可能會使用代理工具(如梯子工具、網絡加速器等)。如果代理配置錯誤或連接異常,可能會導致請求失敗或響應緩慢。

  1. 查找 hosts

在進行 DNS 解析之前,瀏覽器會先檢查本地的 hosts 文件。如果 hosts 文件中存在對應的域名和 IP 地址映射,瀏覽器將直接使用該映射,而不會進行 DNS 解析。

  1. DNS 解析

如果 hosts 文件中沒有對應的映射,瀏覽器將進行 DNS 解析,以獲取域名對應的 IP 地址。DNS 解析的結果可能會影響請求的路由和響應速度。

  1. 初始化 TCP 請求

在獲取到 IP 地址后,瀏覽器將初始化 TCP 請求,建立與服務器的連接。這一步需要確保網絡環境穩定,否則可能會導致連接失敗。

  1. 初始化 SSL

如果請求使用 HTTPS 協議,瀏覽器將初始化 SSL 握手,以確保數據傳輸的安全性。這一步需要確保 SSL 證書有效,否則可能會導致請求失敗。

  1. 初始化 HTTP 請求

在建立連接后,瀏覽器將發送 HTTP 請求,包括請求頭和請求體。服務器接收到請求后,將返回相應的響應內容。

  1. 路由設備處理數據包

在數據傳輸過程中,路由設備會處理數據包,確保數據能夠正確到達目標服務器。如果路由設備不穩定,可能會導致數據包丟失或延遲。

  1. CDN 緩存

如果服務器使用了 CDN(內容分發網絡),請求可能會被路由到離用戶最近的 CDN 節點。CDN 緩存可以顯著提高響應速度,但如果緩存配置不當,可能會導致內容不一致。

  1. 服務端響應

最終,服務器將處理請求并返回響應內容。如果服務器端存在問題,可能會導致響應內容不正確或響應速度緩慢。

二、常見問題與排查步驟

1. 沒有返回內容

1.1 ServiceWorker 返回結果為空

  • 排查方法

    • 使用 Chrome DevTools 檢查 HTTP 請求上下文,查看 ServiceWorker 是否正常工作。

1.2 HTTP 強制緩存的內容為空

  • 排查方法

    • 使用 Chrome DevTools 檢查 HTTP 請求緩存應用狀態和響應頭,確保緩存配置正確。

1.3 代理配置錯誤、連接異常

  • 排查方法

    • 檢查代理工具的配置,確保代理工具的使用場景正確。

    • 常見情況包括:不該用代理工具的時候使用了代理工具,或者該用代理工具的時候沒有使用。

1.4 hosts 配置錯誤

  • 排查方法

    • 使用 Chrome DevTools 檢查 HTTP 請求的 Remote Address,確保 hosts 文件中的映射正確。

    • 使用 dig 命令驗證 DNS 解析結果,例如:

    • bash復制

    dig 58.com
    dig @119.29.29.29 58.com
    dig AAAA @119.29.29.29 ipv6.58.com
    

1.5 DNS 解析結果不正確

  • 排查方法

    • 使用 Chrome DevTools 檢查 HTTP 請求的 Remote Address,確保 DNS 解析結果正確。

    • 使用 dig 命令驗證 DNS 解析結果,例如:

    • bash復制

    dig 58.com
    dig @119.29.29.29 58.com
    dig AAAA @119.29.29.29 ipv6.58.com
    

1.6 TCP 層無法通信

  • 排查方法

    • 使用 Chrome DevTools 檢查請求狀態,確保 TCP 連接正常。

    • 使用 telnet 命令測試連接,例如:

    • bash復制

    telnet 58.com 80
    

1.7 SSL 證書過期、與域名不符

  • 排查方法

    • 使用 Chrome DevTools 檢查 Security 面板,確保 SSL 證書有效。

1.8 HTTP 請求、響應異常

  • 排查方法

    • 使用 Chrome DevTools 檢查請求狀態碼、緩存狀態和必要的請求響應頭,確保請求和響應符合預期。

2.返回內容慢

2.1 沒有合理利用 HTTP 強制緩存

  • 排查方法

    • 使用 Chrome DevTools 檢查 HTTP 請求緩存應用狀態和響應頭,確保緩存配置正確。

2.2 互聯網連接狀態異常

  • 排查方法

    • 使用 ping 命令驗證網絡基本連通性,例如:

    • bash復制

    ping -c 10 58.com
    
    • 確保網絡環境滿足以下條件:

      • 丟包率低于 5%。

      • 平均延時低于 20ms。

      • 最低、最高延時差值小于 30ms。

2.3 代理配置錯誤、連接異常

  • 排查方法

    • 檢查代理工具的配置,確保代理工具的使用場景正確。

2.4 DNS 解析結果異常

  • 排查方法

    • 使用 dig 命令驗證 DNS 解析結果,例如:

    • bash復制

    dig 58.com
    dig @119.29.29.29 58.com
    dig AAAA @119.29.29.29 ipv6.58.com
    

2.5 路由設備不穩定

  • 排查方法

    • 使用 traceroute 命令驗證數據包到達公網之前的路由情況,例如:

    • bash復制

    traceroute -n 58.com
    
    • 檢查 WiFi 狀態,確保 Tx Rate 高于 150 Mbps,連接方式為 5Ghz。

2.6 沒有啟用 HTTP/2

  • 排查方法

    • 使用 Chrome DevTools 檢查 Network 面板中的 Protocol,確保使用了 HTTP/2。

2.7 實時性需求較高的場景使用了 TCP

  • 排查方法

    • 考慮使用 UDP 協議,以提高實時性。

2.8 沒正確使用 CDN 緩存

  • 排查方法

    • 使用 Chrome DevTools 檢查請求的參數,確保 CDN 緩存配置正確。

3. 返回內容不對

返回內容不對通常是服務端或 HTTP 網關服務的問題,需要聯系后端或運維來解決。

4. 通信內容被監控、劫持、篡改

4.1 DNS 解析記錄監控、劫持、篡改

  • 防御方法

    • 在 Chrome 中配置使用可靠的 DoT(DNS over TLS)或 DoH(DNS over HTTPS),例如:

      • 打開 chrome://settings/security

      • 選擇 Use secure DNS

      • 選擇 With custom,國內建議填寫 https://doh.pub/dns-query

    • 在路由器中使用支持 DoT/DoH 且支持 EDNS Client Subnet 的方式,與上游 DNS 通信。

    • 在域名提供商處配置 DNSSEC。

4.2 中間人攻擊(MITM)

  • 防御方法

    • 使用 SSL 的站點不一定是安全的,但不使用或沒有正確使用 SSL 的站點一定是不安全的。

    • 通過客戶端鎖定站點證書的方式,是最安全的方法。

三、總結

網絡請求的處理流程涉及多個環節,每個環節都可能影響請求的成功與否。通過合理的配置和排查方法,可以有效解決常見的網絡問題,提高用戶體驗。