0. 前言css
輸入一個網址,大概是經歷了域名解析、TCP的三次握手、創建TCP鏈接後發起HTTP請求、服html
務器響應HTTP請求、瀏覽器解析html代碼,同時請求html代碼中的資源(如js、css、圖片等)、最後瀏覽器對
頁面進行渲染並呈現給用戶。下面分別介紹一下每一個過程。chrome
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服務器。spa
(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代碼進行渲染,再呈現給用戶。