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 服務器
?
DNS 解析的過程簡單來看,是從"我的電腦"傳輸域名"www.xianlaiwan.cn"
到 DNS 服務器,解析生成IP后返回給"我的電腦"。但是面試官一般會接著詢問 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 地址,通過三次握手連接到網站服務器,這個步驟中,我們可以給面試官畫出簡化后的三次握手過程:
(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請求。
以 Chrome 瀏覽器為例,按下 F12 即可進入開發者模式,Network 一欄查看HTTP請求的具體報文。
一個 HTTP 報文由請求行(Request Line)、請求頭部(Request Headers)、空行(Blank Line)以及請求體(Request Body)構成,請求行中規定了請求方法、URI 以及 HTTP 的版本,關于每個字段的詳細解釋,之前的小節已經進行了闡述。
2.4 服務器端解析請求
當一個 HTTP 請求打進服務器之后,一般的流程是:網關層(例如Ngnix)最先獲取請求,然后路由轉發到具體的Web服務,經過一段業務邏輯之后,可能還會查詢數據庫,最后將處理的結果返回給瀏覽器客戶端。
對于后端開發程序員來說,日常的工作就集中在服務器端,特別是流程圖中的"Web業務服務"這塊,例如基于 Spring 框架、Django 框架或者ThinkPHP 框架進行業務邏輯開發和上線。
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。
?
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 時每個步驟的基本功能,能夠通過對調用鏈路的分析,向面試官展示自己的計算機網絡功底。