一次HTTP請求的完整過程——協議篇(DNS、TCP、HTTP)
阿新 • • 發佈:2019-01-03
一次 HTTP 請求的完整過程——協議篇
一、大致流程
- 根據域名和 DNS 解析到伺服器的IP地址 (DNS + CDN)
- 通過ARP協議獲得IP地址對應的物理機器的MAC地址
- 瀏覽器對伺服器發起 TCP 3 次握手
- 建立 TCP 連線後發起 HTTP 請求報文
- 伺服器響應 HTTP 請求,將響應報文返回給瀏覽器
- 短連線情況下,請求結束則通過 TCP 四次揮手關閉連線,長連線在沒有訪問伺服器的若干時間後,進行連線的關閉
- 瀏覽器得到響應資訊中的 HTML 程式碼, 並請求 HTML 程式碼中的資源(如js、css、圖片等)
- 瀏覽器對頁面進行渲染並呈現給使用者
二、深入分析
在網路協議方面,可以從三個方面深入分析
- DNS解析過程
- TCP連線過程(三次握手、四次揮手)
- HTTP請求響應過程
2.1 DNS解析過程(UDP通訊)
三種類型的 DNS 伺服器,根 DNS 伺服器,頂級域 DNS 伺服器和權威 DNS 伺服器。
- 首先瀏覽器會檢查瀏覽器自身的DNS快取中,是否有域名對應的DNS快取(chrome快取1分鐘,大概有1000條快取),沒有的話進入第二步,否則解析完成
- 接下來去檢視系統的hosts檔案(C:\Windows\System32\drivers\etc)是否有域名對應的IP地址,如果找到則停止解析,否則進入第三步
- 瀏覽器發起DNS系統呼叫,向本地配置的首選DNS伺服器發起域名解析請求(通過UDP協議,向DNS的53埠發起請求)
- 首先請求會在運營商的**DNS伺服器(本地伺服器)**上進行請求,如果找到對應的條目,且沒有過期,則解析成功,否則進入第五步
- 運營商的DNS伺服器,根據解析請求,迭代查詢,首先找到根域名伺服器的IP地址(這個DNS伺服器內建13臺根域DNS的IP地址),然後找到根域的DNS地址,傳送請求
- 根域伺服器收到請求後,根據域名,返回對應的頂級域的伺服器ip地址,並返回給運營商DNS伺服器
- 運營商DNS伺服器接收到根域名伺服器傳回來的頂級域名伺服器IP地址後,向頂級域名伺服器傳送請求
- 頂級域名伺服器接收到請求後,返回該域名對應的權威域名伺服器的ip地址,並返回給執行商DNS伺服器。
- 運營商DNS伺服器獲得權威域名伺服器的響應資訊後,返回給請求的主機,DNS解析完成。
DNS主要是通過UDP通訊,報文結構主要分為頭部Header、查詢部分Question、應答部分Answer/Authority/Addition。
2.2 TCP 連線過程(3次握手 4次揮手)
- 三次握手
第一步:客戶端向服務端傳送一份特殊的 TCP 報文,該報文並不包含應用層的資料,是一份特殊的報文,它的 TCP 首部中 SYN 欄位值為 1 。除此之外,客戶端還會隨機生成一個初始序號,填在報文的「序號」欄位,代表當前報文的序號是這個,並且我後續的分組會基於這個序號遞增。然後該報文將會經網路層、鏈路層、物理層傳送到服務端。
第二步:如果分組丟失了,那麼客戶端會經過某個時間間隔再次嘗試傳送。而如果分組準確的到達服務端了,服務端拆開 TCP 首部會看到,這是一個特殊的 SYN 握手報文,於是為此次連線分配快取等資源。
接著服務端開始構建響應報文,SYN 是一個用於同步需要的欄位,響應報文中依然會被置為 1,並且服務端也將隨機生成一個初始序號放置的響應報文的序號欄位中。
最後,服務端還會為響應報文中的確認欄位賦值,這個值就是客戶端發過來的那個序號值加一。
整體上的意思就是說,「我同意你的連線請求,我的初始序號為 xxx,你的初始序號我收到了,我等著你的下一個分組到來」
第三步:客戶端收到服務端的響應報文,於是分配客戶端 TCP 連線所必須的快取等資源,於是連線已經建立。 - 四次揮手
第一步:客戶端構建一份特殊的 TCP 報文,該報文首部欄位 FIN 被置為 1,然後傳送該報文。
第二步:服務端收到該特殊的 FIN 報文,於是響應客戶端一個 ACK 報文,告訴客戶端,請求關閉的報文已經收到,我正在處理。
第三步:服務端傳送一個 FIN 報文,告訴客戶端,我將要關閉連線了。
第四步:客戶端返回一個 ACK 響應報文,告訴服務端,我收到你剛才發的報文了,我已經確認,你可以關閉連線了。
當服務端收到客戶端傳送的 ACK 響應報文時,將釋放服務端用於該 TCP 連線的所有資源,與此同時,客戶端也會定時等待一定時間後完全釋放自己用於該連線的相關資源。
點選檢視更多有關TCP的介紹!!!
2.3 HTTP協議
點選檢視更多有關HTTP的介紹!!!
三 總結
對於一次完整的HTTP請求過程,在協議的角度方面,可以從這三個方面進行深入分析和深入學習。