一個(gè)頁面從輸入 URL 到頁面加載顯示完成客情,這個(gè)過程中都發(fā)生了什么絮吵?

1. DNS 解析:將域名解析成 IP 地址

IP 地址:IP 協(xié)議為互聯(lián)網(wǎng)上的每一個(gè)網(wǎng)絡(luò)和每一臺(tái)主機(jī)分配的一個(gè)邏輯地址摆霉。
DNS:域名系統(tǒng)椰棘,是互聯(lián)網(wǎng)的一項(xiàng)服務(wù)懒浮。它作為將域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫能夠使人更方便地訪問互聯(lián)網(wǎng)飘弧。

以查詢 www.baidu.com 的 IP 地址為例,其中2砚著、3次伶、4步均在上一步未查詢成功的情況下進(jìn)行。

解析過程:

  1. 瀏覽器搜索自己的 DNS 緩存(維護(hù)一張域名與 IP 地址的對應(yīng)表)稽穆;
  2. 搜索操作系統(tǒng)中的 DNS 緩存(維護(hù)一張域名與 IP 地址的對應(yīng)表)冠王;
  3. 搜索操作系統(tǒng)的 hosts 文件( Windows 環(huán)境下,維護(hù)一張域名與 IP 地址的對應(yīng)表)舌镶;
  4. 操作系統(tǒng)將域名發(fā)送至 LDNS(本地區(qū)域名服務(wù)器柱彻,如果你在學(xué)校接入互聯(lián)網(wǎng)豪娜,則 LDNS 服務(wù)器就在學(xué)校,如果通過電信接入互聯(lián)網(wǎng)哟楷,則 LDNS 服務(wù)器就在你當(dāng)?shù)氐碾娦拍抢锪鲈亍#㎜DNS 查詢自己的 DNS 緩存(一般查找成功率在 80% 左右),查找成功則返回結(jié)果卖擅,失敗則發(fā)起一個(gè)迭代 DNS 解析請求鸣奔;
    1. LDNS 向 Root Name Server (根域名服務(wù)器,其雖然沒有每個(gè)域名的的具體信息磨镶,但存儲(chǔ)了負(fù)責(zé)每個(gè)域溃蔫,如 com健提、net琳猫、org等的解析的頂級域名服務(wù)器的地址)發(fā)起請求,此處私痹,Root Name Server 返回 com 域的頂級域名服務(wù)器的地址脐嫂;
    2. LDNS 向 com 域的頂級域名服務(wù)器發(fā)起請求,返回 baidu.com 域名服務(wù)器地址紊遵;
    3. LDNS 向 baidu.com 域名服務(wù)器發(fā)起請求账千,得到 www.baidu.com 的 IP 地址;
  5. LDNS 將得到的 IP 地址返回給操作系統(tǒng)暗膜,同時(shí)自己也將 IP 地址緩存起來匀奏;
  6. 操作系統(tǒng)將 IP 地址返回給瀏覽器,同時(shí)自己也將 IP 地址緩存起來学搜;
  7. 至此娃善,瀏覽器已經(jīng)得到了域名對應(yīng)的 IP 地址。

2. TCP 連接:TCP 三次握手

知道了服務(wù)器的 IP 地址瑞佩,下面便開始與服務(wù)器建立連接了聚磺。

通信連接的建立需要經(jīng)歷以下三個(gè)過程:

  1. 主機(jī)向服務(wù)器發(fā)送一個(gè)建立連接的請求
  2. 服務(wù)器接到請求后發(fā)送同意連接的信號(hào)
  3. 主機(jī)接到同意連接的信號(hào)后,再次向服務(wù)器發(fā)送了確認(rèn)信號(hào)

自此炬丸,主機(jī)與服務(wù)器兩者建立了連接瘫寝。
“三次握手”的目的是“為了防止已失效的連接請求報(bào)文段突然又傳送到了服務(wù)端,因而產(chǎn)生錯(cuò)誤”稠炬。

3. 發(fā)送 HTTP 請求

當(dāng)服務(wù)器與主機(jī)建立了連接之后焕阿,下面主機(jī)便與服務(wù)器進(jìn)行通信。網(wǎng)頁請求是一個(gè)單向請求的過程首启,即是一個(gè)主機(jī)向服務(wù)器請求數(shù)據(jù)捣鲸,服務(wù)器返回相應(yīng)的數(shù)據(jù)的過程。

發(fā)送 HTTP 請求的過程闽坡,就是構(gòu)建 HTTP 請求報(bào)文并通過 TCP 協(xié)議中發(fā)送到服務(wù)器指定端口(HTTP協(xié)議80/8080, HTTPS協(xié)議443)栽惶。

HTTP/1.1協(xié)議中定義了多種請求方法愁溜,包括GET,POST外厂,GET冕象,PUT,PATCH汁蝶, DELETE渐扮,HEAD,OPTIONS等掖棉。

格式

請求方法 路徑 協(xié)議/版本
Key1: value1
Key2: value2
Key3: value3
Content-Length: n
Content-Type: application/x-www-form-urlencoded
Host: https://www.google.com/
User-Agent: curl/7.56.0

要上傳的數(shù)據(jù)

  • 第一行是第一部分:請求行
    請求方法就是前面提到的那幾種墓律,常用GET,POST(思考它們的區(qū)別)幔亥。這里的路徑包括「查詢參數(shù)」耻讽,但不包括「錨點(diǎn)」。如果你沒有寫路徑帕棉,那么路徑默認(rèn)為 / 针肥。
  • 第二行直到回車是第二部分:請求報(bào)頭
    請求報(bào)頭包含客戶端向服務(wù)器傳遞請求的附加信息和客戶端自身的信息,由關(guān)鍵字/值對組成香伴,每行一對慰枕,關(guān)鍵字和值用英文冒號(hào) : 分隔。
    常見的請求報(bào)頭有: Accept, Accept-Charset, Accept-Encoding, Accept-Language, Content-Type, Authorization, Cookie, User-Agent 等即纲。
  • 第三部分永遠(yuǎn)都是一個(gè)回車(\n):CRLF(Carriage-Return Line-Feed)具帮,意思是回車換行,一般作為分隔符存在
  • 回車后的內(nèi)容是第四部分:請求正文
    當(dāng)使用 POST低斋、PUT 等方法時(shí)蜂厅,通常需要客戶端向服務(wù)器傳遞數(shù)據(jù)。這些數(shù)據(jù)就儲(chǔ)存在請求正文中拔稳。請求正文可以承載多個(gè)請求參數(shù)的數(shù)據(jù)葛峻,包含回車符、換行符和請求數(shù)據(jù)巴比,并不是所有請求都具有請求數(shù)據(jù)(也就是說第四部分可以為空)术奖。
    在請求包頭中有一些與請求正文相關(guān)的信息,例如:現(xiàn)在的 Web 應(yīng)用通常采用 Rest 架構(gòu)轻绞,請求的數(shù)據(jù)格式一般為 json采记。這時(shí)就需要設(shè)置 Content-Type: application/json

GET 和 POST 的區(qū)別:
get 和 post 雖然本質(zhì)都是 tcp/ip政勃,但兩者除了在 http 層面外唧龄,在 tcp/ip 層面也有區(qū)別。

  • GET在瀏覽器回退時(shí)是無害的奸远,而POST會(huì)再次提交請求既棺。
  • GET產(chǎn)生的URL地址可以被加入收藏欄讽挟,而POST不可以。
  • GET請求會(huì)被瀏覽器主動(dòng)cache丸冕,而POST不會(huì)耽梅,除非手動(dòng)設(shè)置。
  • GET請求只能進(jìn)行url編碼胖烛,而POST支持多種編碼方式眼姐。
  • GET請求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)不會(huì)被保留佩番。
  • GET請求在URL中傳送的參數(shù)是有長度限制的众旗,而POST么有。
  • 對參數(shù)的數(shù)據(jù)類型趟畏,GET只接受ASCII字符贡歧,而POST沒有限制。
  • GET比POST更不安全拱镐,因?yàn)閰?shù)直接暴露在URL上艘款,所以不能用來傳遞敏感信息持际。
  • GET參數(shù)通過URL傳遞沃琅,POST放在Request body中。

get 會(huì)產(chǎn)生一個(gè) tcp 數(shù)據(jù)包蜘欲,post 兩個(gè)益眉。具體就是:

  • get 請求時(shí),瀏覽器會(huì)把 headers 和 data 一起發(fā)送出去姥份,服務(wù)器響應(yīng) 200(返回?cái)?shù)據(jù))
  • post 請求時(shí)郭脂,瀏覽器先發(fā)送 headers,服務(wù)器響應(yīng) 100 continue澈歉, 瀏覽器再發(fā)送 data展鸡,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù))

4. 服務(wù)器處理請求并返回 HTTP 報(bào)文

格式:

協(xié)議/版本號(hào) 狀態(tài)碼 狀態(tài)解釋
Key1: value1
Key2: value2
Content-Length: n
Content-Type: text/html

要下載的內(nèi)容

可以看到,響應(yīng)的格式和請求格式基本一致埃难。
注意:并不是所有響應(yīng)報(bào)文都有響應(yīng)數(shù)據(jù)莹弊。

狀態(tài)碼是服務(wù)器對瀏覽器說的話,規(guī)則如下:

1xx:指示信息–表示請求已接收涡尘,繼續(xù)處理忍弛。
2xx:成功–表示請求已被成功接收、理解考抄、接受细疚。
3xx:重定向–要完成請求必須進(jìn)行更進(jìn)一步的操作。
4xx:客戶端錯(cuò)誤–請求有語法錯(cuò)誤或請求無法實(shí)現(xiàn)川梅。
5xx:服務(wù)器端錯(cuò)誤–服務(wù)器未能實(shí)現(xiàn)合法的請求疯兼。

5. 瀏覽器解析渲染頁面

瀏覽器內(nèi)核拿到內(nèi)容后然遏,渲染步驟大致可以分為以下幾步:

  1. 解析 HTML,構(gòu)建 DOM 樹
  2. 解析 CSS吧彪,生成 CSS 規(guī)則樹
  3. 合并 DOM 樹和 CSS 規(guī)則啦鸣,生成 render 樹
  4. 布局 render 樹(Layout/reflow),負(fù)責(zé)各元素尺寸来氧、位置的計(jì)算
  5. 繪制 render 樹(paint)诫给,繪制頁面像素信息
  6. 瀏覽器會(huì)將各層的信息發(fā)送給 GPU,GPU會(huì)將各層合成(composite)啦扬,顯示在屏幕上

6. 斷開連接:TCP 四次揮手

當(dāng)數(shù)據(jù)傳送完畢中狂,需要斷開 tcp 連接,此時(shí)發(fā)起 tcp 四次揮手扑毡。

  1. 發(fā)起方向被動(dòng)方發(fā)送報(bào)文胃榕,F(xiàn)in、Ack瞄摊、Seq勋又,表示已經(jīng)沒有數(shù)據(jù)傳輸了。并進(jìn)入 FIN_WAIT_1 狀態(tài)换帜。(第一次揮手:由瀏覽器發(fā)起的楔壤,發(fā)送給服務(wù)器,我請求報(bào)文發(fā)送完了惯驼,你準(zhǔn)備關(guān)閉吧)
  2. 被動(dòng)方發(fā)送報(bào)文蹲嚣,Ack、Seq祟牲,表示同意關(guān)閉請求隙畜。此時(shí)主機(jī)發(fā)起方進(jìn)入 FIN_WAIT_2 狀態(tài)。(第二次揮手:由服務(wù)器發(fā)起的说贝,告訴瀏覽器议惰,我請求報(bào)文接受完了,我準(zhǔn)備關(guān)閉了乡恕,你也準(zhǔn)備吧)
  3. 被動(dòng)方向發(fā)起方發(fā)送報(bào)文段言询,F(xiàn)in、Ack几颜、Seq倍试,請求關(guān)閉連接。并進(jìn)入 LAST_ACK 狀態(tài)蛋哭。(第三次揮手:由服務(wù)器發(fā)起县习,告訴瀏覽器,我響應(yīng)報(bào)文發(fā)送完了,你準(zhǔn)備關(guān)閉吧)
  4. 發(fā)起方向被動(dòng)方發(fā)送報(bào)文段躁愿,Ack叛本、Seq。然后進(jìn)入等待 TIME_WAIT 狀態(tài)彤钟。被動(dòng)方收到發(fā)起方的報(bào)文段以后關(guān)閉連接来候。發(fā)起方等待一定時(shí)間未收到回復(fù),則正常關(guān)閉逸雹。(第四次揮手:由瀏覽器發(fā)起营搅,告訴服務(wù)器,我響應(yīng)報(bào)文接受完了梆砸,我準(zhǔn)備關(guān)閉了转质,你也準(zhǔn)備吧)

參考:

以下是根據(jù)大佬梳理的需要展開的知識(shí)休蟹,以后填坑。

主體流程:

  1. 從瀏覽器接收url到開啟網(wǎng)絡(luò)請求線程(這一部分可以展開瀏覽器的機(jī)制以及進(jìn)程與線程之間的關(guān)系)
  2. 開啟網(wǎng)絡(luò)線程到發(fā)出一個(gè)完整的http請求(這一部分涉及到dns查詢日矫,tcp/ip請求赂弓,五層因特網(wǎng)協(xié)議棧等知識(shí))
  3. 從服務(wù)器接收到請求到對應(yīng)后臺(tái)接收到請求(這一部分可能涉及到負(fù)載均衡,安全攔截以及后臺(tái)內(nèi)部的處理等等)
  4. 后臺(tái)和前臺(tái)的http交互(這一部分包括http頭部哪轿、響應(yīng)碼盈魁、報(bào)文結(jié)構(gòu)、cookie等知識(shí)缔逛,可以提下靜態(tài)資源的cookie優(yōu)化备埃,以及編碼解碼姓惑,如gzip壓縮等)
  5. 單獨(dú)拎出來的緩存問題褐奴,http的緩存(這部分包括http緩存頭部,etag于毙,catch-control等)
  6. 瀏覽器接收到http數(shù)據(jù)包后的解析流程(解析html-詞法分析然后解析成dom樹敦冬、解析css生成css規(guī)則樹、合并成render樹唯沮,然后layout脖旱、painting渲染、復(fù)合圖層的合成介蛉、GPU繪制萌庆、外鏈資源的處理、loaded和domcontentloaded等)
  7. CSS的可視化格式模型(元素的渲染規(guī)則币旧,如包含塊践险,控制框,BFC,IFC等概念)
  8. JS引擎解析過程(JS的解釋階段巍虫,預(yù)處理階段彭则,執(zhí)行階段生成執(zhí)行上下文,VO占遥,作用域鏈俯抖、回收機(jī)制等等)
  9. 其它(可以拓展不同的知識(shí)模塊,如跨域瓦胎,web安全芬萍,hybrid模式等等內(nèi)容)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市搔啊,隨后出現(xiàn)的幾起案子担忧,更是在濱河造成了極大的恐慌,老刑警劉巖坯癣,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓶盛,死亡現(xiàn)場離奇詭異,居然都是意外死亡示罗,警方通過查閱死者的電腦和手機(jī)惩猫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚜点,“玉大人轧房,你說我怎么就攤上這事∩芑妫” “怎么了奶镶?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長陪拘。 經(jīng)常有香客問我厂镇,道長,這世上最難降的妖魔是什么左刽? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任捺信,我火速辦了婚禮,結(jié)果婚禮上欠痴,老公的妹妹穿的比我還像新娘迄靠。我一直安慰自己,他們只是感情好喇辽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布掌挚。 她就那樣靜靜地躺著,像睡著了一般菩咨。 火紅的嫁衣襯著肌膚如雪吠式。 梳的紋絲不亂的頭發(fā)上舅世,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音奇徒,去河邊找鬼雏亚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛摩钙,可吹牛的內(nèi)容都是我干的罢低。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胖笛,長吁一口氣:“原來是場噩夢啊……” “哼网持!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起长踊,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤功舀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后身弊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辟汰,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年阱佛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帖汞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凑术,死狀恐怖翩蘸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淮逊,我是刑警寧澤催首,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站泄鹏,受9級特大地震影響郎任,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜命满,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一涝滴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胶台,春花似錦、人聲如沸杂抽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缩麸。三九已至铸磅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阅仔。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工吹散, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人八酒。 一個(gè)月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓空民,卻偏偏與公主長得像,于是被迫代替她去往敵國和親羞迷。 傳聞我的和親對象是個(gè)殘疾皇子界轩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353