從輸入網址回車看到頁面的過程,是面試逃不掉的一個問題。本文将更深入的研究,當你輸入一個網址的時候,浏覽器到底如何産生頁面的。
一、DNS解析
域名系統DNS是網際網路使用的命名系統,用來把域名位址解析為 IP 位址。
DNS解析過程:
1、向浏覽器的緩存中查找,如果沒有則進行下一步;
2、向系統緩存(本地的hosts檔案)中查找,如果沒有則進行下一步;
3、向路由器查詢DNS緩存,如果沒有則進行下一步;
4、向ISP(營運商)DNS緩存中查找(比如電信),如果沒有則進行下一步;
5、向根域名伺服器 => 頂級域名伺服器中查找。
二、建立TCP連接配接(三次握手)
知道了伺服器的IP位址後,浏覽器利用tcp協定通過三次握手與伺服器建立連接配接。三次握手的意義在于用戶端和服務端都能确認對方的收發能力正常。
三次握手的具體過程
第一步:
用戶端(A)向服務端(B)發出連接配接請求封包段,發送的是SYN字段。
這時首部中的同步位SYN=1,同時選擇一個初始序号 seq = x。TCP 規定, SYN 封包段(即 SYN= 1 的封包段)不能攜帶資料,但要消耗掉一個序号。這時, TCP 客戶程序進入 SYN-SENT (同步已發送)狀态。
第二步:
服務端(B)收到連接配接請求封包段後(确認用戶端發送功能正常),向用戶端發送應答和同意連接配接的響應,分别是ACK字段和SYN字段。
在确認封包段中應把 SYN 位和 ACK 位都置 1 ,确認号是 ack = x + 1,同時也為自己選擇一個初始序号 seq = y。請注意,這個封包段也不能攜帶資料,但同樣要消耗掉一個序号。這時 TCP 伺服器程序進 入 SYN-RCVD (同步收到)狀态。
第三步:
用戶端(A)收到服務端(B)的響應後(确認服務端接收和發送能力正常),向服務端發送應答請求,是ACK字段。
确認封包段的ACK置1,确認号ack=y+1,而自己的序号seq = x + 10。TCP的标準規定,ACK封包段可以攜帶資料。但如果不攜帶資料則不消耗序号,在這種情況下,下一個資料封包段的序号仍是 seq=x+1。
第四步:
服務端(B)收到用戶端(A)發來的ACK字段(确認用戶端接收能力正常)。
這時, TCP 連接配接已經建立,用戶端(A)進入 ESTABLISHED(已建立連接配接)狀态。當服務端(B)收到用戶端(A)的确認後,也進入 ESTABLISHED 狀态。
三、HTTP請求和響應
HTTP 是基于 TCP/IP 協定的應用層協定。
3.1 HTTP請求
用戶端發出的消息資料叫HTTP請求消息/HTTP請求封包。
由【請求行、請求頭、請求體】組成。
請求行:協定及版本,請求位址,[請求參數],請求方式;
請求頭:浏覽器發送給伺服器端的有關用戶端的一些額外資料(向伺服器端發送cookie、token);
請求體:浏覽器發送給伺服器的資料,GET請求通過URL拼接參數發送資料,是以GET請求沒有請求體。
3.2 HTTP響應
伺服器響應給用戶端的消息内容叫HTTP響應消息/HTTP響應封包。
由【狀态行、響應頭、響應體】組成。
狀态行:協定及版本,狀态碼,狀态描述;
響應頭:伺服器端發送給用戶端的一些有關伺服器端的一些額外資料。比如:伺服器端的時間,伺服器端告訴浏覽器解析資料的格式,或者如何執行下一步操作(重定向);
響應體:伺服器端發送給用戶端的資料。
四、關閉 TCP 連接配接(四次揮手)
資料傳輸完成後,如果沒有設定 Connection:Keep-Alive,将關閉 TCP 連接配接。
四次揮手的具體過程:
第一步:
用戶端(A)向服務端(B)發送斷開請求,是FIN字段。
把終止控制位 FIN 置 1 ,序号 seq = u,u 等于前面已傳送過的資料的最後一個位元組的序号加 1 。
第二步:
服務端(B)收到用戶端(A)的斷開請求後,向用戶端進行應答,發送ACK字段。
确認号是 ack = u + 1,序号是 v,等于 B 前面已傳送過的資料的最後一個位元組的序号加 1 。這時的 TCP 連接配接處于半關閉狀态,即 A 已經沒有資料要發送了,但 B 若發送資料, A 仍要接收。
第三步:
服務端(B)處理完所有内容之後,會再次向用戶端(A)發送斷開連接配接響應,發送的是FIN字段。
這時封包段中 FIN = 1 。現假定 B 的序号為 w (在半關閉狀态 B 可能又發送了一些資料)。B 還必須重複上次已發送過的确認号 ack = u + 1 。
第四步:
用戶端(A)接收到服務端(B)發送的斷開連接配接響應,并向伺服器端發送一個ACK字段,進行确認。
在确認封包段中把 ACK 置 1,确認号 ack = w + 1 ,而自己的序号是seq=u+1。然後進入到TIME-WAIT (時間等待)狀态。現在 TCP 連接配接還沒有釋放掉,必須2MSL(最長封包段壽命)時間後,用戶端才進入到 CLOSED 狀态,才能開始建立下一個新的連接配接。
五、解析渲染頁面
浏覽器渲染過程:
1、根據html節點生成DOM樹;
2、根據樣式生成CSSOM樹,并把樣式轉化為标準樣式;
3、結合DOM樹和CSSOM樹,生成渲染樹render樹;
4、分層,根據樣式對我們要繪制的頁面分層;
5、根據分層結果,給浏覽器生成每一個圖層的繪制指令;
6、把每個圖層進行栅格化;
7、繪制并顯示在浏覽器中。
六、總結
從輸入 url 到渲染出頁面的整體過程:
1、DNS 解析
2、建立 TCP 連接配接(三次握手)
3、HTTP 請求與響應
4、關閉 TCP 連接配接(四次揮手)
5、解析渲染頁面