在瀏覽器輸入url后發(fā)生了什么

著名前端面試題:
一個頁面從輸入 URL 到頁面加載顯示完成,這個過程中都發(fā)生了什么?
主要包括以下幾個基本步驟:

  1. 瀏覽器的地址欄輸入URL并按下回車好乐。
  2. 瀏覽器查找當(dāng)前URL是否存在緩存,并比較緩存是否過期。
  3. DNS解析URL對應(yīng)的IP掺炭。
  4. 根據(jù)IP建立TCP連接(三次握手)。
  5. HTTP發(fā)起請求凭戴。
  6. 服務(wù)器處理請求涧狮,瀏覽器接收HTTP響應(yīng)。
  7. 渲染頁面,構(gòu)建DOM樹者冤。
  8. 關(guān)閉TCP連接(四次揮手)肤视。
    接下來對其中幾個步驟展開說一下

1. URL

輸入URL后,會進(jìn)行解析(URL的本質(zhì)就是統(tǒng)一資源定位符)
URL一般包括幾大部分:

  • protocol涉枫,協(xié)議頭邢滑,譬如有http,加密的https愿汰,ftp等
  • host困后,主機域名或IP地址
  • port,端口號(通常端口號不常見是因為大部分的都是使用默認(rèn)的端口所以隱藏衬廷,如HTTP默認(rèn)端口80操灿,HTTPS默認(rèn)端口443。)
  • path泵督,目錄路徑
  • query趾盐,即查詢參數(shù)
  • fragment,即#后的hash值小腊,一般用來定位到某個位置

其他面試官可能問的知識點:同源策略救鲤,跨域的問題(待補充)

2.緩存

根據(jù)下圖的邏輯,判斷是直接使用緩存內(nèi)容還是重新向服務(wù)器請求資源


緩存.png

3.DNS域名解析

我們知道在地址欄輸入的域名并不是最后資源所在的真實位置秩冈,域名只是與IP地址的一個映射本缠。網(wǎng)絡(luò)服務(wù)器的IP地址那么多,我們不可能去記一串串的數(shù)字入问,因此域名就產(chǎn)生了丹锹,域名解析的過程實際是將域名還原為IP地址的過程
首先瀏覽器先檢查本地hosts文件是否有這個網(wǎng)址映射關(guān)系芬失,如果有就調(diào)用這個IP地址映射楣黍,完成域名解析。
如果沒找到則會查找本地DNS解析器緩存棱烂,如果查找到則返回租漂。
如果還是沒有找到則會查找本地DNS服務(wù)器,如果查找到則返回颊糜。
最后迭代查詢哩治,按根域服務(wù)器 ->頂級域,.com->第二層域,baidu.com ->子域衬鱼,www.baidu.com的順序找到IP地址业筏。

4.TCP連接

在通過第一步的DNS域名解析后,獲取到了服務(wù)器的IP地址鸟赫,在獲取到IP地址后蒜胖,便會開始建立一次連接消别,這是由TCP協(xié)議完成的,主要通過三次握手進(jìn)行連接翠勉。

  • 第一次握手: 建立連接時妖啥,客戶端發(fā)送syn包(seq=x)到服務(wù)器霉颠,并進(jìn)入SYN_SENT狀態(tài)对碌,等待服務(wù)器確認(rèn);
  • 第二次握手: 服務(wù)器收到syn包蒿偎,必須確認(rèn)客戶的SYN(ack=x+1)朽们,同時自己也發(fā)送一個SYN包(seq=y),即SYN+ACK包诉位,此時服務(wù)器進(jìn)入SYN_RECV狀態(tài)骑脱;
  • 第三次握手: 客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=y+1)苍糠,此包發(fā)送完畢叁丧,客戶端和服務(wù)器進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài),完成三次握手岳瞭。

完成三次握手拥娄,客戶端與服務(wù)器開始傳送數(shù)據(jù)。

TCP三次握手.png

5. 瀏覽器向服務(wù)器發(fā)送HTTP請求

完整的HTTP請求包含請求起始行瞳筏、請求頭部稚瘾、請求主體三部分。


http請求.png

常用的請求頭部(部分)

Accept: 接收類型姚炕,表示瀏覽器支持的MIME類型
(對標(biāo)服務(wù)端返回的Content-Type)
Accept-Encoding:瀏覽器支持的壓縮類型,如gzip等,超出類型不能接收
Content-Type:客戶端發(fā)送出去實體內(nèi)容的類型
Cache-Control: 指定請求和響應(yīng)遵循的緩存機制摊欠,如no-cache
If-Modified-Since:對應(yīng)服務(wù)端的Last-Modified,用來匹配看文件是否變動柱宦,只能精確到1s之內(nèi),http1.0中
Expires:緩存控制掸刊,在這個時間內(nèi)不會請求摊沉,直接使用緩存,http1.0痒给,而且是服務(wù)端時間
Max-age:代表資源在本地緩存多少秒说墨,有效時間內(nèi)不會請求,而是使用緩存苍柏,http1.1中
If-None-Match:對應(yīng)服務(wù)端的ETag尼斧,用來匹配文件內(nèi)容是否改變(非常精確),http1.1中
Cookie: 有cookie并且同域訪問時會自動帶上
Connection: 當(dāng)瀏覽器與服務(wù)器通信時對于長連接如何進(jìn)行處理,如keep-alive
Host:請求的服務(wù)器URL
Origin:最初的請求是從哪里發(fā)起的(只會精確到端口),Origin比Referer更尊重隱私
Referer:該頁面的來源URL(適用于所有類型的請求试吁,會精確到詳細(xì)頁面地址棺棵,csrf攔截常用到這個字段)
User-Agent:用戶客戶端的一些必要信息楼咳,如UA頭部等

6. 瀏覽器接收服務(wù)器的響

服務(wù)器在收到瀏覽器發(fā)送的HTTP請求之后,會將收到的HTTP報文封裝成HTTP的Request對象烛恤,并通過不同的Web服務(wù)器進(jìn)行處理母怜,處理完的結(jié)果以HTTP的Response對象返回,主要包括狀態(tài)碼缚柏,響應(yīng)頭苹熏,響應(yīng)報文三個部分。
狀態(tài)碼主要包括以下部分

  • 1xx:指示信息–表示請求已接收币喧,繼續(xù)處理轨域。
  • 2xx:成功–表示請求已被成功接收、理解杀餐、接受干发。
  • 3xx:重定向–要完成請求必須進(jìn)行更進(jìn)一步的操作。
  • 4xx:客戶端錯誤–請求有語法錯誤或請求無法實現(xiàn)史翘。
  • 5xx:服務(wù)器端錯誤–服務(wù)器未能實現(xiàn)合法的請求枉长。
    響應(yīng)頭主要由Cache-Control、 Connection琼讽、Date必峰、Pragma等組成。
    響應(yīng)體為服務(wù)器返回給瀏覽器的信息跨琳,主要由HTML自点,css,js脉让,圖片文件組成桂敛。
    常用的響應(yīng)頭部(部分):
Access-Control-Allow-Headers: 服務(wù)器端允許的請求Headers
Access-Control-Allow-Methods: 服務(wù)器端允許的請求方法
Access-Control-Allow-Origin: 服務(wù)器端允許的請求Origin頭部(譬如為*)
Content-Type:服務(wù)端返回的實體內(nèi)容的類型
Date:數(shù)據(jù)從服務(wù)器發(fā)送的時間
Cache-Control:告訴瀏覽器或其他客戶,什么環(huán)境可以安全的緩存文檔
Last-Modified:請求資源的最后修改時間
Expires:應(yīng)該在什么時候認(rèn)為文檔已經(jīng)過期,從而不再緩存它
Max-age:客戶端的本地資源應(yīng)該緩存多少秒溅潜,開啟了Cache-Control后有效
ETag:請求變量的實體標(biāo)簽的當(dāng)前值
Set-Cookie:設(shè)置和頁面關(guān)聯(lián)的cookie术唬,服務(wù)器通過這個頭部把cookie傳給客戶端
Keep-Alive:如果客戶端有keep-alive,服務(wù)端也會有響應(yīng)(如timeout=38)
Server:服務(wù)器的一些相關(guān)信息

如下圖是對某請求的http報文結(jié)構(gòu)的簡要分析


image.png

7. 頁面渲染

前面有提到http交互滚澜,那么接下來就是瀏覽器獲取到html粗仓,然后解析,渲染

  1. 解析HTML设捐,構(gòu)建DOM樹
  2. 解析CSS借浊,生成CSS規(guī)則樹
  3. 合并DOM樹和CSS規(guī)則,生成render樹
  4. 布局render樹(Layout/reflow)萝招,負(fù)責(zé)各元素尺寸蚂斤、位置的計算
  5. 繪制render樹(paint),繪制頁面像素信息
  6. 瀏覽器會將各層的信息發(fā)送給GPU槐沼,GPU會將各層合成(composite)曙蒸,顯示在屏幕上
    如下圖:


    頁面渲染.png

    DOM樹.png

    CSSOM樹.png
  • 在瀏覽器還沒接收到完整的 HTML 文件時捌治,它就開始渲染頁面了,在遇到外部鏈入的腳本標(biāo)簽或樣式標(biāo)簽或圖片時纽窟,會再次發(fā)送 HTTP 請求重復(fù)上述的步驟肖油。在收到 CSS 文件后會對已經(jīng)渲染的頁面重新渲染,加入它們應(yīng)有的樣式臂港,圖片文件加載完立刻顯示在相應(yīng)位置森枪。在這一過程中可能會觸發(fā)頁面的重繪或重排。這里就涉及了兩個重要概念:Reflow和Repaint趋艘。
  • Reflow疲恢,也稱作Layout凶朗,中文叫回流瓷胧,一般意味著元素的內(nèi)容、結(jié)構(gòu)棚愤、位置或尺寸發(fā)生了變化搓萧,需要重新計算樣式和渲染樹,這個過程稱為Reflow宛畦。
  • Repaint瘸洛,中文重繪,意味著元素發(fā)生的改變只是影響了元素的一些外觀之類的時候(例如次和,背景色反肋,邊框顏色,文字顏色等)踏施,此時只需要應(yīng)用新樣式繪制這個元素就OK了石蔗,這個過程稱為Repaint。
  • 所以說Reflow的成本比Repaint的成本高得多的多畅形。DOM樹里的每個結(jié)點都會有reflow方法养距,一個結(jié)點的reflow很有可能導(dǎo)致子結(jié)點,甚至父點以及同級結(jié)點的reflow日熬。

8. 關(guān)閉TCP連接或繼續(xù)保持連接

通過四次揮手關(guān)閉連接(FIN ACK, ACK, FIN ACK, ACK)棍厌。


關(guān)閉TCP連接-四次揮手.png
  • 第一次揮手是瀏覽器發(fā)完數(shù)據(jù)后,發(fā)送FIN請求斷開連接竖席。
  • 第二次揮手是服務(wù)器發(fā)送ACK表示同意耘纱,如果在這一次服務(wù)器也發(fā)送FIN請求斷開連接似乎也沒有不妥,但考慮到服務(wù)器可能還有數(shù)據(jù)要發(fā)送毕荐,所以服務(wù)器發(fā)送FIN應(yīng)該放在第三次揮手中束析。
  • 這樣瀏覽器需要返回ACK表示同意,也就是第四次揮手东跪。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末畸陡,一起剝皮案震驚了整個濱河市鹰溜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丁恭,老刑警劉巖曹动,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牲览,居然都是意外死亡墓陈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門第献,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贡必,“玉大人,你說我怎么就攤上這事庸毫∽心猓” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵飒赃,是天一觀的道長利花。 經(jīng)常有香客問我,道長载佳,這世上最難降的妖魔是什么炒事? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蔫慧,結(jié)果婚禮上挠乳,老公的妹妹穿的比我還像新娘。我一直安慰自己姑躲,他們只是感情好睡扬,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肋联,像睡著了一般威蕉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橄仍,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天韧涨,我揣著相機與錄音,去河邊找鬼侮繁。 笑死虑粥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宪哩。 我是一名探鬼主播娩贷,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锁孟!你這毒婦竟也來了彬祖?” 一聲冷哼從身側(cè)響起茁瘦,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎储笑,沒想到半個月后甜熔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡突倍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年腔稀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羽历。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡焊虏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秕磷,到底是詐尸還是另有隱情诵闭,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布跳夭,位于F島的核電站涂圆,受9級特大地震影響们镜,放射性物質(zhì)發(fā)生泄漏币叹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一模狭、第九天 我趴在偏房一處隱蔽的房頂上張望颈抚。 院中可真熱鬧,春花似錦嚼鹉、人聲如沸贩汉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匹舞。三九已至,卻和暖如春线脚,著一層夾襖步出監(jiān)牢的瞬間赐稽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工浑侥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留姊舵,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓寓落,卻偏偏與公主長得像括丁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子伶选,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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