关于网络MAC地址

一个MAC地址问题

经常会遇到客户反馈这样的问题:在进行以太网MAC地址设置测试(随便写的MAC地址),发现有时候MAC地址会变成随机的MAC地址。

原因: MAC地址的第一个字节的最后一位是用来区分是多播还是单播的,0为单播,1为多播,我们的电脑或是设备的网卡都是单播的,所以不能为1。
一般网卡驱动都会去校验,如果校验为多播地址则认为是不符合规范的地址,就会生成一个随机MAC。

相关代码如下(include/linux/etherdevice.h):

static inline bool is_multicast_ether_addr(const u8 *addr)
{
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
	u32 a = *(const u32 *)addr;
#else
	u16 a = *(const u16 *)addr;
#endif
#ifdef __BIG_ENDIAN
	return 0x01 & (a >> ((sizeof(a) * 8) - 8));
#else
	return 0x01 & a;
#endif
}

/**
 * is_valid_ether_addr - Determine if the given Ethernet address is valid
 * @addr: Pointer to a six-byte array containing the Ethernet address
 *
 * Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not
 * a multicast address, and is not FF:FF:FF:FF:FF:FF.
 *
 * Return true if the address is valid.
 *
 * Please note: addr must be aligned to u16.
 */
static inline bool is_valid_ether_addr(const u8 *addr)
{
	/* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to
	 * explicitly check for it here. */
	return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr);
}

MAC地址说明

MAC 地址(Media Access Control Address,媒体访问控制地址)是网络设备的唯一硬件标识符,用于在局域网(LAN)中识别设备。它是一个 48 位的地址,通常表示为 12 个十六进制字符,格式为 XX:XX:XX:YY:YY:YYXX-XX-XX-YY-YY-YY

MAC 地址的结构

MAC 地址由两部分组成:

  1. 前 24 位(XX:XX:XX )

    • 称为 OUI(Organizationally Unique Identifier,组织唯一标识符),用于标识设备制造商。
    • 由 IEEE 分配,每个制造商有唯一的 OUI。
  2. 后 24 位(YY:YY:YY )

    • 由制造商分配,用于标识具体的设备。
    • 确保同一制造商生产的设备具有唯一的 MAC 地址。

MAC 地址的类型

MAC 地址分为三种类型:

  1. 单播地址(Unicast Address):

    • 用于标识唯一的网络设备。
    • 第一个字节的最低有效位(LSB)为 0。
  2. 多播地址(Multicast Address):

    • 用于标识一组设备。
    • 第一个字节的最低有效位(LSB)为 1。
  3. 广播地址(Broadcast Address):

    • 用于向局域网中的所有设备发送数据。
    • 固定为 FF:FF:FF:FF:FF:FF

MAC 地址的作用

  • 设备识别: 在局域网中唯一标识设备。
  • 数据帧传输: 用于以太网帧的源地址和目的地址。
  • 网络管理: 用于设备分类、策略配置和故障排查。
  • 安全审计: 检测未知设备或潜在威胁。

MAC 地址的应用场景

  • ARP 协议: 将 IP 地址映射到 MAC 地址。
  • 交换机转发: 交换机根据 MAC 地址表转发数据帧。
  • 网络安全: 通过 MAC 地址过滤设备。
  • 设备管理: 识别和管理网络中的设备。

常见问题

Q1:MAC 地址会重复吗?

  • 理论上,每个 MAC 地址是唯一的。但由于某些原因(如伪造或配置错误),可能会出现重复。

Q2:MAC 地址可以被追踪吗?

  • 在局域网中,MAC 地址可以被追踪。但在互联网中,MAC 地址不会跨路由器传输。

Q3:如何保护 MAC 地址隐私?

  • 使用随机化 MAC 地址功能(如 iOS 和 Android 提供的功能)。
  • 在公共 Wi-Fi 中禁用 MAC 地址广播。