亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

1. 前言

雖然計算機網絡是后端開發過程中必須要接觸的模塊,但是計算機網絡相關的面試題大多都偏向理論,為了更好的理解在開發過程中計算機網絡交互的作用,本小節會介紹一道網絡相關的高頻整合題目。

2. 在瀏覽器輸入了一個 URL 后發生了什么

面試官提問: 當你在瀏覽器中輸入了一個網址URL,例如http://www.xianlaiwan.cn并且按下回車到頁面展示內容的這個過程,發生了什么?可以從瀏覽器、服務器、計算機網絡相關嘗試分析。

圖片描述

2.1 DNS域名解析

題目解析:輸入 URL 之后,瀏覽器做的第一件事情就是 DNS 域名解析。

在之前的小節,我們分析五層網絡模型時就知道了數據鏈路層傳輸的幀,并不是通過字符串 “http://imooc.com” 尋找到目標主機,而是通過 MAC 地址找到目標主機的硬件地址,要通過 ARP 協議解析獲取 MAC 地址,我們需要目標主機的 IP 地址,所以問題是如何通過域名獲取對應 IP 地址。

所以第一個步驟,我們需要獲取域名對應的IP地址,會經過以下幾個步驟:

(1)訪問 Hosts 文件
瀏覽器會首先查看本機的 Hosts 文件,是否已經存在映射關系。
Hosts文件是用來存儲常用的域名和對應IP地址關系的關聯文件,例如在Hosts文件中存儲了"www.xianlaiwan.cn" -> "204.1.17.89",那么我們不需要訪問DNS服務器即可獲取百度域名對應的IP地址。

(2)訪問本地緩存
如果 Hosts 文件中不存在映射關系,瀏覽器(例如Chrome)會再查看瀏覽器本地的緩存,是否存在映射關系。

(3)訪問 DNS 服務器

圖片描述

?

(圖1:域名到IP的解析模型)

DNS 解析的過程簡單來看,是從"我的電腦"傳輸域名"www.xianlaiwan.cn"到 DNS 服務器,解析生成IP后返回給"我的電腦"。但是面試官一般會接著詢問 DNS 解析的詳細過程,依次考察候選人的知識深度。

圖片描述

(圖2:DNS 迭代查詢的具體過程)

步驟(1):瀏覽器會向本地 DNS 服務器發送域名報文。

步驟(2):本地 DNS 接收報文之后,會將請求轉發到根 DNS 服務器。

步驟(3):根 DNS 服務器通過".com"后綴返回 com 頂級域名服務器的IP地址205.0.1.2。

步驟(4):本地 DNS 服務器帶著域名訪問IP:205.0.1.2頂級域名服務器。

步驟(5):com 頂級域名服務器根據后綴"imooc.com",返回 IP 地址206.0.1.3

步驟(6):本地 DNS 服務器帶著域名訪問IP206.0.1.3二級域名服務器。

步驟(7):二級域名服務器通過www.xianlaiwan.cn查詢到了域名對應的實際IP地址210.1.17.89,返回給本地 DNS 服務器。

步驟(8):本地 DNS 服務器透傳IP210.1.17.89返回給"我的電腦"。

2.2 建立 TCP 連接

在經過 DNS 解析之后,瀏覽器已經獲取了對應網站的 IP 地址,通過三次握手連接到網站服務器,這個步驟中,我們可以給面試官畫出簡化后的三次握手過程:

圖片描述

TCP三次握手

(1)客戶端發送一個帶有 SYN 標記位的數據包(syn=J)到服務器,然后進入 SYN_SENT 狀態;

(2)服務器收到 SYN 包,需要確認客戶端的 SYN(賦值ack=J+1),然后自己也發送一個 SYN 包(syn=K),服務器進入 SYN_RCVD 狀態;

(3)客戶端收到服務器的 SYN+ACK 包,向服務器端發送確認包,即ack=K+1,發送完成之后,兩邊都進入 ESTABLISHED 建立連接狀態。

2.3 發送 HTTP 請求

TCP 三次握手之后,客戶端和服務器端成功建立了連接,之后瀏覽器會向服務器特定端口發送HTTP請求。

圖片描述

(https://imooc.com URL的請求報文)

以 Chrome 瀏覽器為例,按下 F12 即可進入開發者模式,Network 一欄查看HTTP請求的具體報文。

一個 HTTP 報文由請求行(Request Line)、請求頭部(Request Headers)、空行(Blank Line)以及請求體(Request Body)構成,請求行中規定了請求方法、URI 以及 HTTP 的版本,關于每個字段的詳細解釋,之前的小節已經進行了闡述。

2.4 服務器端解析請求

當一個 HTTP 請求打進服務器之后,一般的流程是:網關層(例如Ngnix)最先獲取請求,然后路由轉發到具體的Web服務,經過一段業務邏輯之后,可能還會查詢數據庫,最后將處理的結果返回給瀏覽器客戶端。

對于后端開發程序員來說,日常的工作就集中在服務器端,特別是流程圖中的"Web業務服務"這塊,例如基于 Spring 框架、Django 框架或者ThinkPHP 框架進行業務邏輯開發和上線。

圖片描述

(HTTP 請求進入服務器端后的解析流程圖)

2.5 返回 HTTP 響應

服務器端處理業務結果之后,也要返回 HTTP 響應,HTTP 響應由狀態行(Status Line)、響應頭部(Response Headers)、空行(Blank Line)以及響應體(Response Body)構成,關于每個部分的細節也不再贅述。需要特別注意的是,響應體中的各種錯誤碼定義:

狀態類型 代表狀態碼和含義 說明
1xx 100 Continue 服務器收到了客戶端的請求行和頭部信息,告訴
客戶端繼續發送數據部分。
2xx 200 OK 請求成功
3xx 301 Moved Permanently 資源被轉移了,請求將被重定向
4xx 404 Not Found 資源沒找到
5xx 500 Internal Server Error 服務器內部錯誤

2.6 TCP四次揮手

當瀏覽器獲取了域名對應的頁面信息,為了避免服務器和客戶端雙方的資源損耗,客戶端會請求斷開 TCP 連接,和三次握手的過程相似,TCP 四次揮手的過程可以總結為:

(1)第一次請求:客戶端請求斷開FIN,攜帶信息seq=u;

(2)第二次請求:服務器確認客戶端的斷開請求 ACK ,攜帶信息ack=u+1,seq=v;

(3)第三次請求:服務器請求斷開 FIN ,攜帶信息seq=w,ACK,ack=u+1;

(4)第四次請求:客戶端確認服務器的斷開 ACK ,攜帶信息ack=w+1,seq=u+1。

圖片描述

?

(TCP四次揮手示意圖)

2.7 瀏覽器解析 HTML

服務器返回給客戶端的是 HTML 以及 CSS、Javascript 代碼,要展示為靜態頁面,還需要經過瀏覽器的解析行為。

瀏覽器內核引擎解析 HTML 文檔并且將標簽轉換為 DOM(Document Object Model,文檔對象模型)樹的 DOM 節點,不同瀏覽器的渲染解析流程大同小異。

同時,瀏覽器內核引擎還會解析 CSS 生成 CSS 規則樹,按照從右到左的順序讀取選擇器。

另外,在瀏覽器中還有個"JS腳本解析器",解析 HTML 和 CSS 是多線程同時執行的,CSS 解析失敗不會影響 HTML 內容的解析,但是如果 JS 腳本解析過程中觸發了異常,會直接終止 HTML 內容的解析。關于更詳細的解析動作,作為后端開發,我們不需要了解太多,這塊也不會作為面試考察的內容。

3.小結

本節中和大家講解了"我們在瀏覽器中輸入一個URL,具體發生了什么",整個過程中分析了應用層(HTTP、DNS)、傳輸層(TCP)、網絡層(IP)等網絡分層的各個協議的作用,也對服務器解析HTTP的基本流程進行了闡述,本小節需要大家掌握訪問 URL 時每個步驟的基本功能,能夠通過對調用鏈路的分析,向面試官展示自己的計算機網絡功底。