在地址欄里輸入一個(gè)URL,到這個(gè)頁面呈現(xiàn)出來,中間會(huì)發(fā)生什么?

輸入url后,首先需要找到這個(gè)url域名的服務(wù)器ip,為了尋找這個(gè)ip,瀏覽器首先會(huì)尋找緩存,查看緩存中是否有記錄,緩存的查找記錄為:瀏覽器緩存-》系統(tǒng)緩存-》路由器緩存,緩存中沒有則查找系統(tǒng)的hosts文件中是否有記錄,如果沒有則查詢DNS服務(wù)器,得到服務(wù)器的ip地址后,瀏覽器根據(jù)這個(gè)ip以及相應(yīng)的端口號(hào),構(gòu)造一個(gè)http請求,這個(gè)請求報(bào)文會(huì)包括這次請求的信息,主要是請求方法,請求說明和請求附帶的數(shù)據(jù),并將這個(gè)http請求封裝在一個(gè)tcp包中,這個(gè)tcp包會(huì)依次經(jīng)過傳輸層,網(wǎng)絡(luò)層,數(shù)據(jù)鏈路層,物理層到達(dá)服務(wù)器,服務(wù)器解析這個(gè)請求來作出響應(yīng),返回相應(yīng)的html給瀏覽器,因?yàn)閔tml是一個(gè)樹形結(jié)構(gòu),瀏覽器根據(jù)這個(gè)html來構(gòu)建DOM樹,在dom樹的構(gòu)建過程中如果遇到JS腳本和外部JS連接,則會(huì)停止構(gòu)建DOM樹來執(zhí)行和下載相應(yīng)的代碼,這會(huì)造成阻塞,這就是為什么推薦JS代碼應(yīng)該放在html代碼的后面,之后根據(jù)外部央視,內(nèi)部央視,內(nèi)聯(lián)樣式構(gòu)建一個(gè)CSS對象模型樹CSSOM樹,構(gòu)建完成后和DOM樹合并為渲染樹,這里主要做的是排除非視覺節(jié)點(diǎn),比如script,meta標(biāo)簽和排除display為none的節(jié)點(diǎn),之后進(jìn)行布局,布局主要是確定各個(gè)元素的位置和尺寸,之后是渲染頁面,因?yàn)閔tml文件中會(huì)含有圖片,視頻,音頻等資源,在解析DOM的過程中,遇到這些都會(huì)進(jìn)行并行下載,瀏覽器對每個(gè)域的并行下載數(shù)量有一定的限制,一般是4-6個(gè),當(dāng)然在這些所有的請求中我們還需要關(guān)注的就是緩存,緩存一般通過Cache-Control、Last-Modify、Expires等首部字段控制。 Cache-Control和Expires的區(qū)別在于Cache-Control使用相對時(shí)間,Expires使用的是基于服務(wù)器 端的絕對時(shí)間,因?yàn)榇嬖跁r(shí)差問題,一般采用Cache-Control,在請求這些有設(shè)置了緩存的數(shù)據(jù)時(shí),會(huì)先 查看是否過期,如果沒有過期則直接使用本地緩存,過期則請求并在服務(wù)器校驗(yàn)文件是否修改,如果上一次 響應(yīng)設(shè)置了ETag值會(huì)在這次請求的時(shí)候作為If-None-Match的值交給服務(wù)器校驗(yàn),如果一致,繼續(xù)校驗(yàn) Last-Modified,沒有設(shè)置ETag則直接驗(yàn)證Last-Modified,再?zèng)Q定是否返回304

簡單來說

1.輸入地址,發(fā)送至DNS服務(wù)器,獲取相應(yīng)的域名和web服務(wù)器的IP地址;

2.與web服務(wù)器建立TCP鏈接;

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

4.服務(wù)器響應(yīng)請求,并發(fā)送對應(yīng)的數(shù)據(jù);

5.瀏覽器下載數(shù)據(jù),并解析源文件,渲染頁面,呈現(xiàn)頁面

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容