這個問題應該是網路知識最綜合的一個考察,因為涉及到的知識實在太多了,如果面試官對每一個細節都問的話,應該可以把網路知識問的差不多
我查閱資料總結大概有兩種表述
簡單過程
說簡單也不是簡單,就是從表面看是主要發生了哪幾步
- DNS 解析
- TCP 連線
- 傳送 HTTP 請求
- 伺服器處理請求並返回 HTTP 報文
- 瀏覽器解析渲染頁面
- 連線結束
具體過程如下:
DNS 解析
通俗來將,就是尋找哪臺伺服器上有你想要請求的資源。比如當你在瀏覽器中輸入 www.google.com 時,這其實不是真正意義上谷歌的地址。網際網路上每一臺機器的唯一標識是它的IP 地址,但是 IP 地址不方便記憶,所以使用者更喜歡使用上面提到的網址來和網際網路中其他計算機進行資訊互動,那麼將網址轉化為實際 IP 地址的過程就是 DNS 解析。實際上充當一個翻譯的角色,實現網址到 IP 地址的轉換
解析過程
DNS 解析是一個遞迴查詢的過程,通過下圖來直觀理解:
這就是一個查詢 www.google.com 的 IP 地址的過程。首先在本地域名中查詢 IP 地址,如果沒有找到,本地域名會向根域名傳送一個請求,如果根域名伺服器也不存在該域名時,本地域名會向 com 頂級域名伺服器傳送一個請求,依次類推下去。直到最後本地域名伺服器得到 google 的 IP 地址並把它快取到本地,供下次使用。從上述過程中可以看出網址解析的過程是一個從左到右的過程:com-google.com-www.google.com,但是這樣的話根域名伺服器的解析呢?實際上真正的網址是 www.google.com.,這裡並不是多打了個 . 而是這代表根域名伺服器,實際上所有的網址後面都會有這個,因為都有,所以就預設為了方便將這個省去,但是瀏覽器在請求 DNS 時候會自動加上
DNS 優化
圖中在 DNS 的請求過程中大概經歷了 8 個步驟,這個過程中存在多個請求,如果每次請求都是經歷這麼多步驟,是否太耗時間,計算機通過 DNS 快取來減少該過程的步驟
DNS 存在多級快取,從離瀏覽器的距離來說,有以下幾種:瀏覽器快取、系統快取、路由器快取、IPS 伺服器快取、根域名快取、頂級域名伺服器快取、主域名伺服器快取
DNS 負載均衡
實際上 DNS 每次返回的 IP 地址不是固定的,DNS 會返回一個合適機器的 IP 給使用者,例如可以根據每臺機器的負載量、該機器離使用者地理位置的距離等等,這就涉及到 DNS 的負載均衡,又叫 DNS 重定向。
TCP 連線
這個過程也是面試常考的過程,具體可以檢視我上一篇文章【面試】徹底理解 TCP 及面試常問
瀏覽器傳送 HTTP 請求
一個http請求報文由請求行 request-line 、請求頭部 headers、空行 blank-line 和請求資料 request-body 4個部分組成
後面的過程就是涉及到前端的知識,這裡不詳細討論,主要關注點還是下面的後臺涉及到的協議細節。
詳細過程
1. DHCP 配置主機資訊
- 假設主機最開始沒有 IP 地址以及其他資訊,那麼就需要先使用 DHCP 來獲取
- 主機生成一個 DHCP 請求報文,並將這個報文放入具有目的埠 67 和源埠 68 的 UDP 報文段中
- 該報文段則被放入一個具有廣播 IP 目的地址(255.255.255.255) 和源 IP 地址(0.0.0.0)的 IP 資料包中,因為這個時候主機還不具有一個 IP 地址
- 該請求報文的 IP 資料包會被放置在乙太網幀中,該乙太網幀具有目的 MAC 地址 FF:FF:FF:FF:FF:FF,該幀將廣播到與交換機連線的所有裝置
- 連線在交換機的 DHCP 伺服器收到廣播幀之後,不斷地向上分解得到 IP 資料包、UDP 報文段、DHCP 請求報文,之後生成 DHCP ACK 報文,該報文包含以下資訊:IP 地址、DNS 伺服器的 IP 地址、預設閘道器路由器的 IP 地址和子網掩碼。該報文被放入 UDP 報文段中,UDP 報文段有被放入 IP 資料包中,最後放入 MAC 幀中
- 該幀的目的地址是請求主機的 MAC 地址,因為交換機具有自學習能力,之前主機傳送了廣播幀之後就記錄了 MAC 地址到其轉發介面的交換表項,因此現在交換機就可以直接知道應該向哪個介面傳送該幀
- 主機收到該幀後,不斷分解得到 DHCP 報文。之後就配置它的 IP 地址、子網掩碼和 DNS 伺服器的 IP 地址,並在其 IP 轉發表中安裝預設閘道器
2. ARP 解析 MAC 地址
- 主機通過瀏覽器生成一個 TCP 套接字,套接字向 HTTP 伺服器傳送 HTTP 請求。為了生成該套接字,主機需要知道網站的域名對應的 IP 地址。
- 主機生成一個 DNS 查詢報文,該報文具有 53 號埠,因為 DNS 伺服器的埠號是 53。
- 該 DNS 查詢報文被放入目的地址為 DNS 伺服器 IP 地址的 IP 資料包中。
- 該 IP 資料包被放入一個乙太網幀中,該幀將傳送到閘道器路由器。
- DHCP 過程只知道閘道器路由器的 IP 地址,為了獲取閘道器路由器的 MAC 地址,需要使用 ARP 協議。
- 主機生成一個包含目的地址為閘道器路由器 IP 地址的 ARP 查詢報文,將該 ARP 查詢報文放入一個具有廣播目的地址(FF:FF:FF:FF:FF:FF)的乙太網幀中,並向交換機傳送該乙太網幀,交換機將該幀轉發給所有的連線裝置,包括閘道器路由器。
- 閘道器路由器接收到該幀後,不斷向上分解得到 ARP 報文,發現其中的 IP 地址與其介面的 IP 地址匹配,因此就傳送一個 ARP 回答報文,包含了它的 MAC 地址,發回給主機
3. DNS 解析域名
- 知道了閘道器路由器的 MAC 地址之後,就可以繼續 DNS 的解析過程了。
- 閘道器路由器接收到包含 DNS 查詢報文的乙太網幀後,抽取出 IP 資料包,並根據轉發表決定該 IP 資料包應該轉發的路由器。
- 因為路由器具有內部閘道器協議(RIP、OSPF)和外部閘道器協議(BGP)這兩種路由選擇協議,因此路由表中已經配置了閘道器路由器到達 DNS 伺服器的路由表項。
- 到達 DNS 伺服器之後,DNS 伺服器抽取出 DNS 查詢報文,並在 DNS 資料庫中查詢待解析的域名。
- 找到 DNS 記錄之後,傳送 DNS 回答報文,將該回答報文放入 UDP 報文段中,然後放入 IP 資料包中,通過路由器反向轉發回閘道器路由器,並經過乙太網交換機到達主機。
4. HTTP 請求頁面
- 有了 HTTP 伺服器的 IP 地址之後,主機就能夠生成 TCP 套接字,該套接字將用於向 Web 伺服器傳送 HTTP GET 報文。
- 在生成 TCP 套接字之前,必須先與 HTTP 伺服器進行三次握手來建立連線。生成一個具有目的埠 80 的 TCP SYN 報文段,並向 HTTP 伺服器傳送該報文段。
- HTTP 伺服器收到該報文段之後,生成 TCP SYN ACK 報文段,發回給主機。
- 連線建立之後,瀏覽器生成 HTTP GET 報文,並交付給 HTTP 伺服器。
- HTTP 伺服器從 TCP 套接字讀取 HTTP GET 報文,生成一個 HTTP 響應報文,將 Web 頁面內容放入報文主體中,發回給主機。
- 瀏覽器收到 HTTP 響應報文後,抽取出 Web 頁面內容,之後進行渲染,顯示 Web 頁面。