計算機網路 (5) 資料鏈路層-MAC地址、IP地址及ARP協議
theme: scrolls-light
本文引用圖片均來自 高軍: 計算機網路
MAC地址
作用
兩臺主機之間最簡單
的通訊方式是使用通道直接相連
,彼此之間直接傳送資料。但是當主機數量增多,這種兩兩相連的方式會導致每臺主機都連線數不清的通道,這樣的網路是無法使用的,因此就出現了匯流排型、星型等網路。
匯流排型、星型等網路中的主機共享通道
,那麼主機如何知道從通道中收到的資料是傳送給自己的呢?為了區分不同的主機,這裡就產生了地址
的概念。主機發送資料時要帶上目的主機
的地址,主機從通道上收到資料後先檢視資料的目的地址是否和自身地址相同,相同則處理資料否則丟棄
由於這類地址用於媒體接入控制MAC(Media Access Control)
,因此這類地址被稱為MAC地址
共享通道要考慮的一個問題是如何協調多個傳送和接收站點對一個共享傳輸媒體的佔用,即媒體接入控制
MAC地址
一般固化在網絡卡
裡面,因此MAC地址
也稱為硬體地址
,有時也被稱為實體地址
(注意MAC
屬於鏈路層不是物理層)。由於主機可能具有多張
網絡卡(有線和無線)因此主機會具有多個MAC地址
,所以MAC地址
是對網路中各網路介面
的唯一標識而不是裝置的唯一標識
格式
本節討論IEEE 802
區域網的MAC地址
格式,MAC地址
一共6個位元組
- 前三位元組:組織唯一識別符號,由IEEE的註冊管理機構分配
- 後三位元組:網路介面識別符號,由廠商自行分配
下圖為華為獲得的組織唯一識別符號,會被用在華為製造的網絡卡裝置MAC地址
的前6
個字元上,反過來我們通過MAC地址
的前6
個字元也可以確定網絡卡的製造商
MAC地址第一個
位元組的最低兩位
有特殊用途:
- 最低位:0表示全球管理(全球唯一),1表示本地管理(本地唯一)
- 次低位:0表示單播(單一源到單一地址),1表示多播(單一源到多地址)
MAC地址各位元組在網路上的傳輸順序
遵循以下規則:
- 位元組:傳送順序為第一到第六位元組
- 位元組內位元:傳送順序為${b_{0}}$到${b_{1}}$
例項
單播
廣播,網路中的主機接收到幀後檢查目的地址,發現目的地址是廣播地址
,於是所有主機都接受該幀
組播,主機A傳送幀到多播地址07-E0-12-F6-2A-D8
,網路中的主機接收到幀後檢查自身多播組列表
,如果多播地址位於列表內則接受該幀,否則丟棄
至此,MAC地址
的介紹就告一段落了。但是,目前為止描述的只是資料在一個網路內的流動,如果資料要跨網路流動呢?這就需要MAC地址
的兩個搭檔出場了,它們是網路層
的IP地址
和ARP協議
。因為三者關係密切,所以這裡也做一下簡單介紹
IP地址
由來
最早的時候為了避免同網路中的主機兩兩連線,主機都連線到一個叫聯結器
的裝置中,聯結器只是簡單的將收到的資料轉發給其他所有
主機,其他主機根據資料的MAC地址
決定是否接受該資料包。聯結器位於物理層
聯結器將資料轉發給所有主機是低效且不安全
的,於是出現了交換機
。交換機內部有MAC表
,記錄哪個主機接在哪個埠
,這樣交換機在轉發資料的時候只要根據目的MAC地址
查表就可以做到精準轉發。交換機位於資料鏈路層
交換機MAC表
最初是空的,當收到資料包時會記錄它的源MAC地址
和埠
對映關係,如果目的MAC地址
和埠的對映關係沒有記錄就會先轉發給所有
主機,然後看哪臺主機迴應資料包
就能記錄目的MAC地址
和埠的對映關係。隨著主機間的通訊MAC表
會逐漸完整(記錄網路中所有MAC地址
和埠
的對映關係)
假設一個網路中有一臺交換機,那麼不同網路想要通訊只需將兩個網路的交換機連線起來,這時候只需使用MAC地址
即可實現跨網路通訊。但是,此時交換機會將所有其他網路的主機MAC地址
也記錄進表中,當網路數量
或網路中的主機數量
過多表就會太大導致交換機無法工作
上述問題的原因是人們不知道所連線到的交換機代表的網路中有多少主機,於是人們提出了轉發
的方案——當資料需要跨交換機(網路)
時,當前網路的交換機直接將資料轉發到相應網路的交換機中由其進行網路內的資料傳遞。為了解決交換機之間轉發資料的問題人們提出了路由器
的概念,交換機連線
在路由器上,當交換機發現目的MAC地址
不在本網路中時就將資料轉發給路由器,由路由器轉發到相應的交換機中。路由器位於網路層
路由器需要決定什麼樣的資料轉發給哪個交換機,如果仍然使用MAC地址
,那麼它需要建表記錄MAC地址
和埠
(交換機接在路由器埠)的對映關係,這會導致和交換機之間直接相連一樣的問題,另外由於MAC地址
的格式
問題,想要做到通配
也不容易,所以人們提出了IP地址
IP地址標識兩部分資訊:
- 網路編號:用於標識不同的網路
- 主機編號:用於標識同一網路中的不同主機
路由器會建立路由表
,使用子網掩碼
確定IP地址
的網路號
,據網路號查表
找到對應的埠(交換機)
進行轉發。子網掩碼的存在使得路由器可以對IP地址
進行通配
,這樣就不用為每一個IP地址
記錄埠對映關係,而是為一批IP地址
記錄對映關係
每個交換機都會記錄預設閘道器(路由器)
的地址,只要通過子網掩碼發現數據包目的地址不在本網路就轉發給路由器由其進行轉發
當然,網路與網路之間會存在多個路由器,各個路由器如何相互發現以及路由表如何建立就是另一個複雜的問題了,這裡不再展開
協作
下圖展示MAC地址
和IP地址
協作的例子,主機H1
和H2
位於不同的網路,網路間通過路由器相連,主機和路由器分別有自己的IP地址
和MAC地址
1. 主機H1傳送的資料分組包含自身的IP地址(IP1)和主機H2的IP地址(IP2),包含自身的MAC地址(MAC1)和路由器
R1的MAC地址(MAC3)
2. 路由器R1收到資料分組後根據目的IP地址(IP2)查錶轉發,同時將源MAC地址設定為自身埠的MAC地址(MAC4),
將目的MAC地址設定為R2的MAC地址(MAC5)
3. 路由器R2收到資料分組後根據目的IP地址(IP2)查錶轉發,同時將源MAC地址設定為自身埠的MAC地址(MAC6),
將目的MAC地址設定為H2的MAC地址(MAC2)
可以發現其實跨網路通訊就是一次次的網路內通訊組成的,在資料分組的轉發過程中源IP地址
和目的IP地址
是不變
的,但是MAC地址
隨著傳送方
和接收方
的改變而改變(或者說隨著網路的改變而改變),這也側面驗證了IP地址
用於跨網路
通訊,MAC地址
用於同一個網路
的通訊
不知道讀者有沒有考慮過這樣一個問題——IP地址
能實現跨網路通訊自然也能實現本網路間的通訊,那麼為什麼還需要MAC地址
呢?本人認為這跟網路的發展歷程有關,MAC地址
早於IP地址
,基於MAC
設計並實現了大量的演算法、協議和硬體裝置,想要取代MAC
並不是容易的事。另外,IP地址
的出現是為了解決跨網路通訊
時路由表過大的問題並不是為了取代MAC
,因此設計的時候也沒有為取代MAC
做過多考慮,因此在乙太網
中網路層的IP和資料鏈路層的MAC
就一直共存著。當然查資料的過程中發現有各種各樣的說法,但是本人還是認為這兩者才是主要原因。
ARP協議
ARP(Address Resolution Protocol)
協議用於解決知道IP地址
不知道MAC地址
的問題,比如交換機在配置預設閘道器時知道路由器的IP地
址,但是交換機給路由器轉發資料時在資料鏈路層需要將路由器的MAC地址
寫進幀首部,此時交換機沒有路由器的MAC地址
,那麼就需要使用ARP協議
來獲取路由器的MAC地址
網路中每臺主機都有ARP快取記憶體表
,在封裝幀時會查表找到目的IP地址
對應的MAC地址
,如果找不到則在網路中傳送廣播幀
網路中的主機收到幀後檢查請求幀中目的IP地址
是否為自身IP地址
,不是則丟棄幀,是則將廣播幀中的源IP地址
和MAC地址
記錄進自身ARP表
並返回單播響應幀
主機收到響應幀後將資訊記錄進自身ARP表
即可
ARP表中的記錄分為動態
記錄和靜態
記錄,動態記錄就如前文所述是通過廣播和響應獲取的,生命週期為2
分鐘,靜態記錄就是手動
設定的,生命週期不定。
額外提一下,在動態獲取記錄的時候是可能被攻擊
的,攻擊者只需要偽裝
自己是目的主機並返回構造好的幀就能汙染
受害者的ARP表
,使得資料被錯誤的傳送給攻擊者,這就是ARP攻擊