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


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

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數據, 並將網頁顯示在瀏覽器上.

小結

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM