訪問網際網路時發生了什麼?

傑哥很忙發表於2020-08-02

前言

最近在整理網路抓包分析相關的資料,同時又在閱讀《網路是怎樣連線的》。本篇文章從網路協議對裝置連網的過程和傳送資料的過程進行探討。
在對網路進行分析時,會使用wireshark進行抓包分析。

在討論本篇文章時,假設讀者對網路協議有一定的基礎,對TCP/IP四層協議有一定的瞭解,也大致瞭解網路通訊抓包。

裝置聯網

在一個區域網內,在網路層,通過IP確定來確定資料包發往哪裡,在同一個區域網內,IP地址必須唯一。而在資料鏈路層,則通過MAC地址保證裝置的唯一。

DHCP

加入裝置剛聯網沒有設定靜態IP時,需要通過DHCP協議向DHCP伺服器獲取到一個可用的IP地址。

DHCP(動態主機配置協議)是一個區域網的網路協議。指的是由伺服器控制一段IP地址範圍,客戶機登入伺服器時就可以自動獲得伺服器分配的IP地址和子網掩碼。

在一個區域網內可以有一個或多個DHCP伺服器。比如日常家裡使用路由器上網,路由器內建了DHCP服務,當手機、平板、筆記本等裝置聯網時就會向路由器獲取一個可用的動態IP。在企業的區域網中,則通常需要部署一個DHCP伺服器或多個DHCP伺服器形成一個DHCP服務叢集用於維護區域網內的動態IP。

DHCP獲取動態IP有四個階段:發現階段(DHCP Discover)、提供階段(DHCP Offer)、選擇階段(DHCP Request)和確認階段(DHCP ACK)。

20200802152256.png

  1. 由於客戶端首次連線網際網路,並不知道DHCP伺服器的地址,因此客戶端首先需要向區域網內傳送一條DHCP Disconver廣播。

20200802152338.png

當DHCP伺服器收到該請求時,就會處理請求,非DHCP伺服器收到該請求不會處理,直接丟棄。DHCP Discover網路資料包如下圖所示。
20200802152607.png

此時並沒有IP地址,所以原始IP地址為0.0.0.0,客戶端的MAC地址是95:57:02:4a:09:01。每個DHCP處理階段都會有一個會話ID,用於標記是哪次的DHCP請求。

  1. 當DHCP伺服器收到請求時,會從可用的IP池中獲取一個IP,通過DHCP Offer請求返回。

20200802153019.png

由於客戶端一個網路卡只能設定一個IP。因此即使有多個DHCP服務都返回了響應,客戶端也僅會獲取第一個收到的IP進行設定。

20200802153209.png

如上圖所示,DHCP Offer向MAC地址為95:57:02:4a:09:01的客戶端返回的IP地址為192.168.137.60

  1. 由於同一個區域網內可能有多個DHCP伺服器,因此,為了告訴其他的DHCP伺服器,被使用的新的IP,客戶端會通過DHCP Request請求進行廣播告訴所有人當前客戶端選擇使用的IP地址。

20200802153523.png

這樣如果這個IP地址是當前DHCP服務分配的,該伺服器就會返回一個確認包,如果不是當前DHCP服務分配的,它就會忽略該請求。

20200802154046.png

在以前家用路由器多個路由器進行橋接時,若都提供DHCP服務功能,則分配的IP範圍不能重合,否則可能導致分配個多個裝置同樣的IP,導致裝置無法上網。實際路由器應該可以識別將DHCP Request的IP也設定為被租賃狀態,避免該IP再次被使用。不確定現在新的路由器裝置是否還會有該問題。

  1. DHCP服務確認返回

20200802154312.png

在返回確認的同時,還會告知客戶端IP可使用的期限。當到達期限時,這個IP就會被DHCP回收,客戶端需要重新向DHCP伺服器申請一個新的IP。

20200802154255.png

最後當裝置設定IP時,就會傳送一個ARP探針請求的廣播,傳送該請求時,客戶端還沒有設定IP,,若區域網已有裝置使用這個IP,就會返回MAC地址。
20200802164048.png

傳送資料

ARP

現在我們的裝置已經有了IP地址,可以訪問區域網了,只要路由器有連外網,就可以將裝置的請求轉發到網際網路,也就是說我們的裝置已經可以連線網際網路了。

當我們需要訪問網際網路時,比如要訪問connectivitycheck.platform.hicloud.com,我們首先要獲取到該地址的IP。通過DNS協議可以將域名轉換為實際IP。但是在講解DNS之前,裝置必須限訪問DNS伺服器,而此時裝置剛聯網獲取到IP,並不知道DNS伺服器的地址,解析來ARP協議就發揮作用了。

ARP協議是根據IP獲取MAC地址的一個TCP/IP協議。有些人可能會奇怪,為什麼我們有了IP地址,還需要MAC地址呢?因為在通常情況下我們傳送資料到目標IP時,IP是確定的(除非NAT地址轉換),但是我們通過路由器需要轉發到下個路由器時,則需要通過修改MAC地址為下一跳的路由器的MAC地址實現資料轉發。因此在網路通訊的時候光有IP地址還不夠,我們需要獲取到裝置的MAC地址才行。

20200802165007.png

通過ARP協議傳送廣播詢問對應IP的MAC地址,所有裝置收到會校驗當前的IP,若與ARP請求的IP一致,則會將自己的MAC地址響應給對端。若不一致就會丟棄請求。當請求者獲取到ARP響應後就會把對應的IP和MAC地址儲存到自己的ARP快取種,下次請求IP時就不需要再查詢MAC地址,直接可以從快取中獲取。

當客戶端獲取到了DNS的MAC地址時,就可以向DNS傳送請求查詢域名對應的IP了。

DNS

DNS是域名系統(Domain Name System)的縮寫。DNS協議通過DNS請求查詢指定域名的地址或別名等資訊。DNS伺服器如果存在該域名,則返回查詢到的資訊,否則從上一級DNS伺服器獲取資訊,仍不存在繼續向上以及DNS伺服器獲取,直到到達根域名伺服器。當DNS伺服器從上一級DNS伺服器獲取到指定域名的查詢資訊時,DNS伺服器會將其快取起來。

20200802205628.png

當通過DNS協議查詢到域名對應IP時,請求就可以通過該IP傳送到對端。若目標IP不在當前同一子網內,因此會通過路由器或交換機等裝置進行轉發,本篇文章不對這個過程進行具體的探討。

參考文獻

  1. 《網路是怎樣連線的》
  2. 《Wireshark資料包分析實戰詳解》

相關文章