天天看點

阿裡一面:輸入網址後是如何擷取頁面的?

作者:尚矽谷教育

從輸入網址回車看到頁面的過程,是面試逃不掉的一個問題。本文将更深入的研究,當你輸入一個網址的時候,浏覽器到底如何産生頁面的。

一、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、解析渲染頁面

繼續閱讀