瀏覽器從輸入網(wǎng)址到頁(yè)面展示的過(guò)程

完整高頻題庫(kù)倉(cāng)庫(kù)地址:https://github.com/hzfe/awesome-interview

完整高頻題庫(kù)閱讀地址:https://febook.hzfe.org/

回答關(guān)鍵點(diǎn)

URL DNS TCP 渲染

瀏覽器從輸入網(wǎng)址到渲染頁(yè)面主要分為以下幾個(gè)過(guò)程

  • URL 輸入
  • DNS 解析
  • 建立 TCP 連接
  • 發(fā)送 HTTP / HTTPS 請(qǐng)求(建立 TLS 連接)
  • 服務(wù)器響應(yīng)請(qǐng)求
  • 瀏覽器解析渲染頁(yè)面
  • HTTP 請(qǐng)求結(jié)束砸西,斷開(kāi) TCP 連接

知識(shí)點(diǎn)深入

1. URL 輸入

URL(統(tǒng)一資源定位符糯耍,Uniform Resource Locator)用于定位互聯(lián)網(wǎng)上資源硅确,俗稱(chēng)網(wǎng)址。

我們?cè)诘刂窓谳斎?HZFE 官方網(wǎng)址 hzfe.org 后敲下回車(chē)盾计,瀏覽器會(huì)對(duì)輸入的信息進(jìn)行以下判斷:

  1. 檢查輸入的內(nèi)容是否是一個(gè)合法的 URL 鏈接催束。
  2. 是澎现,則判斷輸入的 URL 是否完整。如果不完整押赊,瀏覽器可能會(huì)對(duì)域進(jìn)行猜測(cè)饺藤,補(bǔ)全前綴或者后綴。
  3. 否,將輸入內(nèi)容作為搜索條件涕俗,使用用戶設(shè)置的默認(rèn)搜索引擎來(lái)進(jìn)行搜索罗丰。

大部分瀏覽器會(huì)從歷史記錄、書(shū)簽等地方開(kāi)始查找我們輸入的網(wǎng)址再姑,并給出智能提示萌抵。

2. DNS(Domain Name System)解析

因?yàn)闉g覽器不能直接通過(guò)域名找到對(duì)應(yīng)的服務(wù)器 IP 地址,所以需要進(jìn)行 DNS 解析元镀,查找到對(duì)應(yīng)的 IP 地址進(jìn)行訪問(wèn)绍填。

DNS 解析流程如下:

  1. 在瀏覽器中輸入 hzfe.org 域名,操作系統(tǒng)檢查瀏覽器緩存和本地的 hosts 文件中栖疑,是否有這個(gè)網(wǎng)址記錄讨永,有則從記錄里面找到對(duì)應(yīng)的 IP 地址,完成域名解析遇革。
  2. 查找本地 DNS 解析器緩存中住闯,是否有這個(gè)網(wǎng)址記錄,有則從記錄里面找到對(duì)應(yīng)的 IP 地址澳淑,完成域名解析比原。
  3. 使用 TCP/IP 參數(shù)中設(shè)置的 DNS 服務(wù)器進(jìn)行查詢(xún)。如果要查詢(xún)的域名包含在本地配置區(qū)域資源中杠巡,則返回解析結(jié)果量窘,完成域名解析。
  4. 檢查本地 DNS 服務(wù)器是否緩存該網(wǎng)址記錄氢拥,有則返回解析結(jié)果蚌铜,完成域名解析。
  5. 本地 DNS 服務(wù)器發(fā)送查詢(xún)報(bào)文至根 DNS 服務(wù)器嫩海,根 DNS 服務(wù)器收到請(qǐng)求后冬殃,用頂級(jí)域 DNS 服務(wù)器地址進(jìn)行響應(yīng)。
  6. 本地 DNS 服務(wù)器發(fā)送查詢(xún)報(bào)文至頂級(jí)域 DNS 服務(wù)器叁怪。頂級(jí)域 DNS 服務(wù)器收到請(qǐng)求后审葬,用權(quán)威 DNS 服務(wù)器地址進(jìn)行響應(yīng)。
  7. 本地 DNS 服務(wù)器發(fā)送查詢(xún)報(bào)文至權(quán)威 DNS 服務(wù)器奕谭,權(quán)威 DNS 服務(wù)器收到請(qǐng)求后涣觉,用 hzfe.org 的 IP 地址進(jìn)行響應(yīng),完成域名解析血柳。

查詢(xún)通常遵循以上流程官册,從請(qǐng)求主機(jī)到本地 DNS 服務(wù)器的查詢(xún)是遞歸查詢(xún),DNS 服務(wù)器獲取到所需映射的查詢(xún)過(guò)程是迭代查詢(xún)难捌。

3. 建立 TCP 連接

世界上幾乎所有的 HTTP 通信都是由 TCP/IP 承載的膝宁,TCP/IP 是全球計(jì)算機(jī)及網(wǎng)絡(luò)設(shè)備都在使用的一種常用的分組交換網(wǎng)絡(luò)分層鸦难。HTTP 的連接實(shí)際上就是 TCP 連接以及其使用規(guī)則。–《HTTP 權(quán)威指南》

當(dāng)瀏覽器獲取到服務(wù)器的 IP 地址后员淫,瀏覽器會(huì)用一個(gè)隨機(jī)的端口(1024 < 端口 < 65535)向服務(wù)器 80 端口發(fā)起 TCP 連接請(qǐng)求(注:HTTP 默認(rèn)約定 80 端口明刷,HTTPS 為 443 端口)。這個(gè)連接請(qǐng)求到達(dá)服務(wù)端后满粗,通過(guò) TCP 三次握手,建立 TCP 的連接愚争。

3.1 分層模型

????----------------------------------
??7|???應(yīng)用層???|???????????|???HTTP??|

??6|???表示層???|???應(yīng)用層???|

??5|???會(huì)話層???|???????????|?????????|
????---------------------------------
??4|???傳輸層???|???傳輸層???|?TCP?TLS?|
????---------------------------------
??3|???網(wǎng)絡(luò)層???|???網(wǎng)絡(luò)層???|???IP????|
????---------------------------------
??2|??數(shù)據(jù)鏈路層
???????????????|???鏈路層
??1|???物理層
????--------------------------------
???????[OSI]???|???[TCP/IP]

3.2 TCP 三次握手

#?SYN?是建立連接時(shí)的握手信號(hào)映皆,TCP?中發(fā)送第一個(gè)?SYN?包的為客戶端,接收的為服務(wù)端
# TCP 中轰枝,當(dāng)發(fā)送端數(shù)據(jù)到達(dá)接收端時(shí)捅彻,接收端返回一個(gè)已收到消息的通知。這個(gè)消息叫做確認(rèn)應(yīng)答 ACK

??假設(shè)有客戶端A鞍陨,服務(wù)端B步淹。我們要建立可靠的數(shù)據(jù)傳輸。
??????SYN(=j)???????//?SYN:?A?請(qǐng)求建立連接
??A?---------->?B
????????????????|
?????ACK(=j+1)??|???//?ACK:?B?確認(rèn)應(yīng)答?A?的?SYN
?????SYN(=k)????|???//?SYN:?B?發(fā)送一個(gè)?SYN
??A?<-----------
??|
??|??ACK(=k+1)
???----------->?B???//?ACK:?A?確認(rèn)應(yīng)答?B?的包
  1. 客戶端發(fā)送 SYN 包(seq = j)到服務(wù)器诚撵,并進(jìn)入 SYN_SEND 狀態(tài)缭裆,等待服務(wù)器確認(rèn)。
  2. 服務(wù)器收到 SYN 包寿烟,必須確認(rèn)客戶的 SYN(ACK = k + 1)澈驼,同時(shí)自己也發(fā)送一個(gè) SYN 包(seq = k),即 SYN+ACK 包筛武,此時(shí)服務(wù)器進(jìn)入 SYN_RECV 狀態(tài)缝其。
  3. 客戶端收到服務(wù)器的 SYN+ACK 包,向服務(wù)器發(fā)送確認(rèn)包 ACK(ACK = k + 1)徘六,此包發(fā)送完畢内边,客戶端和服務(wù)器進(jìn)入 ESTABLISHED 狀態(tài),完成三次握手待锈。

4. TLS 協(xié)商

建立連接后就可以通過(guò) HTTP 進(jìn)行數(shù)據(jù)傳輸漠其。如果使用 HTTPS,會(huì)在 TCP 與 HTTP 之間多添加一層協(xié)議做加密及認(rèn)證的服務(wù)竿音。HTTPS 使用 SSL(Secure Socket Layer) 和 TLS(Transport Layer Security) 協(xié)議辉懒,保障了信息的安全。

  • SSL

    • 認(rèn)證用戶和服務(wù)器谍失,確保數(shù)據(jù)發(fā)送到正確的客戶端和服務(wù)器眶俩。
    • 加密數(shù)據(jù)防止數(shù)據(jù)中途被竊取。
    • 維護(hù)數(shù)據(jù)的完整性快鱼,確保數(shù)據(jù)在傳輸過(guò)程中不被改變颠印。
  • TLS

    • 用于在兩個(gè)通信應(yīng)用程序之間提供保密性和數(shù)據(jù)完整性纲岭。該協(xié)議由兩層組成:TLS 記錄協(xié)議(TLS Record)和 TLS 握手協(xié)議(TLS Handshake)。較低的層為 TLS 記錄協(xié)議线罕,位于某個(gè)可靠的傳輸協(xié)議(例如 TCP)上面止潮。

4.1 TLS 握手協(xié)議

  1. 客戶端發(fā)出一個(gè) client hello 消息,攜帶的信息包括:所支持的 SSL/TLS 版本列表钞楼;支持的與加密算法喇闸;所支持的數(shù)據(jù)壓縮方法;隨機(jī)數(shù) A询件。
  2. 服務(wù)端響應(yīng)一個(gè) server hello 消息燃乍,攜帶的信息包括:協(xié)商采用的 SSL/TLS 版本號(hào);會(huì)話 ID宛琅;隨機(jī)數(shù) B刻蟹;服務(wù)端數(shù)字證書(shū) serverCA;由于雙向認(rèn)證需求嘿辟,服務(wù)端需要對(duì)客戶端進(jìn)行認(rèn)證舆瘪,會(huì)同時(shí)發(fā)送一個(gè) client certificate request,表示請(qǐng)求客戶端的證書(shū)红伦。
  3. 客戶端校驗(yàn)服務(wù)端的數(shù)字證書(shū)英古;校驗(yàn)通過(guò)之后發(fā)送隨機(jī)數(shù) C,該隨機(jī)數(shù)稱(chēng)為 pre-master-key昙读,使用數(shù)字證書(shū)中的公鑰加密后發(fā)出哺呜;由于服務(wù)端發(fā)起了 client certificate request,客戶端使用私鑰加密一個(gè)隨機(jī)數(shù) clientRandom 隨客戶端的證書(shū) clientCA 一并發(fā)出箕戳。
  4. 服務(wù)端校驗(yàn)客戶端的證書(shū)某残,并成功將客戶端加密的隨機(jī)數(shù) clientRandom 解密;根據(jù)隨機(jī)數(shù) A/隨機(jī)數(shù) B/隨機(jī)數(shù) C(pre-master-key) 產(chǎn)生動(dòng)態(tài)密鑰 master-key陵吸,加密一個(gè) finish 消息發(fā)至客戶端玻墅。
  5. 客戶端根據(jù)同樣的隨機(jī)數(shù)和算法生成 master-key,加密一個(gè) finish 消息發(fā)送至服務(wù)端壮虫。
  6. 服務(wù)端和客戶端分別解密成功澳厢,至此握手完成,之后的數(shù)據(jù)包均采用 master-key 進(jìn)行加密傳輸囚似。

5. 服務(wù)器響應(yīng)

當(dāng)瀏覽器到 web 服務(wù)器的連接建立后剩拢,瀏覽器會(huì)發(fā)送一個(gè)初始的 HTTP GET 請(qǐng)求,請(qǐng)求目標(biāo)通常是一個(gè) HTML 文件饶唤。服務(wù)器收到請(qǐng)求后徐伐,將發(fā)回一個(gè) HTTP 響應(yīng)報(bào)文,內(nèi)容包括相關(guān)響應(yīng)頭和 HTML 正文募狂。

<html>
?<head>
??<meta?charset="UTF-8"/>
??<title>我的博客</title>
??<link?rel="stylesheet"?src="styles.css"/>
??<scrIPt?src="index.js"></scrIPt>
</head>
<body>
??<h1?class="heading">首頁(yè)</h1>
??<p>A?paragraph?with?a?<a?></scrIPt>
</body>
</html>

5.1 狀態(tài)碼

狀態(tài)碼是由 3 位數(shù)組成办素,第一個(gè)數(shù)字定義了響應(yīng)的類(lèi)別角雷,且有五類(lèi)可能取值

  • 1xx:指示信息——表示請(qǐng)求已接收,繼續(xù)處理
  • 2xx:成功——表示請(qǐng)求已被成功接收性穿、理解勺三、接受
  • 3xx:重定向——要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作
  • 4xx:客戶端錯(cuò)誤——請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)
  • 5xx:服務(wù)器端錯(cuò)誤——服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求

5.2 常見(jiàn)的請(qǐng)求頭和字段

  • Cache-Control:must-revalidate、no-cache需曾、private(是否需要緩存資源)
  • Connection:keep-alive(保持連接)
  • Content-Encoding:gzip(web 服務(wù)器支持的返回內(nèi)容壓縮編碼類(lèi)型)
  • Content-Type:text/html吗坚;charset=UTF-8(文件類(lèi)型和字符編碼格式)
  • Date:Sun, 21 Sep 2021 06:18:21 GMT(服務(wù)器消息發(fā)出的時(shí)間)
  • Transfer-Encoding:chunked(服務(wù)器發(fā)送的資源的方式是分塊發(fā)送)

5.3 HTTP 響應(yīng)報(bào)文

響應(yīng)報(bào)文由四部分組成(響應(yīng)行 + 響應(yīng)頭 + 空行 + 響應(yīng)體)

  • 狀態(tài)行:HTTP 版本 + 空格 + 狀態(tài)碼 + 空格 + 狀態(tài)碼描述 + 回車(chē)符(CR) + 換行符(LF)
  • 響應(yīng)頭:字段名 + 冒號(hào) + 值 + 回車(chē)符 + 換行符
  • 空行:回車(chē)符 + 換行符
  • 響應(yīng)體:由用戶自定義添加呆万,如 post 的 body 等

6. 瀏覽器解析并繪制

不同的瀏覽器引擎渲染過(guò)程都不太一樣商源,這里以 Chrome 瀏覽器渲染方式為例。

  1. 處理 HTML 標(biāo)記并構(gòu)建 DOM 樹(shù)桑嘶。
  2. 處理 CSS 標(biāo)記并構(gòu)建 CSSOM 樹(shù)。
  3. 將 DOM 與 CSSOM 合并成一個(gè)渲染樹(shù)躬充。
  4. 根據(jù)渲染樹(shù)來(lái)布局逃顶,以計(jì)算每個(gè)節(jié)點(diǎn)的幾何信息。
  5. 將各個(gè)節(jié)點(diǎn)繪制到屏幕上充甚。

7. TCP 斷開(kāi)連接

現(xiàn)在的頁(yè)面為了優(yōu)化請(qǐng)求的耗時(shí)以政,默認(rèn)都會(huì)開(kāi)啟持久連接(keep-alive),那么一個(gè) TCP 連接確切關(guān)閉的時(shí)機(jī)伴找,是這個(gè) tab 標(biāo)簽頁(yè)關(guān)閉的時(shí)候盈蛮。這個(gè)關(guān)閉的過(guò)程就是四次揮手。關(guān)閉是一個(gè)全雙工的過(guò)程技矮,發(fā)包的順序是不一定的抖誉。一般來(lái)說(shuō)是客戶端主動(dòng)發(fā)起的關(guān)閉,過(guò)程如下圖所示:

  1. 主動(dòng)關(guān)閉方發(fā)送一個(gè) FIN衰倦,用來(lái)關(guān)閉主動(dòng)方到被動(dòng)關(guān)閉方的數(shù)據(jù)傳送袒炉,也就是主動(dòng)關(guān)閉方告訴被動(dòng)關(guān)閉方:我已經(jīng)不會(huì)再給你發(fā)數(shù)據(jù)了(在 FIN 包之前發(fā)送出去的數(shù)據(jù),如果沒(méi)有收到對(duì)應(yīng)的 ACK 確認(rèn)報(bào)文樊零,主動(dòng)關(guān)閉方依然會(huì)重發(fā)這些數(shù)據(jù))我磁,但此時(shí)主動(dòng)關(guān)閉方還可以接受數(shù)據(jù)。
  2. 被動(dòng)關(guān)閉方收到 FIN 包后驻襟,發(fā)送一個(gè) ACK 給對(duì)方夺艰,確認(rèn)序號(hào)為收到序號(hào)+1(與 SYN 相同,一個(gè) FIN 占用一個(gè)序號(hào))沉衣。
  3. 被動(dòng)關(guān)閉方發(fā)送一個(gè) FIN郁副,用來(lái)關(guān)閉被動(dòng)關(guān)閉方到主動(dòng)關(guān)閉方的數(shù)據(jù)傳送,也就是告訴主動(dòng)關(guān)閉方豌习,我的數(shù)據(jù)也發(fā)送完了霞势,不會(huì)再給你發(fā)數(shù)據(jù)了烹植。
  4. 主動(dòng)關(guān)閉方收到 FIN 后,發(fā)送一個(gè) ACK 給被動(dòng)關(guān)閉方愕贡,確認(rèn)序號(hào)為收到序號(hào)+1草雕,至此,完成四次揮手固以。

參考資料

  1. How_browsers_work
  2. DOMTokenList
  3. 圖解 SSL/TLS 協(xié)議
  4. DNS 域名系統(tǒng)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末墩虹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子憨琳,更是在濱河造成了極大的恐慌诫钓,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篙螟,死亡現(xiàn)場(chǎng)離奇詭異菌湃,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)遍略,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)惧所,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人绪杏,你說(shuō)我怎么就攤上這事下愈。” “怎么了蕾久?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵势似,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我僧著,道長(zhǎng)履因,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任盹愚,我火速辦了婚禮搓逾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杯拐。我一直安慰自己霞篡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布端逼。 她就那樣靜靜地躺著朗兵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顶滩。 梳的紋絲不亂的頭發(fā)上余掖,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音礁鲁,去河邊找鬼盐欺。 笑死赁豆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冗美。 我是一名探鬼主播魔种,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼粉洼!你這毒婦竟也來(lái)了节预?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤属韧,失蹤者是張志新(化名)和其女友劉穎安拟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宵喂,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡糠赦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锅棕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拙泽。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哲戚,靈堂內(nèi)的尸體忽然破棺而出奔滑,到底是詐尸還是另有隱情艾岂,我是刑警寧澤顺少,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站王浴,受9級(jí)特大地震影響脆炎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氓辣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一秒裕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钞啸,春花似錦几蜻、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至絮吵,卻和暖如春弧烤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹬敲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工暇昂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莺戒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓急波,卻偏偏與公主長(zhǎng)得像从铲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幔崖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容