MAC地址格式詳解
來源 https://www.cnblogs.com/daofaziran/p/12084358.html
以太網編址
在數據鏈路層,數據幀通常依賴於MAC地址來進行數據交換,它如同公網IP地址一樣要求具有全球唯一性,這樣才可以識別每一台主機。那么MAC地址如何做到這點?它的格式又是什么?
MAC地址,英文全稱Medium Access Control,直譯為介質訪問控制,它通常被固化在每個以太網網卡(NIC,Network Interface Card)。MAC(硬件)地址長48位(6字節),采用十六進制格式,下圖說明了48位的MAC地址及其組成部分。
示例: 00-01-6C-06-A6-29 或 00:01:6C:06:A6:29
組織唯一標識符(OUI)由IEEE(電氣和電子工程師協會)分配給廠商,它包含24位。廠商再用剩下的24位(EUI,擴展唯一標識符)為其生產的每個網卡分配一個全球唯一的全局管理地址,一般來說大廠商都會購買多個OUI。
I/G(Individual/Group)位,如果I/G=0,則是某台設備的MAC地址,即單播地址;如果I/G=1,則是多播地址(組播+廣播=多播)。
G/L(Global/Local,也稱為U/L位,其中U表示Universal)位,如果G/L=0,則是全局管理地址,由IEEE分配;如果G/L=1,則是本地管理地址,是網絡管理員為了加強自己對網絡管理而指定的地址。
對於I/G和G/L位的位置,目前有兩種說法,或者說兩種格式。
對於數據傳輸來說,數據是按每個字節中一位一位地傳輸的,一個字節傳輸完了才到下一個字節。
IEEE 802.3 :以太網介質訪問控制協議 (CSMA/CD)及物理層技術規范。
IEEE 802.4 :令牌總線網(Token-Bus)的介質訪問控制協議及物理層技術規范。
IEEE 802.5 :令牌環網(Token-Ring)的介質訪問控制協議及物理層技術規范。
IEEE 802.6 :城域網介質訪問控制協議DQDB (Distributed Queue Dual Bus 分布式隊列雙總線)及物理層技術規范。
第一種,每個字節的高位在前,低位在后,I/G位和G/L分別在字節中的最低位和次低位,最高位先發送,到了對端還是最高位
第二種,每個字節的低位在前,高位在后,I/G位和G/L分別在字節中的最低位和次低位,最低位先發送,到了對端還是最低位
兩種看似不一樣,但是結果還是一樣的,如果還是弄不懂可以再草稿紙上畫一畫,不難理解。
因為以太網線路上按“Big Endian”字節序傳送報文(也就是最高字節先傳送,關於字節序請參考相關文檔),而比特序是”Little Endian”(也就是最低位先傳送)。
注意圖上的第47bit,這一位表示MAC地址是全球唯一地址還是本地地址,0表示全球唯一地址,1表示本地唯一地址。這一位也叫G/L位。
對於網絡設備上固化的MAC地址,因為它唯一標識這個設備,所以只能是單播地址,也就是MAC幀里面的Source地址第48位只能0。
我們常說有2的48次方個MAC地址可供網絡設備使用,這些地址可以多到給地球上每一粒沙子分配一個地址,其實這個數量要打折扣的,因為MAC地址雖然有這么多,但真正用在網卡上並且全球唯一的只有2的46次方個:第48bit一定是0,第47bit一定是0。
這也就引出了一個有意思的現象:隨便找一台PC,觀察一下它的網卡地址,第1字節的十六進制數一般是4的倍數;查看一下IEEE分配的OUI(http://standards.ieee.org/develop/regauth/oui/oui.txt ),第1字節的十六進制數也一般是4的倍數(早期以太網沒有本地地址的概念,所以分配的OUI里面G/L bit也可能是1),這種情況下就不是4的倍數了,但肯定是2的倍數,因為第48位只能是0。
關於組播地址,有這么個誤解:MAC地址第1字節必須是0x01才表示組播地址,連TCP/IP詳解上也這么說(見中文版12.4.2第一段)。IEEE 802.3里面已經明確說明了只要第48bit是1就表示組播地址,所以無論MAC地址第1字節是0x01、0xC1或者是0x33都表示這個MAC地址是組播地址(以0x33開頭的表示IPV6對應的二層組播地址)。之所以有這樣的誤解,是因為到目前為止,大部分組播MAC地址的第1字節都是0x01。如:
01-80-C2-00-00-00(STP協議使用)
01-80-C2-00-00-01(MAC Control的PAUSE幀使用)
01-80-C2-00-00-02(Slow Protocol: 802.3ah OAM/ LACP 協議都用這個地址,這個地址很有故事,有多少軟件處理這個地址會出問題啊!)
01-00-5E-xx-xx-xx(IP組播地址對應的二層組播地址)。
目標MAC是組播MAC地址的以太網幀,只有交換機才會接收,而普通終端設備不會接收。
完整的列表見http://standards.ieee.org/develop/regauth/grpmac/public.html
之所以大部分組播地址都以01-80-C2和01-00-5E開頭,那是因為使用這些組播地址的協議都是帶頭大哥IEEE和IANA名下的,它們的OUI分別是00-80-C2和00-00-5E是,變成組播地址就是01-80-C2和01-00-5E了,當然,除了帶頭大哥霸占的這些組播地址,還有01-00-0C-CC-CC-CC這樣的地址,這個地址是Cisco霸占的,Cisco的OUI是00-00-0C。
===========
主機網卡應該接收的數據幀:
1. 目標MAC是自己的單播幀
2. 廣播幀
3. 加入組播對應的組播幀
讓網卡不檢查包的接收方地址,不管是不是自己的包都統統接收下來,這種模式就叫做混雜模式。
linux系統中網卡驅動收到報文后會檢查報文的目的mac地址,區分廣播,組播,和單播。如果是單播報文,則比較報文的目的mac地址是否和本網卡的mac一樣,如果不一樣則設置該報文為PACKET_OTHERHOST。在ip_rcv函數中將PACKET_OTHERHOST類型的報文直接丟棄。所以說混雜模式下網卡收到不是自己(僅限於本網卡)mac的報文,只會在鏈路層處理,不會到網絡層。詳細分析可以參考文檔:https://segmentfault.com/a/1190000021291692
ifconfig eth1 promisc ------ 開啟混雜模式
ifconfig eth1 -promisc ------ 關閉混雜模式
ifconfig eth1 | grep PROMISC ------ 查看是否開啟混雜模式
ip link set eth1 promisc on ------ 開啟混雜模式
ip link set eth1 promisc off ------ 關閉混雜模式
ip link show eth1 | grep PROMISC ------ 查看是否開啟混雜模式
以太網是載波偵聽(CSMA/CD)。什么意思。通俗一點講就是“一個人在點到,大家都在聽,點到自己才回答,沒有點自己別吭聲”。它是一種廣播鏈路,共享信道方式。
2、網絡包的過濾特性,過濾分兩層,首先是硬件過濾(HW Filter),隨后是軟件過濾(SW Filter)。上圖中主機B,C,D拒絕是指硬件過濾。它過濾判斷條件是MAC地址是否匹配,針對的是MAC地址,屬於OSI第二層--鏈路層的處理。 軟件過濾判斷條件是ip地址是否匹配。屬於OSI協議分層里面的第三層過濾。正是因為一些原來不會產生應答而在混雜模式下卻會產生應答的差異。提供了檢測混雜模式的手段。
上表是一個很經典的linux下過濾特性統計表格,其中gr bit 是指group bit,組播位。第一個字節的最低位為1的所有地址,例如01-12-0f-00-00-02。當然廣播地址 FF:FF:FF:FF:FF:FF 也屬於組播的一種。其中最后兩行在普通模式下沒有應答,而在混雜模式下有應答。所以可以利用最后兩行來檢測混雜模式。具體檢測時候填充的MAC地址如下表。使用紅圈兩行即可。
最后兩行屬於多播地址范圍(00:00:5e:00:00:00 - 00:00:5e:7f:ff:ff),參照上表,目的地址使用FF:FF:FF:FF:FF:FE或FF:FF:00:00:00:00即可不分windows還是linux,探測出是否開啟了混雜模式。
3、最后一步就是構造測試包,目前linux系統好像沒有現成的可以構造目的地址的工具,需要自己寫程序或使用第三方工具。可以構造一個arp包或者ip包,設置目的mac地址為上表紅圈中地址即可。
struct pack { unsigned char h_dest[ETH_ALEN];//目標mac地址,填寫FF:FF:FF:FF:FF:FE unsigned char h_source[ETH_ALEN];//源mac地址,及發送者本機mac unsigned short h_proto;//以太網包的類型,0x0806 arp或者 0x0800 ip包 ..... //arp 或 ip 包內容 }
參考代碼比較多,就要就是發包,我這里就不花大篇幅去書寫了,也可以參考http://ptool.googlecode.com/svn/trunk/
============= End