該題是一道特別經典的面試題了,涉及到前端人員應該掌握的基礎網絡知識,相信很多前端同學都了解。但是如果問深了,也能問出很多子問題來,也更能考驗出面試者的知識深度和靈活運用程度。
瀏覽器輸入URL之后大致有這么幾個階段:
DNS域名解析建立TCP鏈接發送HTTP請求服務端處理請求服務端返回響應結果關閉TCP連接瀏覽器解析html并渲染布局
1. DNS域名解析
- 我們訪問一個網站的時候,可以通過主機名或者域名來訪問。但是絕大多數的時候是使用域名來訪問網站。因為相對于主機名的ip地址,域名更能讓人記住。
- 但是TCP/IP協議是通過IP地址來訪問的,所以就需要一個機制,將域名轉換為IP地址
- 而DNS服務就是做這件事情,它提供了域名到IP地址之間的解析服務
DNS解析過程1 . 訪問www.baidu.com到DNS服務器2 . DNS服務器返回www.baidu.com的IP地址115.182.4X.18X3 . 接著請求IP地址為115.182.4X.18X的服務器4 . 成功訪問到www.baidu.com的真正服務器DNS的優先級
本地電腦會將一些經常使用的域名和對應的IP地址建立一個映射關系,并保存到本地host文件中。當DNS解析的時候,會優先從本地host文件中查找映射的IP地址映射
1 . 如果在本地host文件中找到了域名對應的IP地址映射,會直接使用host文件中的IP地址2 . 如果在本地host文件中沒有找到域名對應的IP地址映射,會從本地DNS服務器中查找3 . 如果在本地DNS服務器中也沒有找到域名對應的IP地址映射,會繼續向上一級的DNS服務器發送請求,直到DNS根服務器。如果找到,就進行回傳,返回給瀏覽器。
2. 建立TCP鏈接
先了解一個知識點: TCP/IP協議族TCP/IP協議族是由四層協議組成的系統。分別是:
- 1 . 應用層(http)
- 2 . 傳輸層(tcp)
- 3 . 網絡層(ip)
- 4 . 鏈路層(網絡硬件)
我的理解是:我們訪問一個網站之前,首先要保證有網絡對吧?那么此時,鏈路層就是ok的。經過上面第一步,已經知道了該域名映射的IP地址,并且可以訪問,那么此時網絡層也是ok的。那么接下來,就是傳輸層,也就是TCP。其實這里說的也不是很嚴謹,傳輸層不僅僅是TCP一種協議,還有UDP協議。UDP協議是無連接的,因為其不需要連接,所以效率比較高,但是也是因為不需要連接驗證 所以安全性和可靠性得不到保障。而TCP是面向連接的,有校驗機制。所以用的較廣泛。但是也有缺點: 因為提前建立了連接,所以效率就較低。本文說的傳輸層指的是TCP協議。為了確保連接雙方的可靠性,在雙方建立連接時,TCP采用了三次握手策略
TCP三次握手建立連接1 . 第一次握手
客戶端發送帶有SYN標志的連接請求報文段,然后客戶端就進入了SYN_SEND狀態 等待服務器確認
2 . 第二次握手
服務端接收到了客戶端瀏覽器發送的SYN標志報文段后,需要發送ACK確認報文段對這個SYN報文段進行確認。同時又會向客戶端發生自己的SYN請求信息。服務端會將上述信息放到一個報文段(SYN+ACK報文段)中 一同發送給客戶端。此時服務端進入SYN_RECV階段
第三次握手
客戶端瀏覽器接收到了服務端返回的SYN+ACK報文段(請求+返回)后,會向服務器發送新的ACK確認報文段。該報文段發送完畢后,客戶端和服務端都進入到了ESTABLISHED狀態,此時 就完成了三次握手
知其然更要知其所以然,為什么要進行三次握手才能建立TCP連接?
根本原因就是為了確保客戶端和服務端雙方的接收和發送能力都是ok的。經過第一次握手后,服務端收到了客戶端的SYN請求標志,那么此時服務端就可以知道:客戶端的發送能力是ok的,服務端本身自己的接收能力是ok的。經過第二次握手后,客戶端收到了服務端的SYN+ACK請求+返回標志,那么此時,客戶端就可以知道:客戶端本身的發送和接收能力是ok的,服務端的發送和接收能力有是ok的。經過第三次握手后,服務端接收到了客戶端的ACK返回標志,那么此時,服務端就可以知道:服務端本身自己的接收和發送能力是ok的。
原文:https://segmentfault.com/a/1190000021756651