輸入URL發(fā)生了什么

前言已烤、瀏覽器架構(gòu)

Chrome主要使用多進(jìn)程架構(gòu)磁玉,各個進(jìn)程互相獨立,具有各自所負(fù)責(zé)的功能中鼠,若要互相通信則采用IPC機制進(jìn)行通信可婶。

  • 1.瀏覽器主進(jìn)程:主要負(fù)責(zé)主界面顯示,用戶交互援雇,各個進(jìn)程管理

  • 2.網(wǎng)絡(luò)進(jìn)程:負(fù)責(zé)網(wǎng)絡(luò)資源下載和與渲染進(jìn)程進(jìn)行資源傳輸

  • 3.渲染進(jìn)程:子資源的加載矛渴,頁面解析

  • 4.GPU進(jìn)程:GPU渲染加速,能夠針對css的一些屬性進(jìn)行性能優(yōu)化惫搏,使用GPU進(jìn)行繪制

  • 5.插件進(jìn)程:管理插件使用和執(zhí)行

1具温、DNS解析

當(dāng)我們輸入域名例如:www.baidu.com的時候,瀏覽器會首先調(diào)用器本地的DNS客戶端來解析這個域名筐赔,因為http協(xié)議的底層tcp/ip協(xié)議只能夠識別到ip格式的地址铣猩,有了ip地址我們就能正確地識別到目標(biāo)服務(wù)器并開始發(fā)送數(shù)據(jù)。

那么什么是DNS呢茴丰,它是域名系統(tǒng)(Domain Name System)达皿,負(fù)責(zé)將域名解析成ip地址天吓,由根服務(wù)器,頂級服務(wù)器峦椰,二級服務(wù)器(權(quán)威DNS服務(wù)器)等組成龄寞,分層地逐步地將域名解析出來,那么接下來說下瀏覽器將域名解析成ip的過程汤功。


607e9d15fd6d5f9d02f6f4b0adb261b9_1440w.jpg
  1. 瀏覽器會先查找本地的DNS緩存有沒該域名記錄物邑,若要則返回,無則向系統(tǒng)緩存進(jìn)行查找

  2. 若系統(tǒng)緩存有該域名的DNS記錄冤竹,則返回拂封,無則向本地的DNS服務(wù)器查找

  3. 本地的DNS可能是你搭建的dns服務(wù)或者路由器提供的服務(wù)茬射,在本地的DNS服務(wù)器緩存進(jìn)行查找鹦蠕,無則向上一層的本地DNS服務(wù)器發(fā)起查詢

  4. 無本地dns服務(wù)器都沒有改記錄,則向互聯(lián)網(wǎng)運營商DNS緩存進(jìn)行查找

  5. 互聯(lián)網(wǎng)運營商也無該記錄的話則向域名系統(tǒng)服務(wù)器發(fā)起查詢在抛,由根域名服務(wù)器钟病,.com頂級域名服務(wù)器,.baidu.com二級域名服務(wù)器來進(jìn)行遞歸查詢刚梭,通常到這里就有該dns記錄并返回ip地址

注:DNS主要基于UDP傳輸層協(xié)議肠阱,一次UDP名字服務(wù)器交換可以短到兩個包:一個查詢包、一個響應(yīng)包朴读。一次TCP交換則至少包含9個包:三次握手初始化TCP會話屹徘、一個查詢包、一個響應(yīng)包以及四次分手的包交換衅金≡胍粒考慮到效率原因,TCP連接的開銷大氮唯,故采用UDP作為DNS的運輸層協(xié)議鉴吹,這也將導(dǎo)致只有13個根域名服務(wù)器的結(jié)果。(UDP不能保證數(shù)據(jù)傳輸?shù)目煽啃猿土穑矡o法避免接受到重復(fù)數(shù)據(jù)的情況)

2豆励、HTTP連接

收到ip地址后就可以發(fā)送http請求了,http的請求報文包括狀態(tài)行瞒渠,請求頭和請求消息報文良蒸,由傳輸層通過tcp/ip協(xié)議轉(zhuǎn)化成數(shù)據(jù)包,經(jīng)過網(wǎng)絡(luò)層伍玖、鏈路層嫩痰、物理層后再向上逐層遞交和轉(zhuǎn)化在應(yīng)用層里返回給服務(wù)器,服務(wù)器取得數(shù)據(jù)處理后私沮,發(fā)送響應(yīng)報文包括狀態(tài)行始赎,響應(yīng)頭和響應(yīng)消息報文和橙,這樣瀏覽器就獲取到響應(yīng)數(shù)據(jù)。

三次握手

http協(xié)議是基于tcp/ip協(xié)議造垛,而在開始數(shù)據(jù)傳輸之前會先進(jìn)行tcp的通道連接魔招,通過3次握手來確定是否連接成功。

  1. 第一次握手:客戶端發(fā)送SYN(synchronous建立聯(lián)機)為1五辽,seq(順序號碼)為隨機數(shù)x办斑,發(fā)送到服務(wù)端,要求建立連接
  2. 第二次握手:服務(wù)端接收SYN為1的建立連接請求杆逗,便向客戶端發(fā)送確認(rèn)請求乡翅,SYN為1,ACK(acknowledgement 確認(rèn))為1罪郊,seq為隨機數(shù)y蠕蚜,ack(確認(rèn)號碼)為x+1
  3. 第三次握手:客戶端接收到確認(rèn)請求,便會校驗ack是否為x+1悔橄,若正確則發(fā)送ACK為1靶累,ack為y+1,至此tcp連接建立成功

四次揮手

數(shù)據(jù)傳輸完成后會通過四次揮手來結(jié)束連接癣疟。

  1. 第一次揮手:客戶端向服務(wù)器發(fā)送FIN為1挣柬,seq為隨機數(shù)x,表示已經(jīng)沒任何數(shù)據(jù)發(fā)送了
  2. 第二次揮手:服務(wù)端接收到客戶端的FIN包睛挚,表示接收到客戶端關(guān)閉連接的請求邪蛔,但還沒完全關(guān)閉,此時向客戶端發(fā)送ACK為1扎狱,ack為x+1
  3. 第三次揮手:當(dāng)服務(wù)端做好完全關(guān)閉連接的準(zhǔn)備時侧到,會再向客戶端發(fā)送FIN為1,seq為隨機數(shù)y
  4. 第四次揮手:客戶端收到服務(wù)端結(jié)束關(guān)閉的請求后委乌,向服務(wù)端發(fā)送ACK為1床牧,ack為y+1,等待2MSL(2 Maximum Segment Lifetime)遭贸,若再沒收到服務(wù)端的響應(yīng)戈咳,便結(jié)束連接,至此四次揮手連接關(guān)閉

3壕吹、頁面渲染

構(gòu)建DOM樹

瀏覽器不能夠直接識別到html的文件著蛙,它要首先將html文件轉(zhuǎn)換成一種數(shù)據(jù)結(jié)構(gòu)的類型-樹,我們將這個生成后的類似樹狀結(jié)構(gòu)數(shù)據(jù)稱為DOM耳贬,每個元素表示DOM上的一個節(jié)點踏堡,瀏覽器遍歷這些節(jié)點渲染成頁面元素。

構(gòu)建CSS STYLESHEETS

同樣道理咒劲,瀏覽器會將css轉(zhuǎn)換為一種瀏覽器可以理解的結(jié)構(gòu)styleSheets顷蟆,再與DOM樹結(jié)合诫隅,構(gòu)成了具有樣式的布局樹,對應(yīng)節(jié)點上會有相應(yīng)的樣式帐偎。這里的布局樹會去掉隱藏的節(jié)點逐纬,只有真實顯示的節(jié)點

布局階段

有了布局樹就可以將元素渲染到頁面上,樣式的渲染遵循層疊繼承規(guī)則削樊,當(dāng)我們需要修改樣式的時候豁生,這里面的布局涉及重排和重繪

回流(reflow)(重排)
頁面重新渲染,重新布局漫贞,修改dom的寬高甸箱,位置會觸發(fā)

重繪(repaint): 頁面重新繪制,例如修改字體顏色迅脐,背景等

回流需要重新計算布局芍殖,耗費性能,而重繪只是局部更新仪际,性能渲染較小围小£侵瑁回流必定會觸發(fā)重繪树碱,而重繪不一定需要回流。

在操作DOM的時候变秦,我們應(yīng)該盡可能地減少回流和重繪成榜,降低性能損耗

GUI渲染線程

接下來我們主要分析GUI渲染線程執(zhí)行的詳細(xì)過程:

1. 解析HTML文件,構(gòu)建DOM樹蹦玫,同時瀏覽器主進(jìn)程負(fù)責(zé)下載CSS文件

2. CSS文件下載完成赎婚,解析CSS文件成樹形的數(shù)據(jù)結(jié)構(gòu),然后結(jié)合DOM樹合并成RenderObject樹

3. 布局RenderObject樹樱溉,負(fù)責(zé)RenderObject樹中的元素尺寸挣输,位置等計算

4. 繪制RenderObject樹,繪制頁面的像素信息

5. 瀏覽器主進(jìn)程將默認(rèn)圖層和復(fù)合圖層交給GPU進(jìn)程福贞,GPU進(jìn)程再將各個圖層合成(composite)撩嚼,最后顯示出頁面

注:

  • 默認(rèn)圖層指的就是處于普通文檔流的元素;
  • 復(fù)合圖層一般指使用動畫執(zhí)行或者<video><iframe><canvas><webgl>等元素挖帘,也可以使用z-index將層級高的元素變成復(fù)合圖層完丽,使用復(fù)合圖層可以進(jìn)行硬件加速,其原理就是避免了默認(rèn)圖層的重繪和回流拇舀,想了解的童鞋可以自行深入研究逻族。

了解GUI渲染線程的執(zhí)行過程后,我們可以根據(jù)其渲染原理進(jìn)行渲染優(yōu)化:

  • 盡可能提前引入css文件骄崩,例如在頭部引入css文件;
  • 盡可能早加載css文件中引用的資源聘鳞,例如自定義字體文件薄辅,可以使用預(yù)加載,在link標(biāo)簽加入’rel=”preload” as=”font”‘該元素屬性,不然會造成渲染阻塞
  • 在DOM和CSS渲染之后加載js文件抠璃,例如在尾部加載js文件长搀,或者使用該元素屬性”defer”和”async”,進(jìn)行js文件異步加載,但是在不同瀏覽器會有兼容性問題鸡典。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末源请,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子彻况,更是在濱河造成了極大的恐慌谁尸,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纽甘,死亡現(xiàn)場離奇詭異良蛮,居然都是意外死亡,警方通過查閱死者的電腦和手機悍赢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門决瞳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人左权,你說我怎么就攤上這事皮胡。” “怎么了赏迟?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵屡贺,是天一觀的道長。 經(jīng)常有香客問我锌杀,道長甩栈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任糕再,我火速辦了婚禮量没,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘突想。我一直安慰自己殴蹄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布蒿柳。 她就那樣靜靜地躺著饶套,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垒探。 梳的紋絲不亂的頭發(fā)上妓蛮,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音圾叼,去河邊找鬼蛤克。 笑死捺癞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的构挤。 我是一名探鬼主播髓介,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼筋现!你這毒婦竟也來了唐础?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤矾飞,失蹤者是張志新(化名)和其女友劉穎一膨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洒沦,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡豹绪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了申眼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞒津。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖括尸,靈堂內(nèi)的尸體忽然破棺而出巷蚪,到底是詐尸還是另有隱情,我是刑警寧澤姻氨,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布钓辆,位于F島的核電站,受9級特大地震影響肴焊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜功戚,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一娶眷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啸臀,春花似錦届宠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至灯萍,卻和暖如春轧铁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旦棉。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工齿风, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留药薯,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓救斑,卻偏偏與公主長得像童本,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脸候,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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