瀏覽器傳送http請求過程分析

2021-09-16 21:16:47 字數 3434 閱讀 3476

請求過程整體流程:

網域名稱解析-->發起tcp的3次握手-->建立tcp連線後發起http請求-->伺服器響應http請求,瀏覽器得到html**-->瀏覽器解析html**,並請求html**中的資源(如js、css、等)-->瀏覽器對頁面進行渲染呈現給使用者.

下面以chrome瀏覽器訪問www.google.com為例按流程逐個分析:

chrome瀏覽器會首先搜尋瀏覽器自身的dns快取(快取時間比較短,大概只有1分鐘,且只能容納1000條快取),看自身的快取中是否有www.google.com對應的條目,而且沒有過期,如果有且沒有過期則解析到此結束。

注:我們可以使用chrome://net-internals/#dns來進行檢視chrome自身的快取。

如果瀏覽器自身的快取裡面沒有找到對應的條目,那麼chrome會搜尋作業系統自身的dns快取,如果找到且沒有過期則停止搜尋解析到此結束.

注:以windows系統為例,可以在命令列下使用 ipconfig /displaydns 來進行檢視作業系統自身的dns快取

如果在windows系統的dns快取也沒有找到,那麼嘗試讀取hosts檔案(位於c:\windows\system32\drivers\etc),看看這裡面有沒有該網域名稱對應的ip位址,如果有則解析成功。

如果在hosts檔案中也沒有找到對應的條目,瀏覽器就會發起乙個dns的系統呼叫,就會向本地配置的首選dns伺服器(一般是電信運營商提供的,也可以使用像google提供的dns伺服器)發起網域名稱解析請求(通過的是udp協議向dns的53埠發起請求,這個請求是遞迴的請求,也就是運營商的dns伺服器必須得提供給我們該網域名稱的ip位址),運營商的dns伺服器首先查詢自身的快取,找到對應的條目,且沒有過期,則解析成功。如果沒有找到對應的條目,則有運營商的dns代我們的瀏覽器發起迭代dns解析請求,它首先是會找根域的dns的ip位址(這個dns伺服器都內建13臺根域的dns的ip位址),找打根域的dns位址,就會向其發起請求(請問www.google.com這個網域名稱的ip位址是多少啊?),根域發現這是乙個頂級域com域的乙個網域名稱,於是就告訴運營商的dns我不知道這個網域名稱的ip位址,但是我知道com域的ip位址,你去找它去,於是運營商的dns就得到了com域的ip位址,又向com域的ip位址發起了請求(請問www.google.com這個網域名稱的ip位址是多少?),com域這台伺服器告訴運營商的dns我不知道www.google.com這個網域名稱的ip位址,但是我知道www.google.com這個域的dns位址,你去找它去,於是運營商的dns又向www.google.com這個網域名稱的dns位址(這個一般就是由網域名稱註冊商提供的,像萬網,新網等)發起請求(請問www.google.com這個網域名稱的ip位址是多少?),這個時候www.google.com域的dns伺服器一查,誒,果真在我這裡,於是就把找到的結果傳送給運營商的dns伺服器,這個時候運營商的dns伺服器就拿到了www.google.com這個網域名稱對應的ip位址,並返回給windows系統核心,核心又把結果返回給瀏覽器,終於瀏覽器拿到了www.google.com對應的ip位址,該進行一步的動作了。

運營商dns-->根網域名稱伺服器-->頂級網域名稱伺服器-->網域名稱註冊商伺服器

拿到網域名稱對應的ip位址之後,user-agent(一般是指瀏覽器)會以乙個隨機埠(1024 < 埠 < 65535)向伺服器的web程式(常用的有httpd,nginx等)80埠發起tcp的連線請求。這個連線請求(原始的http請求經過tcp/ip4層模型的層層封包)到達伺服器端後(這中間通過各種路由裝置,區域網內除外),進入到網絡卡,然後是進入到核心的tcp/ip協議棧(用於識別該連線請求,解封包,一層一層的剝開),還有可能要經過netfilter防火牆(屬於核心的模組)的過濾,最終到達web程式,最終建立了tcp/ip的連線。

三次握手抓包截圖:

進過tcp3次握手之後,瀏覽器發起了http的請求,使用的http的方法 get 方法,請求的url是 / ,協議是http/1.1

http請求報文格式

http響應報文格式

http狀態碼

分類分類描述

1**資訊,伺服器收到請求,需要請求者繼續執行操作

2**成功,操作被成功接收並處理

3**重定向,需要進一步的操作以完成請求

4**客戶端錯誤,請求包含語法錯誤或無法完成請求

5**伺服器錯誤,伺服器在處理請求的過程中發生了錯誤

瀏覽器在請求靜態資源時(在未過期的情況下),向伺服器端發起乙個http請求(詢問自從上一次修改時間到現在有沒有對資源進行修改),如果伺服器端返回304狀態碼(告訴瀏覽器伺服器端沒有修改),那麼瀏覽器會直接讀取本地的該資源的快取檔案。

詳細的瀏覽器工作原理請看:

最後,瀏覽器利用自己內部的工作機制,把請求到的靜態資源和html**進行渲染,渲染之後呈現給使用者。

百科 - http頭欄位

url 瀏覽器請求響應過程分析

https hypertext transfer protocol secure 安全超文字傳輸協議 通過主機名,最終得到該主機名對應的 ip 位址的過程叫做網域名稱解析 或主機名解析 瀏覽器快取 瀏覽器會按照一定的頻率快取 dns 記錄。作業系統快取 如果瀏覽器快取中找不到需要的 dns 記錄,那...

模擬瀏覽器傳送請求報文

import socket 建立socket物件 socket con socket.socket socket.af inet,socket.sock stream 連線指定伺服器位址 拼接請求報文 請求行 請求頭,必須要寫明host,原因是因為,之前連線就相當於找到了教室 這裡的host則相當於...

模擬瀏覽器傳送請求報文

import socket 建立socket物件 socket con socket.socket socket.af inet,socket.sock stream 連線指定伺服器位址 拼接請求報文 請求行 請求頭,必須要寫明host,原因是因為,之前連線就相當於找到了教室 這裡的host則相當於...