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