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)行。
解析過程:
- 瀏覽器搜索自己的 DNS 緩存(維護(hù)一張域名與 IP 地址的對應(yīng)表)稽穆;
- 搜索操作系統(tǒng)中的 DNS 緩存(維護(hù)一張域名與 IP 地址的對應(yīng)表)冠王;
- 搜索操作系統(tǒng)的 hosts 文件( Windows 環(huán)境下,維護(hù)一張域名與 IP 地址的對應(yīng)表)舌镶;
- 操作系統(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 解析請求鸣奔;
- LDNS 向 Root Name Server (根域名服務(wù)器,其雖然沒有每個(gè)域名的的具體信息磨镶,但存儲(chǔ)了負(fù)責(zé)每個(gè)域溃蔫,如 com健提、net琳猫、org等的解析的頂級域名服務(wù)器的地址)發(fā)起請求,此處私痹,Root Name Server 返回 com 域的頂級域名服務(wù)器的地址脐嫂;
- LDNS 向 com 域的頂級域名服務(wù)器發(fā)起請求,返回 baidu.com 域名服務(wù)器地址紊遵;
- LDNS 向 baidu.com 域名服務(wù)器發(fā)起請求账千,得到 www.baidu.com 的 IP 地址;
- LDNS 將得到的 IP 地址返回給操作系統(tǒng)暗膜,同時(shí)自己也將 IP 地址緩存起來匀奏;
- 操作系統(tǒng)將 IP 地址返回給瀏覽器,同時(shí)自己也將 IP 地址緩存起來学搜;
- 至此娃善,瀏覽器已經(jīng)得到了域名對應(yīng)的 IP 地址。
2. TCP 連接:TCP 三次握手
知道了服務(wù)器的 IP 地址瑞佩,下面便開始與服務(wù)器建立連接了聚磺。
通信連接的建立需要經(jīng)歷以下三個(gè)過程:
- 主機(jī)向服務(wù)器發(fā)送一個(gè)建立連接的請求
- 服務(wù)器接到請求后發(fā)送同意連接的信號(hào)
- 主機(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)容后然遏,渲染步驟大致可以分為以下幾步:
- 解析 HTML,構(gòu)建 DOM 樹
- 解析 CSS吧彪,生成 CSS 規(guī)則樹
- 合并 DOM 樹和 CSS 規(guī)則啦鸣,生成 render 樹
- 布局 render 樹(Layout/reflow),負(fù)責(zé)各元素尺寸来氧、位置的計(jì)算
- 繪制 render 樹(paint)诫给,繪制頁面像素信息
- 瀏覽器會(huì)將各層的信息發(fā)送給 GPU,GPU會(huì)將各層合成(composite)啦扬,顯示在屏幕上
6. 斷開連接:TCP 四次揮手
當(dāng)數(shù)據(jù)傳送完畢中狂,需要斷開 tcp 連接,此時(shí)發(fā)起 tcp 四次揮手扑毡。
- 發(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)閉吧)
- 被動(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)備吧)
- 被動(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)閉吧)
- 發(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)備吧)
參考:
- 從輸入U(xiǎn)RL到頁面加載的過程?如何由一道題完善自己的前端知識(shí)體系帖世!
- https://segmentfault.com/a/1190000006879700#articleHeader3
- https://zhuanlan.zhihu.com/p/23155051
- http://web.jobbole.com/95465/
- http://www.reibang.com/p/d616d887953a
以下是根據(jù)大佬梳理的需要展開的知識(shí)休蟹,以后填坑。
主體流程:
- 從瀏覽器接收url到開啟網(wǎng)絡(luò)請求線程(這一部分可以展開瀏覽器的機(jī)制以及進(jìn)程與線程之間的關(guān)系)
- 開啟網(wǎng)絡(luò)線程到發(fā)出一個(gè)完整的http請求(這一部分涉及到dns查詢日矫,tcp/ip請求赂弓,五層因特網(wǎng)協(xié)議棧等知識(shí))
- 從服務(wù)器接收到請求到對應(yīng)后臺(tái)接收到請求(這一部分可能涉及到負(fù)載均衡,安全攔截以及后臺(tái)內(nèi)部的處理等等)
- 后臺(tái)和前臺(tái)的http交互(這一部分包括http頭部哪轿、響應(yīng)碼盈魁、報(bào)文結(jié)構(gòu)、cookie等知識(shí)缔逛,可以提下靜態(tài)資源的cookie優(yōu)化备埃,以及編碼解碼姓惑,如gzip壓縮等)
- 單獨(dú)拎出來的緩存問題褐奴,http的緩存(這部分包括http緩存頭部,etag于毙,catch-control等)
- 瀏覽器接收到http數(shù)據(jù)包后的解析流程(解析html-詞法分析然后解析成dom樹敦冬、解析css生成css規(guī)則樹、合并成render樹唯沮,然后layout脖旱、painting渲染、復(fù)合圖層的合成介蛉、GPU繪制萌庆、外鏈資源的處理、loaded和domcontentloaded等)
- CSS的可視化格式模型(元素的渲染規(guī)則币旧,如包含塊践险,控制框,BFC,IFC等概念)
- JS引擎解析過程(JS的解釋階段巍虫,預(yù)處理階段彭则,執(zhí)行階段生成執(zhí)行上下文,VO占遥,作用域鏈俯抖、回收機(jī)制等等)
- 其它(可以拓展不同的知識(shí)模塊,如跨域瓦胎,web安全芬萍,hybrid模式等等內(nèi)容)