1. 程式人生 > >NetWork——描述一次完整的網路請求過程

NetWork——描述一次完整的網路請求過程

0.  前言

從我們在瀏覽器的位址列輸入http://blog.csdn.net/seu_calvin後回車,到我們看到該部落格的主頁,這中間經歷了什麼呢?簡單地回答這個問題,大概是經歷了域名解析、TCP的三次握手、建立TCP連線後發起HTTP請求、伺服器響應HTTP請求、瀏覽器解析html程式碼,同時請求html程式碼中的資源(如jscss、圖片等)、最後瀏覽器對頁面進行渲染並呈現給使用者。下面分別介紹一下每個過程。

1.  域名解析

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

1Chrome瀏覽器會首先搜尋瀏覽器自身的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伺服器,如果要查詢的域名包含在本地配置的區域資源

中,則完成域名解析,否則根據本地DNS伺服器會請求根DNS伺服器

5)本地DNS會把請求發至13臺根DNS,根DNS伺服器收到請求後會返回負責這個域名(.net)的伺服器的一個IP,本地DNS伺服器使用該IP資訊聯絡負責.net域的這臺伺服器。這臺負責.net域的伺服器收到請求後,如果自己無法解析,會返回.net域的下一級DNS伺服器地址(blog.csdn.net)給本地DNS伺服器。以此類推,直至找到。

2.  TCP的三次握手

3.  建立TCP連線後發起HTTP請求

TCP三次握手建立連線成功後,客戶端按照指定的格式開始向服務端傳送HTTP請求,服務端接收請求後,解析HTTP請求,處理完業務邏輯,最後

返回一個具有標準格式的HTTP響應給客戶端。

3.1  HTTP請求格式

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

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

請求頭:快取相關資訊(Cache-ControlIf-Modified-Since)、客戶端身份資訊(User-Agent)等鍵值對資訊。

空行

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

常用的GETPOSTPUTDELETE四種請求方式中:

1)關於GETDELETE將要處理的資源資訊直接放在了URL。通過"?<鍵值對>&<鍵值對>“的形式追加。但是URL最大長度為1024位元組。

2)關於POSTPUT的請求引數儲存在報文的主體中。每一個引數都以”--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程式碼進行渲染,再呈現給使用者。