這一個問題能檢驗一個人的計算機網路基礎知識.
1.獲得IP地址
- 想要連線網路需要獲得一個IP地址, 所以首先要執行DHCP協議, 從本地DHCP伺服器獲得一個IP地址以及其他資訊.
- 通過作業系統生成一個DHCP請求報文, 並將這個報文放入具有目的埠67(DHCP伺服器)和源埠68(本機)的UDP報文段中, 該UDP報文段會被放置在一個具有廣播地址(255.255.255.255)和源IP地址為0.0.0.0的IP資料包中.
- 包含DHCP請求報文的IP資料包被放置在乙太網幀中. 該乙太網幀具有廣播目的地址FF:FF:FF:FF:FF:FF和本機的MAC地址00:61:3D:32:86:A8
- 該幀會傳送給乙太網交換機, 並在所有的輸出埠廣播該幀.
- 當被廣播到DHCP伺服器時(執行在路由器中), DHCP伺服器為該主機分配IP地址, 並把DNS伺服器地址, 預設閘道器路由器地址, 網路掩碼等資訊和分配的IP地址一起封裝成一個DHCP提供報文傳送給主機. 主機確認選擇好IP地址後將再次與DHCP伺服器通訊確認.
- 至此, 我們的主機獲得了IP地址與其他網路配置資訊, 可以準備開啟瀏覽器上網了.
2.訪問網頁前的準備
- 假設我們現在要訪問部落格園, 當我們輸入URL:www.cnblogs.com後, 我們的主機需要知道部落格園的IP地址才能與部落格園的伺服器建立TCP連線併傳送HTTP請求. 所以下面將描述根據DNS協議完成名字到IP轉換的過程.
- 先把URL放入DNS報文中, 再根據DNS伺服器埠和地址依次封裝為報文段和資料包, 最後放入到乙太網幀中, 並將該幀傳送到學校(或家庭)的閘道器路由器.
- 雖然在第4步中已經獲得了閘道器路由器的IP地址, 但不知道其MAC地址. 為了獲得閘道器路由器的MAC地址, 需要使用ARP查詢報文. 接著把ARP封裝進乙太網幀中, 並在乙太網中廣播, 最終獲得閘道器的MAC地址.
- 有了閘道器MAC地址後, 承載DNS報文的資料包就能到達DNS伺服器了.
- 我們簡單假設DNS伺服器快取有www.cnblogs.com的IP地址, DNS伺服器會形成一個主機名到IP地址對映的DNS回答報文, 放入到UDP報文段中, 進而封裝成定址到我們能主機的IP資料包, 並通過網路反向傳輸回我們的主機.
- 這時我們的主機得到了伺服器www.cnblogs.com的IP地址, 準備訪問www.cnblogs.com伺服器.
3.與網站伺服器互動
- 有了www.cnblogs.com的IP地址, 下面便生成TCP套接字並通過該套接字向www.cnblogs.com傳送HTTP GET報文以獲取網站內容. 在生成套接字的同時, 我們主機中的TCP需要和www.cnblogs.com的TCP進行三次握手, 下面開始描述三次握手的過程.
- 主機首先生成一個具有目的埠80的TCP SYN報文段, 將該TCP報文段放到具有目的IP地址的IP資料包中, 繼而將資料包放入具有閘道器路由器MAC地址的幀中, 並向交換機交換該幀.
- 當包含TCP SYN的資料包到達www.cnblogs.com, 伺服器從資料包抽取出TCP SYN報文段, 並分解到與埠80相聯絡的歡迎套接字. 伺服器的TCP會與主機生成一個專屬套接字, 併產生一個TCP SYNACK報文段, 響應給客戶端主機.
- 收到TCP SYNACK後, 我們的主機進入連線狀態, 此時來到三次握手的第三階段, 我方主機需要向伺服器傳送ACK報文段, 且可以在ACK報文段中放入資料了. 我們把GET報文放入報文段的資料載荷欄位, 併傳送給伺服器.
- 部落格園的伺服器接收到HTTP GET報文後, 生成一個HTTP響應報文, 並把Web頁面的內容放入到報文中, 響應給我們的主機.
- 最後我們的主機讀取HTTP響應報文, 抽取出html資料, 並將網頁顯示在瀏覽器上.
小結
- 不要小看連網和瀏覽網頁這一能在數秒能完成的操作, 它涵蓋了足夠多的網路知識, 上面的敘述已經高度簡化, 裡面的每個操作背後都對應著豐富的知識.
- 想要了解這些動作背後都發生了什麼, 最好的方法是系統地看一本講述網路知識的書. 以上的內容是《計算機網路 自頂向下方法》第六章協議棧結束後所描述的場景. 也是看了這本書後, 才知道平時常用的網路背後蘊含這麼多知識.
- 擴充套件閱讀
- Java實現簡易聯網坦克對戰小遊戲
- 換一種方式瞭解人工智慧