先糾正一下幾個比較模糊的概念:“MAC地址表儲存IP地址”,
MAC地址表是二層設備中存儲“MAC地址”和“轉發端口”映射關系的表,并不直接存儲IP地址。
“路由器根據MAC地址來選擇路由進行數據發送”,對于三層設備的三層端口來說,通常是基于報文目的IP地址,對照自身的路由表來選擇轉發路徑,只有二層設備基于“MAC地址”進行數據幀的轉發。
這個問題展開了說比較復雜,但是只考慮基本原理似乎也沒有那么麻煩,一句話概括就是“二層基于MAC地址轉發數據幀,三層基于IP地址轉發報文 ”MAC地址”是燒錄在網卡或者接口上的物理地址,具有二層意義和全球唯一性,一般不能被改變。IP地址是網絡中的主機或者三層接口在網絡中的邏輯地址,在同一個網絡內具有唯一性。IP地址和MAC地址的關系要分在二層通信和在三層通信兩個部分來說明(其實本質上是一樣的)二層以下數據幀的交換一般通過交換機或其他二層設備,需要用到主機間的MAC地址,但是通常主機網卡配置的是IP地址,此時就需要借助“ARP協議”將目標主機的IP地址轉換為對應主機的MAC地址才能進行通信,完整過程就是主機依靠IP-MAC的對應關系封裝數據幀,二層設備在收到含有目標MAC地址的數據幀后,查看自己的“MAC地址表”,便知道這個MAC地址該從自己的哪個端口發送出去。在windows下可以使用arp -a查看這種對應關系,可以在模擬器上輕松展現整個過程。當PC0和PC1能正常通信時,在PC0上查看ARP表如下:
可以看出,到目標主機的IP地址映射為對應的MAC地址了,此時PC0就可以將目標主機的IP地址轉換為對應的MAC地址封裝在數據幀中發給交換機。交換機有那么多端口,它怎么就知道你發送的這個數據幀的目的地址該從自己的哪個端口轉發出去呢?因此,交換機自己還要維護一張“MAC地址表”,用來記錄目的MAC地址-端口的映射關系,如下圖
現在交換機看到0004.9a2e,3ad1的MAC,就知道要從F0/2把數據幀發送出去啦O(∩_∩)O二層數據幀的通信基本原理就是這些,當然這兩張表是如何生成的就不是這個話題的討論范圍了,具體可以參考ARP協議的工作過程和交換機的轉發原理。二層討論的都是同一個網絡內(IP地址在同一網段)數據的交換,“IP地址和MAC地址的關系很明確”:雖然主機都配置了IP,但從上面的例子可以看出,IP地址實際并不起作用,在生成數據幀的時候就轉化為MAC地址了,并不參與實際的通信過程。但是如果要通信的主機不在一個網絡內,這時IP地址才真正發揮它的作用。IP數據包在三層網絡中的尋址通過路由器和各種路由協議來完成,在這個過程中,IP地址和MAC地址又有什么關系呢?看下面的拓撲
現在路由器的兩端分別為兩個網絡。數據想要從PC0到PC1,實際上經歷了兩個過程,先從主機到路由器的F0/0,再從F1/0口到PC1,單獨看每個過程,由于在同一個網段內,所以就和上一種情況是一致的,唯一不同的是此時我們必須配置網關。我們仿照剛才的過程看看PC0的ARP表是什么樣的
可以看出,數據想從PC0到路由器,依然必須經歷從IP地址到MAC地址的轉換過程,而這個網關的MAC恰好就是F0/0口的MAC,再看交換機1的MAC地址表:
恰好也有對應的端口,此時交換機就知道要把數據從F0/24發送出去,到這里起作用的還是MAC地址,那IP地址到底到哪才發揮真正的作用呢?我們繼續往下看,現在查看路由器的路由表:
路由器收到數據包后會查看數據包的目的IP字段,我們是發送到192.168.1.1這臺主機,看路由表發現正好有這個條目,到192.168.1.0/24要從F1/0這個端口發送出去。后面的過程就不再敘述了和前面基本一致了。也就是說,雖然數據包發送時包含了完整的TCP/IP四層信息,但是IP地址只在網絡間尋址才起作用,在同一個網絡內,IP地址在發送端被轉化為MAC地址進行尋址,而這種轉化和交換的對應關系,依賴于ARP協議和MAC地址表。對于上面的例子來說,在PC0到路由器的F0/0之間的網絡和F1/0到PC1之間網絡,都是MAC地址負責尋址,IP地址只在負責連接兩個不同網段的路由器上才發揮指導作用。
作者:Windroid
鏈接:https://www.zhihu.com/question/49335649/answer/115639556
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。