一次完整的網絡請求過程


0.  前言

輸入一個網址,大概是經歷了域名解析、TCP的三次握手、建立TCP連接后發起HTTP請求、服

務器響應HTTP請求、瀏覽器解析html代碼,同時請求html代碼中的資源(如js、css、圖片等)、最后瀏覽器對
頁面進行渲染並呈現給用戶。下面分別介紹一下每個過程。

1.  域名解析

以Chrome瀏覽器為例,Chrome會解析域名對應的IP地址。

(1)Chrome瀏覽器會首先搜索瀏覽器自身的DNS緩存(可以使用 chrome://net-internals/#dns 來進行查看),
瀏覽器自身的DNS緩存有效期比較短,且容納有限,大概是1000條。如果自身的緩存中存在blog.csdn.net 對應的
IP地址並且沒有過期,則解析成功。

(2)如果(1)中未找到,那么Chrome會搜索操作系統自身的DNS緩存(可以在命令行下使用 ipconfig /displaydns
查看)。如果找到且沒有過期則成功。

(3)如果(2)中未找到,那么嘗試讀取位於C:\Windows\System32\drivers\etc下的hosts文件,如果找到對應的IP
地址則解析成功。

(4)如果(3)中未找到,瀏覽器首先會找TCP/IP參數中設置的本地DNS服務器,並請求LDNS服務器來解析這個域名
,這台服務器一般在你的城市的某個角落,距離你不會很遠,並且這台服務器的性能都很好,一般都會緩存域名解
析結果,大約80%的域名解析到這里就完成了。否則本地DNS服務器會請求根DNS服務器。

(5)本地DNS會把請求發至13台根DNS,根DNS服務器會返回所查詢域的主域名服務器的地址(.net),
本地DNS服務器使用該IP信息聯系負責.net域的這台服務器。這台負責.net域的服務器收到請求后,會返回
.net域的下一級DNS服務器地址(blog.csdn.net)給本地DNS服務器。以此類推,直至找到。

 

2.  TCP的三次握手

這個部分正好之前整理過,可以參考NetWork——關於TCP協議的三次握手和四次揮手。
https://blog.csdn.net/qzcsu/article/details/72861891
https://blog.csdn.net/seu_calvin/article/details/52966804

3.  建立TCP連接后發起HTTP請求

TCP三次握手建立連接成功后,客戶端按照指定的格式開始向服務端發送HTTP請求,服務端接收請求后,解析HTTP請求,
處理完業務邏輯,最后返回一個具有標准格式的HTTP響應給客戶端。

 

 

 

SYN 建立聯機(藍牙)

ACK 確認
SEQ 序號

3.1  HTTP請求格式

HTTP請求格式如下所示四部分組成,分別是請求行、請求頭、空行、消息體,每部分內容占一行。

<request-line>
<general-headers>
<request-headers>
<entity-headers>
<empty-line>
[<message-body>]
請求行:由三部分組成:分別是請求方法(GET/POST/DELETE/PUT/HEAD)、URI路徑、HTTP版本號。

請求頭:緩存相關信息(Cache-Control,If-Modified-Since)、客戶端身份信息(User-Agent)、
是否支持gzip壓縮,等鍵值對信息。

空行。

主體:客戶端發給服務端的請求數據,這部分數據並不是每個請求必須的。

 

常用的GET、POST、PUT、DELETE四種請求方式中:

(1)關於GET和DELETE將要處理的資源信息直接放在了URL中。通過"?<鍵值對>&<鍵值對>“的形式追加。
HTTP RFC規范中並沒有規定GET請求的URL長度,只是說明如果server無法處理太長的URI,可以通過
返回414狀態碼。但是大多數瀏覽器會講其限制在2k-8k之間。

(2)關於POST和PUT的請求參數存儲在報文的主體中。每一個參數都以”--boundary值“+"屬性信息"+”
空行“+"參數值"的數據結構存儲。請求數據的最后以”--boundary值--“的格式結尾。

 

3. 2  服務器響應HTTP請求

服務器接收處理完請求后返回一個HTTP響應消息給客戶端。HTTP響應消息的格式包括:狀態行、響應頭、空行、
消息體。每部分內容占一行。

<status-line>
<general-headers>
<response-headers>
<entity-headers>
<empty-line>
[<message-body>]
狀態行:有HTTP協議版本號,狀態碼和狀態說明三部分構成。

響應頭:用於說明數據的一些信息,比如數據類型、內容長度等鍵值對。

空行。

消息體:服務端返回給客戶端的HTML文本內容。或者其他格式的數據,比如:視頻流、圖片或者音頻數據。

 

4  瀏覽器解析html代碼,並請求html代碼中的資源

瀏覽器拿到html文件后,就開始解析其中的html代碼,遇到js/css/image等靜態資源時,向服務器端發起一個HTTP請求,
如果服務器端返回304狀態碼(告訴瀏覽器服務器端沒有修改該資源),那么瀏覽器會直接讀取本地的該資源的緩存
文件。否則開啟新線程向服務器端去請求下載。(這個時候就用上keep-alive特性了,建立一次HTTP連接,可以請求
多個資源。)

最后,瀏覽器利用自己內部的工作機制,把請求到的靜態資源和html代碼進行渲染,再呈現給用戶。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM