從輸入 URL 到頁面加載完成,這一過程是如何完成的?
在本文中,我將簡單闡述一下“從輸入 URL 到頁面加載完成的整個(gè)過程”。作為互聯(lián)網(wǎng)從業(yè)者,不管你屬于何種職位,都應(yīng)該有所了解。
操作的過程很簡單:打開瀏覽器,在地址欄中鍵盤輸入www.baidu.com,回車,瀏覽網(wǎng)頁….
地址欄輸入www.baidu.com
當(dāng)你按輸入www.baidu.com,瀏覽器接收到這個(gè)消息之后,會(huì)觸發(fā)自動(dòng)完成機(jī)制。瀏覽器根據(jù)自己的算法識(shí)別出你要訪問的URL。
按下回車鍵
此時(shí),回車鍵的電流回路通過電容器間接地閉合,使得少量的電流進(jìn)入了鍵盤的主邏輯電路系統(tǒng)中。邏輯電路系統(tǒng)會(huì)掃描每個(gè)按鍵的狀態(tài),對(duì)于按鍵開關(guān)的電位彈跳變化進(jìn)行解析,并將其轉(zhuǎn)化為鍵盤碼值。鍵盤控制器在得到碼值之后,將進(jìn)行編碼。編碼后,鍵碼值將儲(chǔ)存在寄存器內(nèi)。鍵盤的USB控制器會(huì)查詢到這個(gè)鍵碼值,然后將鍵碼值轉(zhuǎn)換為一個(gè)數(shù)據(jù)包。之后,此數(shù)據(jù)包將通過鍵盤傳遞給計(jì)算機(jī),計(jì)算機(jī)把數(shù)據(jù)包進(jìn)行解碼。最后,解碼后的按鍵碼值傳輸?shù)讲僮飨到y(tǒng)的硬件層。
解析URL
- 瀏覽器通過URL可以知道將要使用HTTP協(xié)議,和請(qǐng)求資源的主頁。
- 瀏覽器會(huì)將地址欄中輸入的文字傳給默認(rèn)的搜索引擎。把文字傳遞給搜索引擎的時(shí)候,URL會(huì)帶有特定的一串字符,用來告訴搜索引擎這次搜索來自某個(gè)瀏覽器。
- Unicode(規(guī)范字符集)編碼轉(zhuǎn)換。如果有非ASCII的字符,將其進(jìn)行Unicode編碼轉(zhuǎn)換。
檢查HSTS列表
瀏覽器檢查自帶的“HSTS(HTTP嚴(yán)格傳輸安全)”列表,這個(gè)列表里包含了那些只使用HTTPS進(jìn)行連接的網(wǎng)站。
DNS查詢與解析
- 瀏覽器檢查域名是否在緩存當(dāng)中。
- 如果緩存中沒有,就調(diào)用庫函數(shù)進(jìn)行查詢。庫函數(shù)在進(jìn)行DNS解析之前,檢查域名是否在本地 Hosts 里。
- 如果域名在緩存和Hosts中都沒有,庫函數(shù)會(huì)向 DNS 服務(wù)器發(fā)送一條 DNS 查詢請(qǐng)求。
- 查詢本地的DNS服務(wù)器。
- 首先查詢地址解析協(xié)議(ARP)的緩存,如果緩存命中,則返回結(jié)果:目標(biāo) IP = MAC地址。如果緩存沒有命中,就看看目標(biāo) IP 地址是不是在本地路由表中的某個(gè)子網(wǎng)內(nèi),并使用相關(guān)接口。然后查詢選擇的網(wǎng)絡(luò)接口的MAC地址。
- 發(fā)送ARP請(qǐng)求,路由器或其他硬件會(huì)返回結(jié)果(結(jié)果中包含默認(rèn)網(wǎng)關(guān)的IP地址)。
- 通過TCP/UDP協(xié)議向DNS服務(wù)器發(fā)送相應(yīng)請(qǐng)求。如果本地DNS服務(wù)器沒有找到結(jié)果,將會(huì)逐層查詢,直到結(jié)果(目標(biāo)服務(wù)器的IP地址)返回。
使用套接字
瀏覽器得到了目標(biāo)服務(wù)器的 IP 地址,以及 URL 中給出來端口號(hào)(http默認(rèn)端口號(hào)是80端口)后,瀏覽器調(diào)用庫函數(shù)socket。這個(gè)請(qǐng)求將被封裝,目標(biāo)端口會(huì)被加入頭部。在網(wǎng)絡(luò)層會(huì)再加入一個(gè)IP頭部,里面包含了目標(biāo)服務(wù)器的IP地址以及本機(jī)的IP地址。接下來繼續(xù)封裝,將本地內(nèi)置網(wǎng)卡的MAC地址和本地路由器的MAC地址封裝進(jìn)去。此時(shí)封裝包已經(jīng)準(zhǔn)備就緒。
接下來,封裝包會(huì)從本地計(jì)算機(jī)出發(fā),經(jīng)過本地網(wǎng)絡(luò),再通過調(diào)制解調(diào)器把數(shù)字信號(hào)轉(zhuǎn)換成模擬信號(hào)。在傳輸線路的另一端,另一個(gè)調(diào)制解調(diào)器把模擬信號(hào)轉(zhuǎn)換回?cái)?shù)字信號(hào),交由下一網(wǎng)絡(luò)節(jié)點(diǎn)進(jìn)行處理。最終封包會(huì)到達(dá)目標(biāo)服務(wù)器。
發(fā)送和接收的過程在TCP連接期間會(huì)發(fā)送很多次(三次握手):客戶端將封包發(fā)送給服務(wù)端,并建立連接設(shè)置初始的序列號(hào);服務(wù)端收到封包后做相應(yīng)處理,并且向客戶端表明自己接受到了第一個(gè)封包;客戶端再次發(fā)送一個(gè)封包來確認(rèn)這次連接。這就是建立連接三次握手的過程。
TLS握手
- 客戶端發(fā)送相應(yīng)消息給服務(wù)端,表明可用的加密算法以及壓縮算法。
- 服務(wù)端返回給客戶端一個(gè)消息,包含了TLS版本,以及自己使用的加密算法和壓縮算法等。
- 客戶端驗(yàn)證服務(wù)端發(fā)送的信息是否可用,如果可用,就生成一段加密的隨機(jī)數(shù)返給服務(wù)端。
- 服務(wù)端對(duì)這段密文進(jìn)行解密,并生成自己的主密鑰。
- 接下來整個(gè)會(huì)話會(huì)進(jìn)行加密,傳輸http的內(nèi)容。
HTTP協(xié)議
瀏覽器向服務(wù)器發(fā)送請(qǐng)求頭,請(qǐng)求頭內(nèi)容包括:請(qǐng)求數(shù)據(jù)方式,http版本號(hào),域名等頭部信息。接下來,服務(wù)器端返回一個(gè)響應(yīng)碼,表明這次請(qǐng)求的狀態(tài)。瀏覽器會(huì)從自己的緩存中取出想要的內(nèi)容,在解析完 HTML 之后,瀏覽器會(huì)重復(fù)上面的過程,直到HTML頁面引入的所有資源(圖片,CSS,JS等等)全部都獲取完畢。
瀏覽器
當(dāng)服務(wù)器提供了資源之后(HTML,CSS,JS,圖片等),瀏覽器會(huì)執(zhí)行下面的操作:
- HTML解析。HTML解析器的主要工作是對(duì)HTML文檔進(jìn)行解析,解析出HTML的內(nèi)容。
- CSS解析。分析CSS文件內(nèi)容以及屬性值,將每個(gè)CSS文件都被解析成一個(gè)樣式表對(duì)象。
- 頁面渲染。通過一些列計(jì)算并呈現(xiàn)DOM樹,過程就是測(cè)量-排版-繪制頁面。在渲染過程中,對(duì)圖形的渲染處理會(huì)使用圖形處理器GPU。
后期渲染
渲染結(jié)束后,瀏覽器根據(jù)時(shí)間機(jī)制運(yùn)行JavaScript代碼(比如動(dòng)畫)或與用戶交互。類似Flash和Java的插件也會(huì)運(yùn)行,這些腳本也可能改變網(wǎng)頁的內(nèi)容和布局,并產(chǎn)生又一輪渲染與繪制。
相關(guān)術(shù)語理解:
- Unicode。Unicode是計(jì)算機(jī)科學(xué)領(lǐng)域里的一項(xiàng)業(yè)界標(biāo)準(zhǔn),包括字符集、編碼方案。它為每種語言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求。
- HSTS。HTTP Strict Transport Security,國際互聯(lián)網(wǎng)工程組織IETF正在推行一的種新的Web安全協(xié)議。它作用是強(qiáng)制客戶端(如瀏覽器)使用HTTPS與服務(wù)器創(chuàng)建連接。
- DNS服務(wù)器。Domain Name Server,域名服務(wù)器。是進(jìn)行域名和與之相對(duì)應(yīng)的IP地址轉(zhuǎn)換的服務(wù)器。
- Hosts。Hosts是一個(gè)沒有擴(kuò)展名的系統(tǒng)文件,可以用記事本等工具打開,其作用就是將一些常用的網(wǎng)址域名與其對(duì)應(yīng)的IP地址建立一個(gè)關(guān)聯(lián)“數(shù)據(jù)庫”,當(dāng)用戶在瀏覽器中輸入一個(gè)需要登錄的網(wǎng)址時(shí),系統(tǒng)會(huì)首先自動(dòng)從Hosts文件中尋找對(duì)應(yīng)的IP地址,一旦找到,系統(tǒng)會(huì)立即打開對(duì)應(yīng)網(wǎng)頁,如果沒有找到,則系統(tǒng)會(huì)再將網(wǎng)址提交DNS域名解析服務(wù)器進(jìn)行IP地址的解析。
- ARP。地址解析協(xié)議。是根據(jù)IP地址獲取物理地址的一個(gè)TCP/IP協(xié)議。
- MAC地址。稱為物理地址、硬件地址,用來定義網(wǎng)絡(luò)設(shè)備的位置。
- 套接字。源IP地址和目的IP地址以及源端口號(hào)和目的端口號(hào)的組合稱為套接字。用于標(biāo)識(shí)客戶端請(qǐng)求的服務(wù)器。一般用socket函數(shù)創(chuàng)建。
- TLS。安全傳輸層協(xié)議,用于在兩個(gè)通信應(yīng)用程序之間提供保密性和數(shù)據(jù)完整性。
至此,一個(gè)完整的從輸入 URL 到頁面加載完成的過程就走完了。你學(xué)會(huì)了嗎?
作者:流年,互聯(lián)網(wǎng)產(chǎn)品設(shè)計(jì)師,4年互聯(lián)網(wǎng)產(chǎn)品設(shè)計(jì)經(jīng)驗(yàn)。
本文由 @流年 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。
題圖由作者提供
贊?? 希望作者多發(fā)些<<產(chǎn)品經(jīng)理需要懂的技術(shù)那些事>>系列