CCNA – Part10 數據包的通訊過程
這篇文章主要是對數據包在同網段和不同網段的轉發流程梳理,使用 ping
命令進行實際抓包測試。
網關的概念:
對於像 PC 等終端設備來說,通過交換機可以實現同網段的通訊。但如果想要給其他網段發生數據,就不行了,因為本身沒有路由的功能,不知道該發給誰。這時就提出了一個網關的概念,為這些終端設備配置上,當想要實現跨網段的通訊時,就把數據發送到配置的網關地址上。一般來說,默認配置的網關地址都是路由的介面地址。
ARP
什麼是 ARP?
ARP – Address Resolution Protocol. 在封裝數據幀-鏈路層的數據包時,由於上層已經有了目的 IP 地址。而在鏈路層需要封裝 SMAC 和 DMAC,但目的 MAC 如何獲取呢?就是通過 ARP 協議,完成 IP 地址到物理地址的映射。但需要注意的是,ARP 不能穿越路由器,也就是跨網段傳輸。
ARP 原理
假設這裡出現的設備均是第一次啟動。把路由器的路由功能關閉,這裡的 R1 代表的就是 PC 了,否則是 Ping 不通.
這裡 R1 想要給 PC 發送 IP 數據包,只有按照要求封裝成 2 層數據幀的格式才可以,步驟如下:
-
發現目前有源 MAC 地址,卻沒有目的 MAC 地址,那麼封包不成功,暫時將包快取。
-
接著發送 ARP 廣播(將 ARP 廣播添加幀頭部發送),交換機轉發該廣播到該網路的每一個主機,
-
每個主機收到後開始解封裝,進而查看到 ARP 報文中的目的 IP,如果該 IP 和自己的 IP 一致,那麼做出 ARP 響應報文(單播),否則丟棄。
-
R1 收到 PC 的響應報文後,開始解封裝,並查看 ARP 報文中的目的 IP,添加到缺少的目的 MAC,最後再發送到數據到 PC。
ARP 分類
標準 ARP:用於獲取 MAC 的 ARP 協議。
代理 ARP:正常來說,如果某個介面收到的網路層 IP 不是自己的話,就會把包丟掉。但如果在路由器的上介面配置了代理 ARP,路由器在收到數據包後,會先查看自己的路由表,看能不能到達,能到達的話。就將自己介面的 MAC 地址回復給請求方。注意真的 MAC 可能是另一網段的設備。其實這裡就是一種欺騙行為,欺騙發送者自己的 IP 和 MAC.
無故(免費) ARP:用於檢測 IP 地址是否衝突,已經被其他介面使用。目的和源 IP 都是自己.(在介面第一次啟動時發送。)
同網段的數據通訊
這裡出現的設備均是第一次啟動,把路由器的路由功能關閉,這裡的 R1 代表的就是 PC 了,否則是 Ping 不通的
這裡 R1 想要給 PC 發送 IP 數據包,只有按照要求封裝成 2 層數據幀的格式才可以。這時發現目前有源 MAC 地址,卻沒有目的 MAC 地址,那麼封包不成功,暫時將包擱置。接著發送 ARP 廣播(將 ARP 廣播添加幀頭部發送,幀結構如下圖)
交換機收到該數據包後發現目的 MAC 為 ffff:ffff:ffff, 根據交換機的轉發規則,先將 R1 的源 MAC 和自己埠號(e0/0)存入 MAC 表,然後進行泛洪操作,廣播到該網路的每一個主機。
每個主機收到後開始解封裝,進而查看到 ARP 報文中的目的 IP,PC 發現目的 IP 和自己的 IP 一致,接著發送 ARP 響應報文(如下圖)
交換機收到 PC 的 ARP 應答報文後,由於目的 MAC 地址在本身的 MAC 表裡已經存在,進而直接轉發給 R1。
R1 收到 PC 的響應報文後,開始解封裝,並查看 ARP 報文中的目的 MAC,添加到擱置的缺少目的 MAC 的數據包,接著將封裝好的數據幀發送到 PC (ping 命令 在傳輸層是 ICMP 協議)
不同網段之間的通訊
這裡注意一下,兩台 PC 機要配置網關,否則 ARP 包內的內容可能不一樣
不管終端的目的是哪裡,首先都要將數據包發送到網關
PC1 要給 PC2 發送 ICMP 包,首先要發送到網關,我們先模擬下封包過程:
封裝 4 層 ICMP 頭
封裝 3 層 IPV4 頭,源 IP 為 12.1.1.1 目的 IP 為 23.1.1.2
封裝 2 層 頭,源 MAC 為 aabb.cc00.1000 目的 MAC(也就是網關的 MAC) 不清楚
封裝暫停。
PC1 開始發送 ARP 報文,獲取網關 MAC,報文如下:
路由器 R2 收到 ARP 請求報文,開始解封裝,發現報文中的 Sender IP 是自己,那麼進行 ARP 報文回復,並將 PC1 的源 MAC 和源 IP 記錄在自己 ARP 快取表中,報文如下:
PC1 收到 ARP 應答報文,進行解封裝,取出報文中缺少的 MAC 地址,添加到擱置的 ICMP 的包中,PC1 順利的將數據包發送至網關
R2 收到發來的 ICMP 包後,進行解封裝,進行到第三層時,發送目的 IP 是自己可達網段中的 IP。因此進行轉發,開始封裝新的 ICMP 數據包
封包過程如下:
- 三層不變
- 封裝二層,封裝源 MAC:aabb.cc00.2010 ,目的 MAC (PC2 終端 MAC)不清楚
- 封包暫停
R2 開始發送 ARP 報文,請求 PC2 的 MAC 地址,報文如下:
交換機收到 ARP 請求報文,將 R2 的 e0/1 的 MAC 地址和自己的埠號(e0/0) 記錄在 MAC 地址表內,然後根據規則進行泛洪.
PC2 收到 ARP 解析包後,發送 ARP 包中的目的 IP 是自己,因此進行 ARP 應答,並將 ARP 請求中的源 MAC (aa:bb:cc:00:20:10) 和 源 IP(23.1.1.1) 記錄在自己的 ARP 快取表中,應答報文如下:
交換機收到 PC 的 ARP 應答報文後,先將 PC2 的 e0/0 MAC 地址和自己的埠號(e0/1) 記錄字 MAC 地址表內,接著發現要去數據包要去的 MAC 地址在自己的 MAC 表內,因此直接轉發。
R2 收到 ARP 應答報文,取出 PC2 的 MAC 地址,並添加到擱置的 ICMP 包中,封包成功。接著將 ICMP 包發給 PC2,同時也將 PC2 的 MAC 地址和 IP 記錄在自己的 ARP 快取表中。
PC2 收到 ICMP 包發現,三層包中目的 IP 是自己,接著進行 ICMP 應答,我們再來模擬一下封包的過程:
封裝 4 層 ICMP 頭
封裝 3 層,源 IP:23.1.11 目的 IP:12.1.1.1
封裝 2 層,源 MAC:aabb.cc00.4000 目的MAC:網關 MAC(aabb.cc00.2010)(在 ARP 快取表中取得)
然後進行發包。
交換機收到數據包後,發送目的 MAC 在自己的 MAC 表中有,直接轉發給 R2,R2 收到數據包後,解 封 2 層,發現 3 層中要去的網段自己能到達,因此開始封裝包:
3 層不變
2 層的源 MAC 為自己的 MAC 地址(e 0/0),目的 MAC 為 aabb.cc00.1000 (從 ARP 快取表中取得),
報文如下:
最後我們可以發現,數據包在跨網段傳輸時,網路層的 IP 是固定不變的,但是 MAC 地址是在不斷發生變化的。