MAC地址格式详解

以太网编址

在数据链路层,数据帧通常依赖于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/GG/L位的位置,目前有两种说法,或者说两种格式。

对于数据传输来说,数据是按每个字节中一位一位地传输的,一个字节传输完了才到下一个字节。

第一种 ,每个字节的高位在前,低位在后,I/G G/L分别在字节中的最低位和次低位,最高位先发送,到了对端还是最高位

第二种 ,每个字节的低位在前,高位在后,I/G 位和G/L分别在字节中的最低位和次低位,最低位先发送,到了对端还是最低位

两种看似不一样,但是结果还是一样的,如果还是弄不懂可以再草稿纸上画一画,不难理解。

参考二:

MAC Address(Media Access Control Address)亦称为:硬件地址、物理地址(Physical Address)。一个MAC地址唯一指定一台设备,全球唯一,并且通常烧写在固件中。

结构

MAC地址如图所示,其前3字节表示OUI(Organizationally Unique Identifier),由IEEE的注册管理机构给不同厂家分配的代码,区分不同的厂家。后3字节由厂家自行分配。

MAC地址第一个字节的低第二位(b1)表示这个MAC地址是全局的还是本地的,即U/L(Universal/Local)位,如果为0,表示是全局地址。所有的OUI这一位都是0。

MAC地址第一个字节的低第一位(b0)表示这个MAC地址是单播还是多播。0表示单播。

部分OUI:

IEEE:00-80-C2

IANA:00-00-5E

Cisco:00-00-0C

特殊MAC地址

广播地址:

全F,在本VLAN内泛洪。

单播地址:

以00-00-5E开头:

00-01-00 to 00-01-FF VRRP (Virtual Router Redundancy Protocol) [RFC5798]

00-02-00 to 00-02-FF VRRP IPv6 (Virtual Router Redundancy Protocol IPv6) [RFC5798]

90-01-00 TRILL OAM [RFC7455]

组播地址:

只要第48bit是1就表示组播地址

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组播地址对应的二层组播地址)。

以01-00-5E开头:

00-00-00 to 7F-FF-FF IPv4 Multicast [RFC1112]

80-00-00 to 8F-FF-FF MPLS Multicast [RFC5332]

90-00-00 MPLS-TP p2p [RFC7213]

90-00-01 Bidirectional Forwarding Detection (BFD) on Link Aggregation Group (LAG) Interfaces [RFC7130]

90-01-00 TRILL OAM [RFC7455]

映射组播IP为组播MAC地址转换

IPv4组播MAC地址为IANA定义,前25位固定。而组播IP为D类IP地址,其前4位固定为1110b。将组播IP的低23位直接映射到MAC地址的低23位,即可与前面固定的25位组成一个48位的MAC地址。

由于组播IP还有5位没有映射到MAC地址中,因此组播MAC地址与组播IP不是一一映射,而是一对多的关系,一个组播MAC地址对应32位组播IP地址。

ip地址分类

A类 :00000000×××------01111111×××

0.0.0.0 ------ 127.255.255.255

B类 :10000000,00000000×××------10111111,11111111×××

128.0.0.0------191.255.255.255

C类 :11000000,00000000,0000000×××------11011111,1111111,1111111×××

192.0.0.0------223.255.255.255

D类 :11100000××------111011111××××

224.0.0.0------239.255.255.255 (组播地址)

E类 :11110000×××------11110111×××

240.0.0.0------247.255.255.255 (科学实验)

IP组播和单播的目的地址不同,IP组播的目的地址是组地址------D类地址.

组播IP地址是本地管理组播地址:239.0.0.0~239.255.255.255

D类地址是从224.0.0.0到239.255.255.255之间的IP地址

其中224.0.0.0到224.0.0.255是被保留的地址

224.0.0.1表示子网中所有的组播组

224.0.0.2表示子网中的所有路由器

224.0.0.5表示OSPF(Open Shortest Path First)路由器

224.0.0.6表示OSPF指定路由器

224.0.0.12表示DHCP(Dynamic Host Configuration Protocol)服务器.

224.0.0.0――224.0.0.255只能用于局域网中路由器是不会转发的

239.0.0.0――239.255.255.255是私有地址 (与192.168. *.*功能一样)

224.0.1.0---238.255.255.255可以用于Internet上。

如果你的主机开启了IRDp(Internet路由 发现协议,使用组播功能)功能,那么你的主机路由表中应该会有这样的一条路由。

2层的MAC地址是如何与3层的IP地址进行映射的呢?通过将MAC地址的前25位强行规定位01.00.5E,而后23位对应IP地址的后23位,而组播IP地址的前4位均相同如:

IP地址:1110yyyy.yxxxxxxx.xxxxxxx.xxxxxxxx

MAC地址:00000001.00000000.01011110.0xxxxxxx.xxxxxxx.xxxxxxxx

例如:组播IP地址224.215.145.230应该映射到下列哪个组播MAC地址?( )

(A) 01-00-5e-57-91-e6   (B) 01-00-5e-d7-91-e6

(C) 01-00-5e-5b-91-e6   (D) 01-00-5e-55-91-e6

用二进制来换算,将215.145.230换算成1101,0111,1001,0001,1110,0110,取最后23位放到MAC地址中的23位可以计算得出答案是A。

显然有32个IP地址(有5个y可以不一样)对应一个MAC地址,所以要避免在同一网络中使用的多个组播IP地址对应一个MAC地址。

相关推荐
安卓理事人3 小时前
安卓LinkedBlockingQueue消息队列
android
万能的小裴同学4 小时前
Android M3U8视频播放器
android·音视频
q***57745 小时前
MySql的慢查询(慢日志)
android·mysql·adb
JavaNoober5 小时前
Android 前台服务 "Bad Notification" 崩溃机制分析文档
android
城东米粉儿6 小时前
关于ObjectAnimator
android
zhangphil7 小时前
Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
android
火柴就是我8 小时前
从头写一个自己的app
android·前端·flutter
lichong9519 小时前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端
用户69371750013849 小时前
14.Kotlin 类:类的形态(一):抽象类 (Abstract Class)
android·后端·kotlin
火柴就是我9 小时前
NekoBoxForAndroid 编译libcore.aar
android