從輸入URL到頁面加載發(fā)生了什么?

一、前言

文章為了加深自我理解置济,參考:
前端經(jīng)典面試題: 從輸入URL到頁面加載發(fā)生了什么?
老生常談-從輸入url到頁面展示到底發(fā)生了什么
HTTP 請求頭與請求體
四種常見的POST提交方式

二钾唬、開始

從用戶開始輸入 url 到用戶見到頁面內(nèi)容十办,過程如下:

  1. 輸入 url
  2. 查找 ip ,從本地系統(tǒng)查找 hosts 文件,是否有 ip ? 有則下一步 : 沒有嗅绰,進(jìn)行 DNS 解析
  3. TCP 連接
  4. 發(fā)送 HTTP 請求
  5. 服務(wù)器處理并返回 HTTP 請求
  6. 瀏覽器解析渲染頁面
  7. 用戶看到完整頁面

三舍肠、具體過程

I. 輸入 url

用戶在瀏覽器中輸入網(wǎng)址的時候搀继,瀏覽器就只能的會從歷史記錄、書簽來搜索你當(dāng)前輸入的地址翠语,如果你訪問的是有緩存過的地址叽躯,網(wǎng)頁可能直接展示出來。

II. 查找 ip

每個域名都是對應(yīng)有一個 ip 地址肌括, 諸如 www.baidu.com 這些名稱只是用來方便用戶記憶点骑。所以在獲取網(wǎng)頁內(nèi)容之前,瀏覽器得先知道這個網(wǎng)址的 ip 地址谍夭,才能去到對應(yīng)的服務(wù)器去獲取資源黑滴。
首先,瀏覽器會嘗試在本地的 hosts 文件中去查看是否有相應(yīng)的 ip 記錄紧索,有的話就直接用對應(yīng)的 ip 跷跪,省去 DNS 解析。

DNS 解析

DNS (Domain Name System ,域名系統(tǒng))解析齐板,就是一個網(wǎng)址到 ip 地址轉(zhuǎn)換的過程吵瞻,解析是一個遞歸查詢的過程。

DNS解析

經(jīng)過多次的服務(wù)器往返后甘磨,得到了對應(yīng)的 ip 地址橡羞。從上述過程中,可以看出網(wǎng)址的解析是一個從右向左的過程济舆,瀏覽器首先會去訪問本地DNS服務(wù)器卿泽,查看是否有緩存 ip ,沒有滋觉,那么去訪問 根服務(wù)器签夭,每個網(wǎng)址的真正地址是www.baidu.com.,就是在網(wǎng)址后還有一個點(diǎn)椎侠,這個點(diǎn)就是指向根服務(wù)器第租,然后根服務(wù)器告訴你,你應(yīng)該去問COM頂級域名服務(wù)器我纪,然后COM頂級域名服務(wù)器又告訴你慎宾,你應(yīng)該去問baidu.com服務(wù)器,這下終于找到負(fù)責(zé)人了浅悉,baidu.com服務(wù)器就會把它管理的www.baidu.com的 ip 地址返回告訴瀏覽器趟据,費(fèi)了這么大勁,瀏覽器終于如愿以償拿到 ip 了术健,接下來就可以向該 ip 拿頁面了汹碱。
問題是,如果每一次瀏覽器訪問個網(wǎng)站都要這么費(fèi)勁荞估,那用戶體驗不就很差咳促?所以聰明的瀏覽器在訪問過一次之后色难,會去緩存下這個網(wǎng)址對應(yīng)的 ip 地址,下次就能直接用了等缀。另外枷莉,聰明的本地DNS服務(wù)器、所有的服務(wù)器也會存下映射關(guān)系尺迂,以便下次使用笤妙。另外,也可以人為修改 Hosts 文件來指定網(wǎng)址的 ip 映射關(guān)系噪裕。

III. 建立 TCP 連接

瀏覽器在拿到 ip 地址之后蹲盘,就開始準(zhǔn)備 HTTP 請求了,但首先要先和服務(wù)器建立連接通道膳音,這時候就用到 TCP 建立三次握手了召衔。 TCP 協(xié)議是用來建立對話通道的,在客戶端和服務(wù)器還沒對接之前祭陷,是無法確定各種各樣的請求的苍凛,舉個網(wǎng)絡(luò)上看到的例子:

  1. 甲: “喂!是乙嗎兵志?”
  2. 乙: “是呀醇蝴,我是乙∠牒保”
  3. 甲: “那我們開始對話吧悠栓!”

只有確保的請求服務(wù)器正確,才可以真正開始請求按价。另外惭适,在請求頭會有一個Connection: keep-alive,表示保持 TCP 連接楼镐,這樣客戶端在下次請求的時候癞志,就不需要重新建立 TCP 連接了,雖然這樣會損耗部分服務(wù)器性能鸠蚪,但對雙方(客戶端今阳、服務(wù)器)也都是有好處的师溅。

IV. 發(fā)起 HTTP 請求

典型的 HTTP 請求消息頭域茅信,如下:

  POST/GET http://download.microtool.de:80/somedata.exe 
  Host: download.microtool.de 
  Accept:*/* 
  Pragma: no-cache 
  Cache-Control: no-cache 
  Referer: http://download.microtool.de/ 
  User-Agent:Mozilla/4.04[en](Win95;I;Nav) 
  Range:bytes=554554- 

總的來說 HTTP 請求包含三部分:請求行、請求頭墓臭、請求體(請求正文)蘸鲸。

a. 請求行

請求行分為三部分:請求方法、請求地址和協(xié)及版本窿锉。
HTTP/1.1定義的請求方法有 8 種:GET酌摇、POST膝舅、PUT、DELETE窑多、PATCH仍稀、HEAD、OPTIONS埂息、TRACE技潘,最常用的兩種 GET 和 POST。以下為 GET 和 POST 區(qū)別的文章:
GET VS POST
注意: 在 POST千康、PUT享幽、PATCH 三個請求中會包含請求體,其他的并沒有拾弃。

b. 請求頭

請求頭的詳細(xì)類型和內(nèi)容的詳細(xì)內(nèi)容谷歌搜索值桩,一下是一次請求的樣例:

百度的 HTTP 請求

c. 請求體

請求體主要是用來存放數(shù)據(jù),數(shù)據(jù)類型存儲在 Content-Type 響應(yīng)頭上豪椿,接觸過的有:

  1. application/x-www-form-urlencoded
    最常見的 POST 提交數(shù)據(jù)方式奔坟,瀏覽器原生<form>表單,格式如下
POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8

title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
  1. application/json
    主要用來提交 JSON 格式的數(shù)據(jù)搭盾,格式為:
POST http://www.example.com HTTP/1.1 
Content-Type: application/json;charset=utf-8

{"title":"test","sub":[1,2,3]}
  1. multipart/form-data
    使用表單上傳文件時的格式蛀蜜,用于上傳文件,格式如:
POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"

title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png

PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
  1. text/xml
    傳輸數(shù)據(jù)增蹭,沒用過滴某,不清楚,格式如下:
POST http://www.example.com HTTP/1.1 
Content-Type: text/xml

<?xml version="1.0"?>
<methodCall>
    <methodName>examples.getStateName</methodName>
    <params>
        <param>
            <value><i4>41</i4></value>
        </param>
    </params>
</methodCall>

V. 服務(wù)器處理請求并返回 HTTP 報文

HTTP 請求也是三部分請求:狀態(tài)碼滋迈、相應(yīng)頭霎奢、響應(yīng)體(響應(yīng)報文)。

a. 狀態(tài)碼

狀態(tài)碼由3位數(shù)組成饼灿,第一個數(shù)字定義了相應(yīng)類別幕侠,共有五種可能取值:

  • 1XX 消息:代表請求已被接受,需要繼續(xù)處理碍彭。這類響應(yīng)是臨時響應(yīng)晤硕,通常情況下,服務(wù)器是不會給客戶端發(fā)送1xx響應(yīng)庇忌。
  • 2XX 成功:代表請求成功被服務(wù)器接收舞箍、理解、接受皆疹。
  • 3XX 重定向:代表客戶端需要采取進(jìn)一步的操作才能完成請求疏橄。
  • 4XX 客戶端錯誤:代表客戶端看起來發(fā)生了錯誤,妨礙了服務(wù)器的處理。
  • 5XX 服務(wù)器錯誤:表示服務(wù)器無法完成明顯有效的請求捎迫。
    參考: HTTP 狀態(tài)碼

b. 響應(yīng)頭

涉及到服務(wù)器名稱晃酒、緩存、響應(yīng)體類型等窄绒,詳細(xì)內(nèi)容自行谷歌贝次。

c. 響應(yīng)體

響應(yīng)體除了有 JSON 數(shù)據(jù)等一些其他數(shù)據(jù)類型外,也是獲取 HTML彰导、CSS浊闪、JS、圖片等文件的地方螺戳。

HTTP 和 HTTPS

HTTPS 是 HTTP 請求前搁宾,客戶端與服務(wù)器先進(jìn)行一次握手(TLS/SSL握手),用于數(shù)據(jù)加密倔幼,具體加密我不懂盖腿,參考這里:圖解SSL/TLS協(xié)議。很明顯的是损同,雖然 HTTPS 更為安全翩腐,但與 HTTP 相比,多了一次連接膏燃,肯定會影響一部分的加載速度茂卦。一張圖說明:

HTTP 與 HTTPS

VI. 瀏覽器解析渲染頁面

瀏覽器解析服務(wù)器返回的 HTML 時,是從上往下順序解析的组哩,遇到 CSS link等龙、JS link 就會向服務(wù)器請求該資源,瀏覽器也開始生成 DOM 結(jié)構(gòu)伶贰,但需要注意的是蛛砰,CSS 文件不會阻塞 DOM 結(jié)構(gòu)的生成,而 JS 文件會(因為 JS 可以操作 DOM)黍衙,所以如果在 HTML 頭部開始解析 JS 的話泥畅,瀏覽器會等 JS 請求完并且初始化結(jié)束才會繼續(xù)生成 DOM 結(jié)構(gòu)。這也是為什么 JS 經(jīng)常放在 <body>最后琅翻,而且用的是window.onload=function(){}位仁。不過可以在<script async></script>加個async方椎,告訴瀏覽器不用等我 JS 啦聂抢,趕緊開始生成你的 DOM 樹結(jié)構(gòu)(async是異步加載的意思)涛浙。
DOM 樹生成后迟隅,就要上色但骨,這時候就是 CSS 的作用了。一張圖說明:

瀏覽器解析渲染頁面

另外智袭,這里有個視頻很好的講解了瀏覽器對網(wǎng)頁的處理:網(wǎng)站性能優(yōu)化(中/英)

VII. 用戶看到完整頁面

到此奔缠,用戶終于能完整的看到一個頁面了,沒想到吧吼野,在這么短短2秒校哎,瀏覽器做了這么多事,還跑了這么遠(yuǎn)瞳步,不容易闷哆。要學(xué)的內(nèi)容還很多,這是一篇前端新手的理解单起,參考很多東西抱怔,如有出錯,請嚴(yán)厲指出~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘀倒,一起剝皮案震驚了整個濱河市屈留,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌测蘑,老刑警劉巖绕沈,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帮寻,居然都是意外死亡乍狐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門固逗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浅蚪,“玉大人,你說我怎么就攤上這事烫罩∠О粒” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵贝攒,是天一觀的道長盗誊。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么哈踱? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任荒适,我火速辦了婚禮,結(jié)果婚禮上开镣,老公的妹妹穿的比我還像新娘刀诬。我一直安慰自己,他們只是感情好邪财,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布陕壹。 她就那樣靜靜地躺著,像睡著了一般树埠。 火紅的嫁衣襯著肌膚如雪糠馆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天怎憋,我揣著相機(jī)與錄音又碌,去河邊找鬼。 笑死盛霎,一個胖子當(dāng)著我的面吹牛赠橙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播愤炸,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼期揪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了规个?” 一聲冷哼從身側(cè)響起凤薛,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎诞仓,沒想到半個月后缤苫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墅拭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年活玲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谍婉。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡舒憾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出穗熬,到底是詐尸還是另有隱情镀迂,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布唤蔗,位于F島的核電站探遵,受9級特大地震影響窟赏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜箱季,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一涯穷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧规哪,春花似錦求豫、人聲如沸塌衰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽最疆。三九已至杯巨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間努酸,已是汗流浹背服爷。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留获诈,地道東北人仍源。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像舔涎,于是被迫代替她去往敵國和親笼踩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

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