1. 前言
雖然計算機(jī)網(wǎng)絡(luò)是后端開發(fā)過程中必須要接觸的模塊,但是計算機(jī)網(wǎng)絡(luò)相關(guān)的面試題大多都偏向理論,為了更好的理解在開發(fā)過程中計算機(jī)網(wǎng)絡(luò)交互的作用,本小節(jié)會介紹一道網(wǎng)絡(luò)相關(guān)的高頻整合題目。
2. 在瀏覽器輸入了一個 URL 后發(fā)生了什么
面試官提問: 當(dāng)你在瀏覽器中輸入了一個網(wǎng)址URL,例如http://idcbgp.cn
并且按下回車到頁面展示內(nèi)容的這個過程,發(fā)生了什么?可以從瀏覽器、服務(wù)器、計算機(jī)網(wǎng)絡(luò)相關(guān)嘗試分析。
2.1 DNS域名解析
題目解析:輸入 URL 之后,瀏覽器做的第一件事情就是 DNS 域名解析。
在之前的小節(jié),我們分析五層網(wǎng)絡(luò)模型時就知道了數(shù)據(jù)鏈路層傳輸?shù)膸?,并不是通過字符串 “http://imooc.com” 尋找到目標(biāo)主機(jī),而是通過 MAC 地址找到目標(biāo)主機(jī)的硬件地址,要通過 ARP 協(xié)議解析獲取 MAC 地址,我們需要目標(biāo)主機(jī)的 IP 地址,所以問題是如何通過域名獲取對應(yīng) IP 地址。
所以第一個步驟,我們需要獲取域名對應(yīng)的IP地址,會經(jīng)過以下幾個步驟:
(1)訪問 Hosts 文件
瀏覽器會首先查看本機(jī)的 Hosts 文件,是否已經(jīng)存在映射關(guān)系。
Hosts文件是用來存儲常用的域名和對應(yīng)IP地址關(guān)系的關(guān)聯(lián)文件,例如在Hosts文件中存儲了"idcbgp.cn" -> "204.1.17.89"
,那么我們不需要訪問DNS服務(wù)器即可獲取百度域名對應(yīng)的IP地址。
(2)訪問本地緩存
如果 Hosts 文件中不存在映射關(guān)系,瀏覽器(例如Chrome)會再查看瀏覽器本地的緩存,是否存在映射關(guān)系。
(3)訪問 DNS 服務(wù)器
?
DNS 解析的過程簡單來看,是從"我的電腦"傳輸域名"idcbgp.cn"
到 DNS 服務(wù)器,解析生成IP后返回給"我的電腦"。但是面試官一般會接著詢問 DNS 解析的詳細(xì)過程,依次考察候選人的知識深度。
步驟(1):瀏覽器會向本地 DNS 服務(wù)器發(fā)送域名報文。
步驟(2):本地 DNS 接收報文之后,會將請求轉(zhuǎn)發(fā)到根 DNS 服務(wù)器。
步驟(3):根 DNS 服務(wù)器通過".com"
后綴返回 com 頂級域名服務(wù)器的IP地址205.0.1.2
。
步驟(4):本地 DNS 服務(wù)器帶著域名訪問IP:205.0.1.2
頂級域名服務(wù)器。
步驟(5):com 頂級域名服務(wù)器根據(jù)后綴"imooc.com"
,返回 IP 地址206.0.1.3
。
步驟(6):本地 DNS 服務(wù)器帶著域名訪問IP206.0.1.3
二級域名服務(wù)器。
步驟(7):二級域名服務(wù)器通過idcbgp.cn
查詢到了域名對應(yīng)的實際IP地址210.1.17.89
,返回給本地 DNS 服務(wù)器。
步驟(8):本地 DNS 服務(wù)器透傳IP210.1.17.89
返回給"我的電腦"。
2.2 建立 TCP 連接
在經(jīng)過 DNS 解析之后,瀏覽器已經(jīng)獲取了對應(yīng)網(wǎng)站的 IP 地址,通過三次握手連接到網(wǎng)站服務(wù)器,這個步驟中,我們可以給面試官畫出簡化后的三次握手過程:
(1)客戶端發(fā)送一個帶有 SYN 標(biāo)記位的數(shù)據(jù)包(syn=J)到服務(wù)器,然后進(jìn)入 SYN_SENT 狀態(tài);
(2)服務(wù)器收到 SYN 包,需要確認(rèn)客戶端的 SYN(賦值ack=J+1),然后自己也發(fā)送一個 SYN 包(syn=K),服務(wù)器進(jìn)入 SYN_RCVD 狀態(tài);
(3)客戶端收到服務(wù)器的 SYN+ACK 包,向服務(wù)器端發(fā)送確認(rèn)包,即ack=K+1,發(fā)送完成之后,兩邊都進(jìn)入 ESTABLISHED 建立連接狀態(tài)。
2.3 發(fā)送 HTTP 請求
TCP 三次握手之后,客戶端和服務(wù)器端成功建立了連接,之后瀏覽器會向服務(wù)器特定端口發(fā)送HTTP請求。
以 Chrome 瀏覽器為例,按下 F12 即可進(jìn)入開發(fā)者模式,Network 一欄查看HTTP請求的具體報文。
一個 HTTP 報文由請求行(Request Line)、請求頭部(Request Headers)、空行(Blank Line)以及請求體(Request Body)構(gòu)成,請求行中規(guī)定了請求方法、URI 以及 HTTP 的版本,關(guān)于每個字段的詳細(xì)解釋,之前的小節(jié)已經(jīng)進(jìn)行了闡述。
2.4 服務(wù)器端解析請求
當(dāng)一個 HTTP 請求打進(jìn)服務(wù)器之后,一般的流程是:網(wǎng)關(guān)層(例如Ngnix)最先獲取請求,然后路由轉(zhuǎn)發(fā)到具體的Web服務(wù),經(jīng)過一段業(yè)務(wù)邏輯之后,可能還會查詢數(shù)據(jù)庫,最后將處理的結(jié)果返回給瀏覽器客戶端。
對于后端開發(fā)程序員來說,日常的工作就集中在服務(wù)器端,特別是流程圖中的"Web業(yè)務(wù)服務(wù)"這塊,例如基于 Spring 框架、Django 框架或者ThinkPHP 框架進(jìn)行業(yè)務(wù)邏輯開發(fā)和上線。
2.5 返回 HTTP 響應(yīng)
服務(wù)器端處理業(yè)務(wù)結(jié)果之后,也要返回 HTTP 響應(yīng),HTTP 響應(yīng)由狀態(tài)行(Status Line)、響應(yīng)頭部(Response Headers)、空行(Blank Line)以及響應(yīng)體(Response Body)構(gòu)成,關(guān)于每個部分的細(xì)節(jié)也不再贅述。需要特別注意的是,響應(yīng)體中的各種錯誤碼定義:
狀態(tài)類型 | 代表狀態(tài)碼和含義 | 說明 |
---|---|---|
1xx | 100 Continue | 服務(wù)器收到了客戶端的請求行和頭部信息,告訴 客戶端繼續(xù)發(fā)送數(shù)據(jù)部分。 |
2xx | 200 OK | 請求成功 |
3xx | 301 Moved Permanently | 資源被轉(zhuǎn)移了,請求將被重定向 |
4xx | 404 Not Found | 資源沒找到 |
5xx | 500 Internal Server Error | 服務(wù)器內(nèi)部錯誤 |
2.6 TCP四次揮手
當(dāng)瀏覽器獲取了域名對應(yīng)的頁面信息,為了避免服務(wù)器和客戶端雙方的資源損耗,客戶端會請求斷開 TCP 連接,和三次握手的過程相似,TCP 四次揮手的過程可以總結(jié)為:
(1)第一次請求:客戶端請求斷開FIN,攜帶信息seq=u;
(2)第二次請求:服務(wù)器確認(rèn)客戶端的斷開請求 ACK ,攜帶信息ack=u+1,seq=v;
(3)第三次請求:服務(wù)器請求斷開 FIN ,攜帶信息seq=w,ACK,ack=u+1;
(4)第四次請求:客戶端確認(rèn)服務(wù)器的斷開 ACK ,攜帶信息ack=w+1,seq=u+1。
?
2.7 瀏覽器解析 HTML
服務(wù)器返回給客戶端的是 HTML 以及 CSS、Javascript 代碼,要展示為靜態(tài)頁面,還需要經(jīng)過瀏覽器的解析行為。
瀏覽器內(nèi)核引擎解析 HTML 文檔并且將標(biāo)簽轉(zhuǎn)換為 DOM(Document Object Model,文檔對象模型)樹的 DOM 節(jié)點,不同瀏覽器的渲染解析流程大同小異。
同時,瀏覽器內(nèi)核引擎還會解析 CSS 生成 CSS 規(guī)則樹,按照從右到左的順序讀取選擇器。
另外,在瀏覽器中還有個"JS腳本解析器",解析 HTML 和 CSS 是多線程同時執(zhí)行的,CSS 解析失敗不會影響 HTML 內(nèi)容的解析,但是如果 JS 腳本解析過程中觸發(fā)了異常,會直接終止 HTML 內(nèi)容的解析。關(guān)于更詳細(xì)的解析動作,作為后端開發(fā),我們不需要了解太多,這塊也不會作為面試考察的內(nèi)容。
3.小結(jié)
本節(jié)中和大家講解了"我們在瀏覽器中輸入一個URL,具體發(fā)生了什么",整個過程中分析了應(yīng)用層(HTTP、DNS)、傳輸層(TCP)、網(wǎng)絡(luò)層(IP)等網(wǎng)絡(luò)分層的各個協(xié)議的作用,也對服務(wù)器解析HTTP的基本流程進(jìn)行了闡述,本小節(jié)需要大家掌握訪問 URL 時每個步驟的基本功能,能夠通過對調(diào)用鏈路的分析,向面試官展示自己的計算機(jī)網(wǎng)絡(luò)功底。