1、步驟
(1)
TCP 連接
(3)發送 HTTP 請求
(4)服務器處理請求並返回 HTTP 報文
(5)瀏覽器解析渲染頁面
(6)
2.詳細內容
(1)DNS解析
-
-
本地 DNS 服務器會首先查詢它的緩存記錄,如果有,則直接返回結果,若沒有,本地 DNS 服務器還要向 DNS 根服務器進行查詢;
-
DNS 根服務器沒有記錄具體域名和 IP 地址的對應關系,而是告訴本地 DNS 服務器,可到域服務器上繼續查詢,並給出域服務器地址;
-
本地服務器繼續向域服務器發出請求,返回域名的解析服務器地址;
-
本地 DNS 向域名解析服務器發出請求,收到域名與 IP 地址對應關系;
-
(2)TCP連接
主要是三次握手:
1. 建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SENT狀態,等待服務器確認;
2. 服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
3. 客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。
(3)發送HTTP請求
發送HTTP請求的過程就是構建HTTP請求報文並通過TCP協議中發送到服務器指定端口(HTTP協議80/8080, HTTPS協議443)。HTTP請求報文是由三部分組成: 請求行, 請求頭和請求體
1.請求行:Method Request-URL HTTP-Version CRLF ;常用的請求方法有: GET, POST, PUT, DELETE, OPTIONS, HEAD。
2.請求頭:常見的請求頭有: Accept, Accept-Charset, Accept-Encoding, Accept-Language, Content-Type, Authorization, Cookie, User-Agent等。
3.請求體:當使用POST, PUT等方法時,通常需要客戶端向服務器傳遞數據。這些數據就儲存在請求正文中。在請求包頭中有一些與請求正文相關的信息,例如: 現在的Web應用通常采用Rest架構,請求的數據格式一般為json。這時就需要設置Content-Type: application/json。
(4)服務器處理請求並返回HTTP報文
服務器在收到瀏覽器發送的HTTP請求之后,會將收到的HTTP報文封裝成HTTP的Request對象,並通過不同的Web服務器進行處理,處理完的結果以HTTP的Response對象返回,HTTP響應報文也是由三部分組成: 狀態碼, 響應報頭和響應報文。
-
-
100 繼續
-
101 切換協議
-
-
2XX 成功狀態碼
-
200 OK 成功處理了請求
-
204 No Content 請求處理成功,但沒有資源可返回
-
206 Partial Content 請求資源的某一部分
-
-
3XX 重定向狀態碼
-
301 永久性重定向,表示請求的資源已被分配了新的 URI
-
302 臨時性重定向,資源的 URL 已臨時定位到其他位置
-
303 告訴客戶端應該用另一個 URL 獲取資源
-
304 表示客戶端發送附帶條件的請求時,服務器端允許請求訪問資源,但未滿足條件的情況
-
-
4XX 客戶端錯誤狀態碼
-
400 表示請求報文中存在語法錯誤
-
401 未授權
-
403 服務器拒絕了請求
-
404 服務器無法找到所請求的 URL
-
-
5XX 服務器錯誤狀態碼
-
500 內部服務器錯誤
-
502 錯誤網關
-
503 服務器暫時處於超負載或正在進行停機維護,現在無法處理請求。
-
-
(5)瀏覽器解析渲染頁面
瀏覽器是一個邊解析邊渲染的過程。首先瀏覽器解析HTML文件構建DOM樹,然后解析CSS文件構建渲染樹,等到渲染樹構建完成后,瀏覽器開始布局渲染樹並將其繪制到屏幕上。
reflow(回流):也稱作Layout,中文叫回流,一般意味着元素的內容、結構、位置或尺寸發生了變化,需要重新計算樣式和渲染樹,這個過程稱為Reflow
repain(重繪):當盒模型的位置,大小以及其他屬性,如顏色,字體,等確定下來之后,瀏覽器便開始繪制內容,這個過程稱為repain。
(6)連接結束
主要是四次揮手:
1.客戶端發出連接釋放報文段(FIN=1,序號seq=u),並停止再發送數據,主動關閉TCP連接,進入FIN_WAIT1(終止等待1)狀態,等待服務端的確認。
2.服務端收到連接釋放報文段后即發出確認報文段(ACK=1,確認號ack=u+1,序號seq=v),服務端進入CLOSE_WAIT(關閉等待)狀態,此時的TCP處於半關閉狀態,客戶端到服務端的連接釋放。客戶端收到服務端的確認后,進入FIN_WAIT2(終止等待2)狀態,等待服務端發出的連接釋放報文段。
3.服務端沒有要向客戶端發出的數據,服務端發出連接釋放報文段(FIN=1,ACK=1,序號seq=w,確認號ack=u+1),服務端進入LAST_ACK(最后確認)狀態,等待客戶端確認。
4.客戶端收到服務端的連接釋放報文段后,對此發出確認報文段(ACK=1,seq=u+1,ack=w+1),客戶端進入TIME_WAIT(時間等待)狀態。此時TCP未釋放掉,需要經過時間等待計時器設置的時間2MSL后,客戶端才進入CLOSED狀態。