面試官:輸入U(xiǎn)RL之后會(huì)執(zhí)行什么流程?
?在瀏覽器中輸入 URL 之后,它會(huì)執(zhí)行以下幾個(gè)流程:
執(zhí)行 DNS 域名解析;
封裝 HTTP 請(qǐng)求數(shù)據(jù)包;
封裝 TCP 請(qǐng)求數(shù)據(jù)包;
建立 TCP 連接(3 次握手);
參數(shù)從客戶(hù)端傳遞到服務(wù)器端;
服務(wù)器端得到客戶(hù)端參數(shù)之后,進(jìn)行相應(yīng)的業(yè)務(wù)處理,再將結(jié)果封裝成 HTTP 包,返回給客戶(hù)端;
服務(wù)器端和客戶(hù)端的交互完成,斷開(kāi) TCP 連接(4 次揮手);
瀏覽器通過(guò)自身執(zhí)行引擎,渲染并展示最終結(jié)果給用戶(hù)。
1.DNS 域名解析
在網(wǎng)絡(luò)中定位是依靠 IP 進(jìn)行身份定位的,所以 URL 訪問(wèn)的第一步便是先要得到服務(wù)器端的 IP 地址。而得到服務(wù)器的 IP 地址需要使用 DNS(Domain Name System,域名系統(tǒng))域名解析,DNS 域名解析就是通過(guò) URL 找到與之相對(duì)應(yīng)的 IP 地址。
PS:為什么不直接訪問(wèn) IP 地址來(lái)請(qǐng)求服務(wù)器?因?yàn)?IP 地址很長(zhǎng),不方便記憶,而 URL 地址好記很多,所以會(huì)使用 URL 來(lái)替代 IP 地址,而 URL 就像 IP 地址的別名一樣,用它可以定位到相應(yīng)的 IP 地址。
DNS 域名解析的大致流程如下:
- 先檢查瀏覽器中的 DNS 緩存,如果瀏覽器中有對(duì)應(yīng)的記錄會(huì)直接使用,并完成解析;
- 如果瀏覽器沒(méi)有緩存,那就去查詢(xún)操作系統(tǒng)的緩存,如果查詢(xún)到記錄就可以直接返回 IP 地址,完成解析;
- 如果操作系統(tǒng)沒(méi)有 DNS 緩存,就會(huì)去查看本地 host 文件,Windows 操作系統(tǒng)下,host 文件一般位于 "C:\Windows\System32\drivers\etc\hosts",如果 host 文件有記錄則直接使用;
- 如果本地 host 文件沒(méi)有相應(yīng)的記錄,會(huì)請(qǐng)求本地 DNS 服務(wù)器,本地 DNS 服務(wù)器一般是由本地網(wǎng)絡(luò)服務(wù)商如移動(dòng)、電信提供。通常情況下可通過(guò) DHCP 自動(dòng)分配,當(dāng)然你也可以自己手動(dòng)配置。目前用的比較多的是谷歌提供的公用 DNS 是 8.8.8.8 和國(guó)內(nèi)的公用 DNS 是 114.114.114.114。
- 如果本地 DNS 服務(wù)器沒(méi)有相應(yīng)的記錄,就會(huì)去根域名服務(wù)器查詢(xún)了,目前全球一共有 13 組根域名服務(wù)器(這里并不是指 13 臺(tái)服務(wù)器,是指 13 個(gè) ip 地址,按字母 a-m 編號(hào)),為了能更高效完成全球所有域名的解析請(qǐng)求,根域名服務(wù)器本身并不會(huì)直接去解析域名,而是會(huì)把不同的解析請(qǐng)求分配給下面的其他服務(wù)器去完成,下面是 DNS 域名系統(tǒng)的樹(shù)狀結(jié)構(gòu)圖:
2.封裝 HTTP 請(qǐng)求數(shù)據(jù)包
一個(gè) HTTP 請(qǐng)求對(duì)象包含 4 部分內(nèi)容:
- 請(qǐng)求行
- 請(qǐng)求報(bào)頭
- 空行
- 請(qǐng)求正文
它的基本格式如下:
在得到了服務(wù)器 IP 之后,緊接著會(huì)將本地的請(qǐng)求封裝成一個(gè) HTTP 數(shù)據(jù)包,如上圖所示。
3.封裝 TCP 請(qǐng)求數(shù)據(jù)包
HTTP 底層是依賴(lài) TCP/IP 協(xié)議實(shí)現(xiàn)的,所以在底層數(shù)據(jù)傳輸時(shí),會(huì)將 HTTP 請(qǐng)求包進(jìn)一步封裝成 TCP 數(shù)據(jù)包。
4.建立 TCP 連接(3 次握手)
HTTP 通訊的基礎(chǔ)是 TCP 連接,TCP 連接需要 3 次握手,3 次握手就是為了驗(yàn)證客戶(hù)端的發(fā)送能力和接收能力,以及服務(wù)器端的發(fā)生能力和接收能力,就像打電話(huà)一樣,通常的通話(huà)是這樣開(kāi)頭的:
- _我_:喂,能聽(tīng)到嗎?
- _對(duì)方_:能聽(tīng)到,你能聽(tīng)到嗎?(證明了對(duì)方的接收能力和我的發(fā)送能力)
- _我_:我也能聽(tīng)到,咱們聊正事吧。(證明了對(duì)方的發(fā)送能力和我的接收能力)
經(jīng)過(guò)以上 3 次握手就可以證明客戶(hù)端的發(fā)送能力和接收能力,以及服務(wù)器端的發(fā)生能力和接收能力,這樣就可以正式開(kāi)始通訊了。
5.服務(wù)器端獲取到 HTTP 請(qǐng)求參數(shù)
數(shù)據(jù)在經(jīng)過(guò) TCP 傳到到服務(wù)器程序之后,又會(huì)將 TCP 的數(shù)據(jù)包轉(zhuǎn)換成 HTTP 數(shù)據(jù)包(這一切都是 TCP/IP 協(xié)議的功勞),這樣服務(wù)器端就可以得到客戶(hù)端發(fā)送的請(qǐng)求數(shù)據(jù)了。
6.服務(wù)器端執(zhí)行業(yè)務(wù)處理,并返回?cái)?shù)據(jù)
服務(wù)器端拿到了客戶(hù)端的請(qǐng)求參數(shù)之后,會(huì)進(jìn)行相應(yīng)的業(yè)務(wù)處理,處理完成之后,再將處理的結(jié)果返回給客戶(hù)端。返回的流程和發(fā)送的流程類(lèi)似,先將結(jié)果封裝成 HTTP 數(shù)據(jù)包,HTTP 數(shù)據(jù)包可分為以下 4 部分:
- 狀態(tài)行
- 響應(yīng)報(bào)頭
- 空行
- 響應(yīng)正文
它的基本格式如下:
狀態(tài)行用于描述服務(wù)器的返回狀態(tài),它由 3 部分組成:
- HTTP 版本號(hào),如 HTTP/1.1;
- 狀態(tài)碼,如 200;
- 狀態(tài)描述信息,如 OK;
常見(jiàn)的狀態(tài)碼有以下幾個(gè):
- 200:返回成功;
- 301:永久重定向;
- 302:臨時(shí)重定向;
- 404:未找到頁(yè)面;
- 500:服務(wù)器程序出錯(cuò)。
響應(yīng)正文就是返回給客戶(hù)端的所有數(shù)據(jù)。
7.斷開(kāi) TCP 連接(4 次揮手)
在經(jīng)過(guò)一次請(qǐng)求和一次響應(yīng)之后,客戶(hù)端和服務(wù)器的“交流”就結(jié)束了,此時(shí)就可以執(zhí)行 TCP 連接斷開(kāi)的流程了,它需要 4 次揮手:
- _客戶(hù)端_:咱們分手吧;
- _服務(wù)器端_:好的,讓我準(zhǔn)備一下。
- _服務(wù)器端_:我準(zhǔn)備好了,分手吧。
- _客戶(hù)端_:好的。
經(jīng)過(guò)了以上流程之后,TCP 的連接就斷開(kāi)了。
8.瀏覽器渲染并展示結(jié)果
經(jīng)過(guò) TCP 交互之后,客戶(hù)端也得到了服務(wù)器端返回的數(shù)據(jù),然后使用瀏覽器自身的執(zhí)行引擎,將最終的結(jié)果展示給用戶(hù),整個(gè)執(zhí)行流程就結(jié)束了。
參考 & 鳴謝
zhuanlan.zhihu.com/p/58108010?