1.url解析與DNS解析
瀏覽器解析用戶輸入的URL,提取協議(HTTP\HTTPS)、域名、端口及路徑等信息
瀏覽器首先檢查本地DNS緩存和系統DNS緩存,若未命中,查詢本地hosts文件
最后遞歸查詢向本地DNS服務器發起請求,獲取域名對應的IP地址
這里我想插入一段,講講本地DNS緩存、系統DNS緩存、Hosts文件、DNS服務器幾者之間的關系
首先,不要覺得很復雜,其實本質就是為了根據域名拿IP地址,只是好幾個地方緩存了,先這么簡單理解。然后繼續往下看。
本地DNS緩存是瀏覽器緩存,瀏覽器緩存會緩存最近訪問的域名與IP的映射關系,來減少重復查詢的延遲
但本地DNS緩存時間較短,比如chrome默認只有1分鐘
用戶輸入URL后,瀏覽器首先檢查自身緩存,若命中就直接使用IP地址
系統DNS緩存是操作系統緩存,操作系統也維護了獨立的DNS緩存,用于存儲域名解析結果,避免重復請求DNS服務器
若瀏覽器緩存未命中,操作系統會檢查自身緩存,若命中直接返回IP地址
Hosts文件是本地手動配置的域名與IP的映射文件,路徑一般為C:\Windows\System32\drivers\etc\hosts
修改后會強制清空操作系統DNS緩存
瀏覽器緩存和系統緩存均未命中時,操作系統會檢查hosts文件,若命中,直接使用配置的IP地址
當本地、系統緩存及Hosts文件均未命中時,操作系統就會向配置的本地DNS服務器發起遞歸查詢
2.TCP連接建立
三次握手:通過TCP協議與服務器建立可靠連接
連接復用:HTTP 1.1默認支持keep-alive, 復用TCP連接以減少握手開銷
3.發送HTTP請求
瀏覽器構造HTTP請求,包含請求行(方法、URI、協議)、請求頭(user-Agent、Host、Cookie)、請求體
4.服務器處理請求
如果是靜態資源,直接返回文件
如果是動態資源,調用后端服務生成響應內容
構建響應內容,包含狀態行(http/1.1 200 ok)、響應頭(Content-type、重定向地址、緩存策略)、響應體
5.瀏覽器接收與渲染
瀏覽器解析響應頭,根據狀態碼決定后續操作
瀏覽器進行資源加載和頁面渲染
6.連接關閉與緩存
四次揮手關閉連接
DNS緩存,減少后續解析延遲
瀏覽器對靜態資源副本進行緩存,通過ETag或last-Modified驗證資源是否更新
講講協商緩存ETag和Last-Modified
瀏覽器在發送請求的時候,首先會檢查強制緩存,如果緩存命中,則不需要發送請求。直接從緩存中獲取資源數據,若強緩存失效,則發送請求進去協商緩存,服務器通過請求頭Last-Modified或Etag字段進行檢查,若200表示資源有更新,304則表示資源沒變,直接取緩存即可。
若同時存在ETag和Last-Modified,服務器優先驗證ETag。
ETag是基于資源內容hash,精確到字節級別,適用于對內容變化敏感的資源(比如JSON、js文件)
Last-Modified是基于修改時間,精確到秒級別,適用于文件、圖片等不頻繁更新的靜態資源
總結
從瀏覽器輸入一個url到服務器的流程如下:
- url解析與DNS解析
- TCP連接建立
- 發送HTTP請求
- 服務器處理請求
- 瀏覽器接收與渲染
- 連接關閉與緩存
?