優秀的面試官!透過一個問題考察了所有網路程式設計知識點

JavaBuild發表於2024-10-12

一、寫在開頭

本文的主題是和大家一起探討學習:“在瀏覽器中輸入URL開始後,計算機所做的幾件事”,這個問題是好幾年前自己面試的時候,面試官考問過的,當時準備十分不充分,回答的一塌糊塗,今天拿出來再整理學習一遍,一同進步!

其實這個問題本身倒是不難,但它巧妙的是可以將我們所學過的網路程式設計知識給串聯起來,面試官僅僅透過一個問題就可以考察出我們對於這部分知識的掌握程度。那麼我們今天也以此為題展開網路程式設計的正式學習啦!

二、訪問網頁的底層執行機制

image

如上圖所示,當我們在瀏覽器的搜尋框中輸入了“www.baidu.com”並回車後,瀏覽器就跳轉到了百度的首頁中,這個過程計算機做了哪些操作呢?

1. 在瀏覽器中輸入指定的URL地址; 2. 瀏覽器透過DNS協議(域名解析協議),獲取域名所對應IP地址; 3. 瀏覽器根據獲取到的IP+埠,向目標伺服器端發動一個TCP連線請求; 4. 經過三次握手後TCP連線成功,瀏覽器會在該TCP連線上傳送一個HTTP請求報文; 5. 伺服器處理HTTP請求後,反饋響應報文給瀏覽器; 6. 瀏覽器收到 HTTP 響應報文後,解析響應體中的 HTML 程式碼,渲染網頁的結構和樣式,同時根據 HTML 中的其他資源的 URL(如圖片、CSS、JS 等),再次發起 HTTP 請求,獲取這些資源的內容,直到網頁完全載入顯示。 7. 瀏覽器不與伺服器互動時,會透過四次揮手關閉TCP連線。


三、解析底層

在第二章中我們將瀏覽器的操作分為了7個小點,接下來,我們就來分別解釋一下其中所用到的技術,由於單篇文章篇幅不易過長,其中的知識點都是粗講,達到貫穿理解即可,後續會針對每一個知識點,如TCP/UDP,HTTP,DNS等進行單獨分析。

3.1 URL

在我們瀏覽器輸入的一個可以訪問我們想要的內容,這個輸入就叫做URL,英文為:Uniform Resource Locators,釋義:統一資源定位器。它可以標識網路中唯一的資源,並給出定位它的路徑。與之相關的還有一個URI(Uniform Resource Identifier):統一資源標誌符,它可以唯一標識一個資源。

URL是一種具體的URI,它不僅唯一標識資源,還提供定位地址,URI比喻成我們的身份證號的話,那URL就是我們具體的家庭住址。

URL的結構:

image

在這裡插入圖片描述
  • http:// :超文字傳輸協議,URL的字首,屬於應用層協議,通常有HTTP和HTTPS,檔案傳輸URL中字首為ftp等。
  • www.example.com: 域名,這裡也可以為IP地址,它們之間具有一一對映關係,只不過域名更通俗易記。
  • 80: 埠,如果指明瞭訪問網址的埠的話,埠會緊跟在域名後面,並用一個冒號隔開,當然有些時候,域名已配置好對應的預設訪問地址的話,這裡就不會存在埠號。
  • /path/to/myfile.html: 資源路徑,從域名(埠)後以/開始到?前結束的這一段路徑,作為訪問具體資源的一個地址,從第一個/開始,表示從伺服器上根目錄開始進行索引到的檔案路徑,上圖中要訪問的檔案就是伺服器根目錄下/path/to/myfile.html。
  • key1=value&key2=value2:引數,在http傳送get請求時,引數會包含在URL中,與路徑以?分割開始,key=value的形式出現,多參情況下,用&分割,有些請求的引數是放在body中的,比如post。
  • #SomewhereInTheDocument : 錨點,顧名思義,是在要訪問的頁面上的一個錨。要訪問的頁面大部分都多於一頁,如果指定了錨點,那麼在客戶端顯示該網頁是就會定位到錨點處,相當於一個小書籤。值得一提的是,在 URL 中,錨點以#開頭,並且不會作為請求的一部分傳送給服務端。

3.2 DNS

我們在上面提到了域名與IP地址對映關係,這裡其決定作用的就是DNS(Domain Name System) 域名系統,具體流程如下:

  1. 本地緩衝查詢:當我們在瀏覽器中輸入一個域名後,會先到瀏覽器快取中查詢,是否已經存在該域名解析結果,如果存在則返回對應IP地址,否則進行下一步;
  2. 本地DNS伺服器查詢:本地快取中沒有後,瀏覽器會向本地配置的DNS伺服器傳送遞迴查詢請求,如果本地DNS伺服器也沒有命中,則繼續下一步;
  3. 根DNS伺服器查詢:如果本地DNS伺服器也沒有相應的解析結果,它會向根DNS伺服器傳送迭代查詢請求。根DNS伺服器負責管理頂級域名伺服器的IP地址,它會根據頂級域名(例如.com)的資訊返回對應的頂級域名伺服器的IP地址;
  4. 頂級域名查詢:本地DNS伺服器向頂級域名伺服器傳送查詢請求,並根據頂級域名的資訊返回下一級域名伺服器的IP地址。這個過程會一層一層地向下查詢,直到找到負責解析的權威域名伺服器;
  5. 權威域名查詢:本地DNS伺服器向權威域名伺服器傳送查詢請求,並獲取域名對應的IP地址。本地DNS伺服器會將解析結果快取起來,並返回給瀏覽器;
  6. 返回並快取:瀏覽器收到本地DNS伺服器返回的IP地址後,會將其儲存在本地快取中,併發起與該IP地址相關的網路請求。

3.3 TCP

在3.2部分,透過DNS解析,拿到了目標主機的IP地址後,瀏覽器就可以向目標伺服器傳送TCP連線請求,TCP協議是傳輸層協議,可以在建立了安全連線的基礎上,控制資料傳輸,保證可靠性,並且支援雙向通訊,像HTTP,HTTPS都是建立在TCP協議之上的。(TCP連線最經典的就是3次握手!)

注意:TCP/IP協議是繫結來看的,建議TCP協議時,需要傳送資料,傳送資料就需要網路層的IP協議,這個協議一種分組交換的協議,不保證可靠傳輸,負責將資料包從源主機路由到目標主機。

3.4 HTTP

建立了TCP連線後,瀏覽器就可以向目標伺服器傳送HTTP請求報文啦,當然,有些網站配置了安全增強的HTTPS協議,之間的區別,我們後面會單獨來聊,包括HTTP1.0,HTTP1.1等內容。

3.5 伺服器處理並返回響應

伺服器在接收到HTTP報文後,根據對應的介面、引數、cookies生成一個HTML響應,並返回給瀏覽器,瀏覽器收到 HTTP 響應報文後,解析響應體中的 HTML 程式碼,渲染網頁的結構和樣式,同時根據 HTML 中的其他資源的 URL(如圖片、CSS、JS 等),再次發起 HTTP 請求,獲取這些資源的內容,直到網頁完全載入顯示。

四、總結

以上就是整個網路請求所涉及到的TCP/IP四層模型的實戰內容,它也是我們網路程式設計學習中的重中之重,至於其中的每一層的細節,我們後面單個精講!

相關文章