終極版:從開機聯網到輸入一個網址期間都發生了什麼?

炭燒生蠔發表於2019-04-12

這一個問題能檢驗一個人的計算機網路基礎知識.

1.獲得IP地址

  • 想要連線網路需要獲得一個IP地址, 所以首先要執行DHCP協議, 從本地DHCP伺服器獲得一個IP地址以及其他資訊.
  1. 通過作業系統生成一個DHCP請求報文, 並將這個報文放入具有目的埠67(DHCP伺服器)和源埠68(本機)的UDP報文段中, 該UDP報文段會被放置在一個具有廣播地址(255.255.255.255)和源IP地址為0.0.0.0的IP資料包中.
  2. 包含DHCP請求報文的IP資料包被放置在乙太網幀中. 該乙太網幀具有廣播目的地址FF:FF:FF:FF:FF:FF和本機的MAC地址00:61:3D:32:86:A8
  3. 該幀會傳送給乙太網交換機, 並在所有的輸出埠廣播該幀.
  4. 當被廣播到DHCP伺服器時(執行在路由器中), DHCP伺服器為該主機分配IP地址, 並把DNS伺服器地址, 預設閘道器路由器地址, 網路掩碼等資訊和分配的IP地址一起封裝成一個DHCP提供報文傳送給主機. 主機確認選擇好IP地址後將再次與DHCP伺服器通訊確認.
  5. 至此, 我們的主機獲得了IP地址與其他網路配置資訊, 可以準備開啟瀏覽器上網了.

2.訪問網頁前的準備

  • 假設我們現在要訪問部落格園, 當我們輸入URL:www.cnblogs.com後, 我們的主機需要知道部落格園的IP地址才能與部落格園的伺服器建立TCP連線併傳送HTTP請求. 所以下面將描述根據DNS協議完成名字到IP轉換的過程.
  1. 先把URL放入DNS報文中, 再根據DNS伺服器埠和地址依次封裝為報文段和資料包, 最後放入到乙太網幀中, 並將該幀傳送到學校(或家庭)的閘道器路由器.
  2. 雖然在第4步中已經獲得了閘道器路由器的IP地址, 但不知道其MAC地址. 為了獲得閘道器路由器的MAC地址, 需要使用ARP查詢報文. 接著把ARP封裝進乙太網幀中, 並在乙太網中廣播, 最終獲得閘道器的MAC地址.
  3. 有了閘道器MAC地址後, 承載DNS報文的資料包就能到達DNS伺服器了.
  4. 我們簡單假設DNS伺服器快取有www.cnblogs.com的IP地址, DNS伺服器會形成一個主機名到IP地址對映的DNS回答報文, 放入到UDP報文段中, 進而封裝成定址到我們能主機的IP資料包, 並通過網路反向傳輸回我們的主機.
  5. 這時我們的主機得到了伺服器www.cnblogs.com的IP地址, 準備訪問www.cnblogs.com伺服器.

3.與網站伺服器互動

  1. 有了www.cnblogs.com的IP地址, 下面便生成TCP套接字並通過該套接字向www.cnblogs.com傳送HTTP GET報文以獲取網站內容. 在生成套接字的同時, 我們主機中的TCP需要和www.cnblogs.com的TCP進行三次握手, 下面開始描述三次握手的過程.
  2. 主機首先生成一個具有目的埠80的TCP SYN報文段, 將該TCP報文段放到具有目的IP地址的IP資料包中, 繼而將資料包放入具有閘道器路由器MAC地址的幀中, 並向交換機交換該幀.
  3. 當包含TCP SYN的資料包到達www.cnblogs.com, 伺服器從資料包抽取出TCP SYN報文段, 並分解到與埠80相聯絡的歡迎套接字. 伺服器的TCP會與主機生成一個專屬套接字, 併產生一個TCP SYNACK報文段, 響應給客戶端主機.
  4. 收到TCP SYNACK後, 我們的主機進入連線狀態, 此時來到三次握手的第三階段, 我方主機需要向伺服器傳送ACK報文段, 且可以在ACK報文段中放入資料了. 我們把GET報文放入報文段的資料載荷欄位, 併傳送給伺服器.
  5. 部落格園的伺服器接收到HTTP GET報文後, 生成一個HTTP響應報文, 並把Web頁面的內容放入到報文中, 響應給我們的主機.
  6. 最後我們的主機讀取HTTP響應報文, 抽取出html資料, 並將網頁顯示在瀏覽器上.

小結

  • 不要小看連網和瀏覽網頁這一能在數秒能完成的操作, 它涵蓋了足夠多的網路知識, 上面的敘述已經高度簡化, 裡面的每個操作背後都對應著豐富的知識.
  • 想要了解這些動作背後都發生了什麼, 最好的方法是系統地看一本講述網路知識的書. 以上的內容是《計算機網路 自頂向下方法》第六章協議棧結束後所描述的場景. 也是看了這本書後, 才知道平時常用的網路背後蘊含這麼多知識.

 

相關文章