引言

MAC地址是网络中一个很基础的概念,基础到大多数人都知道它是什么,但是却难以深入的描述它(就像时间一样)。本文先主要了解一下关于MAC地址的相关概念,后面会将结合其他网络知识再次详细补充MAC地址的知识。

什么是MAC地址

MAC地址(Media Access Control Address),我们一般将其称为物理地址硬件地址
人们主要用它来标记和确认网络设备的位置。
MAC地址属于OSI模型中的数据链路层。
MAC地址用于最初用于表示网络中的硬件接口(主要指网卡),现在也用于识别其他设备(如蓝牙),甚至是软件。
在生产网卡时,网络设备制造商会将MAC地址烧录在EPROM(一种闪存芯片,通常可以通过程序擦写)。

MAC地址长什么样

MAC地址长度为48bit,6个字节,一般用16进制表示,并用冒号或者连接号将每个字节分割开来,比如:fa:16:3e:6c:78:25fe-dc-ba-12-34-56,也可表示为三个由点号分隔的四个16进制数字,如0123.4567.890a
第1个字节的最低有效位(LSB)为单播地址(值为0)/多播地址(值为1)。
第1个字节从LSB去数,第2位为通用管理地址(UAA,值为0)/本地管理地址(LAA,值为1)。
前3个字节通常合起来称为OUI(Organizationally Unique Identifier, 组织唯一标识符)。
前3~24位由IEEE分配给网络硬件制造商,且不重复;后3个字节由网络设备生产商自行指定且不重复。通俗一点来讲,只要不更改自己的MAC地址,MAC地址在世界上就是唯一的。

在虚拟化技术中,像QEMUXen这样的管理程序有自己的 OUI。最后3个字节将被分配为在本地网络上唯一的值,每个新的虚拟机都使用一个 MAC 地址。 另外,由于MAC地址可能被更改,实际上可能存在MAC相同的设备,但是只要两个 MAC 地址是属于不同的数据链路层就不会出现问题。

几个特殊的地址:

  • ff:ff:ff:ff:ff:ff是广播地址。
  • 01:xx:xx:xx:xx:xx是多播地址。
  • 01:00:5e:xx:xx:xx是IPv4多播地址。

    怎么查看MAC地址

    我们以Linux系统为例,可以通过ifconfig命令来查看,不过ifconfig命令有被废弃的趋势,推荐使用ip命令来查看。MAC地址为HWaddrether字段的值。
    此外MAC地址也会被系统写入/sys/class/net/xxx/address文件中,其中的xxx为网卡名称。
    参考以下几个命令:
    1. ifconfig
    2. ip addr show
    3. cat /sys/class/net/xxx/address # xxx为网卡名称
    结果示例:
    1. $ ip addr show
    2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    4. inet 127.0.0.1/8 scope host lo
    5. valid_lft forever preferred_lft forever
    6. inet6 ::1/128 scope host
    7. valid_lft forever preferred_lft forever
    8. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    9. link/ether fa:16:3e:6c:78:25 brd ff:ff:ff:ff:ff:ff
    10. inet 10.248.135.114/22 brd 10.248.135.255 scope global eth0
    11. valid_lft forever preferred_lft forever
    12. inet6 fdbd:dc03:ff:1:1:248:135:114/128 scope global
    13. valid_lft forever preferred_lft forever
    14. inet6 fe80::f816:3eff:fe6c:7825/64 scope link
    15. valid_lft forever preferred_lft forever
    16. $ cat /sys/class/net/eth0/address
    17. fa:16:3e:6c:78:25

    怎么修改MAC地址

    当然,我们也可以通过命令来修改MAC地址,不过,修改MAC地址是一种非常危险的行为,除非你知道你在做什么,否则不要去修改。
    通常修改MAC地址时是需要管理员权限的,我们可以通过ifconfig命令或者ip命令(推荐)来修改,修改的时候网卡会临时不可用,所以不建议远程连接的情况下操作。
    1. ifconfig xxx down # 禁用网卡,xxx为网卡名称,下同
    2. ifconfig xxx hw ether fa:12:34:56:78:90 # 修改该网卡的MAC地址
    3. ifconfig xxx up # 启动网卡
    1. ip link set dev xxx down
    2. ip link set dev xxx address fa:12:34:56:78:90
    3. ip link set dev xxx up
    上面的方式均是临时修改MAC地址,系统重启后又将会恢复原来的值。如果需要永久修改,可以将上面的命令追加到/etc/rc.d/rc.local文件末尾,这样每次系统重启都会执行这几条命令。即便如此,也只是通过软件的方式去模拟修改了MAC地址,网卡中的真实地址还是原来的值,只能通过硬件方式擦除和修改。

    后记

    目前关于MAC地址的介绍就到这里,后面主要会介绍MAC地址的工作原理,在其他诸如ARP协议、VLAN等话题中也会有所涉及,敬请期待。