在瀏覽器輸入 URL 地址回車后,發(fā)生了什么?這里簡單概述一下。
總體流程圖如下:

-
URL 解析
瀏覽器首先對 URL 解析,解析出協(xié)議、域名、端口、資源路徑、參數(shù)等。
image.png - DNS 域名解析
一般而言,域名比 IP 地址更好記,因而我們更習(xí)慣在瀏覽器輸入域名而不是 IP,而計(jì)算機(jī)網(wǎng)絡(luò)通信所識別的計(jì)算機(jī)標(biāo)識是 IP 地址,因而首先需要將一個(gè)域名轉(zhuǎn)化為相應(yīng)的 IP 地址,這就是 DNS 協(xié)議所要做的事。
DNS 就像我們手機(jī)中的通訊錄一樣,通訊錄中備注的是對方的姓名(類似于域名),但是打電話的時(shí)候?qū)嶋H需要的是電話號碼(類似于 IP 地址),利用通訊錄將一個(gè)姓名轉(zhuǎn)化為對應(yīng)的電話號碼。

- 建立 TCP 連接
一般在瀏覽器輸入 URL,應(yīng)用層的協(xié)議為 HTTP/HTTPS,其需要的是可靠的服務(wù),所使用的傳輸層協(xié)議為 TCP。
通過域名解析后,瀏覽器獲得了服務(wù)器的 IP,則向服務(wù)器發(fā)起 TCP 連接,這時(shí)候就會發(fā)生三次握手行為。(具體參考昨天的三次握手)
- 發(fā)送 HTTP 請求
當(dāng)瀏覽器與服務(wù)器建立連接后,就可以進(jìn)行數(shù)據(jù)通信過程,瀏覽器會給服務(wù)器發(fā)送一個(gè) HTTP 請求報(bào)文,請求報(bào)文包括請求行、請求頭、請求空行和請求體。在請求行中會指定方法、資源路徑以及 HTTP 版本,其中資源路徑是指定所要操作資源在服務(wù)器中的位置,而方法是指定要對這個(gè)資源做什么樣的操作。
從瀏覽器輸入 URL,資源路徑在第一步就已經(jīng)被解析出來了,而方法為 GET,表明要獲取資源,相當(dāng)于增刪改查中的查詢。
HTTP響應(yīng)也由四個(gè)部分組成,分別是狀態(tài)行、消息報(bào)頭、空行和響應(yīng)正文。
狀態(tài)行:由HTTP協(xié)議版本號, 狀態(tài)碼, 狀態(tài)消息三部分組成。
狀態(tài)碼規(guī)律:
? 1xx:指示信息–表示請求已接收,繼續(xù)處理。
? 2xx:成功–表示請求已被成功接收、理解、接受。
? 3xx:重定向–要完成請求必須進(jìn)行更進(jìn)一步的操作。
? 4xx:客戶端錯(cuò)誤–請求有語法錯(cuò)誤或請求無法實(shí)現(xiàn)。
? 5xx:服務(wù)器端錯(cuò)誤–服務(wù)器未能實(shí)現(xiàn)合法的請求。
平時(shí)遇到比較常見的狀態(tài)碼有:200, 301, 302, 304, 401, 403, 404, 500
200 (OK): 找到資源并成功返回?cái)?shù)據(jù)。
301:永久重定向。
302:臨時(shí)重定向。
304 (NOT MODIFIED): 該資源在上次請求之后沒有任何修改。這通常用于瀏覽器的緩存機(jī)制。
401 (UNAUTHORIZED): 未經(jīng)授權(quán)。這通常會使得瀏覽器要求用戶輸入用戶名和密碼,以登錄到服務(wù)器。
403 (FORBIDDEN): 沒有權(quán)限。這通常是在401之后輸入了不正確的用戶名或密碼。
404 (NOT FOUND): 在指定的位置不存在所申請的資源。找不到頁面
500:服務(wù)器內(nèi)部出錯(cuò)
- 服務(wù)器對請求進(jìn)行處理并做出響應(yīng)
當(dāng)收到瀏覽器發(fā)送的請求報(bào)文后,服務(wù)器會對此請求報(bào)文進(jìn)行相應(yīng)的處理,并返回響應(yīng)報(bào)文給瀏覽器。比如請求報(bào)文想要獲?。℅ET) index.html 這個(gè)文件,那么服務(wù)器就會找到 index.html 文件,然后將此文件作為響應(yīng)報(bào)文中的響應(yīng)體發(fā)送給瀏覽器。
響應(yīng)報(bào)文包括響應(yīng)行、響應(yīng)頭、響應(yīng)空行和響應(yīng)體。在響應(yīng)行中會指定 HTTP 版本、狀態(tài)碼和對狀態(tài)碼的解釋信息,比如 HTTP/1.1 200 OK ,其中 200 是響應(yīng)碼,指請求被正常處理,也就是成功 OK 的意思。
- 瀏覽器解析渲染頁面
瀏覽器收到服務(wù)器的響應(yīng)報(bào)文后,從響應(yīng)體中得到相應(yīng)資源,如 HTML 文件、圖片、視頻等,并進(jìn)行渲染,然后將結(jié)果呈現(xiàn)給用戶。
瀏覽器在解析過程中,如果遇到請求外部資源時(shí),如圖像,iconfont,JS等。瀏覽器將重復(fù)1-5過程下載該資源。請求過程是異步的,并不會影響HTML文檔進(jìn)行加載,但是當(dāng)文檔加載過程中遇到JS文件,HTML文檔會掛起渲染過程,這是因?yàn)殇秩疽婧蚸s引擎是互斥的。要等到文檔中JS文件加載執(zhí)行完畢,才會繼續(xù)HTML的渲染過程。原因邊渲染頁面邊執(zhí)行js時(shí)js 有可能修改DOM結(jié)構(gòu),所以應(yīng)該等js執(zhí)行完畢再繼續(xù)頁面的渲染,否則起初渲染好的頁面結(jié)構(gòu)可能被js的解析執(zhí)行破壞,所以js腳本一般放在頁面最底部。CSS文件的加載不影響JS文件的加載,但是卻影響JS文件的執(zhí)行。JS代碼執(zhí)行前瀏覽器必須保證CSS文件已經(jīng)下載并加載完畢。
- 斷開 TCP 連接
當(dāng)數(shù)據(jù)完成請求到返回的過程之后,根據(jù)請求/相應(yīng)頭中 Connection 的 Keep-Alive 屬性可以選擇是否斷開 TCP 連接,如果不需要再進(jìn)行數(shù)據(jù)通信,即可以關(guān)閉連接,此時(shí)則會發(fā)生四次揮手行為。(具體參考昨天的四次揮手)
注意:
a.瀏覽器為了提升性能,在 URL 解析之后,實(shí)際會先查詢是否有緩存,如果緩存命中,則直接返回緩存資源。
b.如果是 HTTPS 協(xié)議,在建立 TCP 連接之后,還需要進(jìn)行 SSL/TLS 握手過程,以協(xié)商出一個(gè)會話密鑰,用于消息加密,提升安全性。
參考鏈接:https://baijiahao.baidu.com/s?id=1752169952245738551&wfr=spider&for=pc
https://blog.csdn.net/qq_53895518/article/details/137106909
