关于单播,多播和广播
简介
一个制造商在生产制造网卡之前,必须先向 IEEE 注册,以获取到一个长度为 24bit 的厂商代码,也称为 OUI(Organizationally-Unique Identifier)。制造商在生产制造网卡的过程中,会往每一块网卡的 ROM 中烧入一个 48bit 的 BIA(Burned-In Address,固化地址)地址,BIA 地址的前 3 个字节就是该制造商的 OUI,后 3 个字节由该制造商自己确定,但不同的网卡,其 BIA 地址的后 3 个字节不相同。烧入进网卡的 BIA 地址是不能被更改的,只能被读取出来使用。如下图所示地址的格式。
注意,BIA 地址只是 MAC 地址的一种,更准确的说,BIA 地址是一种单播 MAC 地址。MAC 地址共分为 3 种,分别为单播 MAC 地址、组播 MAC 地址、广播 MAC 地址。这 3 种 MAC 地址的定义分别如下:
1)单播(unicast)表示一对一,其 MAC 地址第一个字节的最低位是 0。
2)组播(multicast)表示一对多,其MAC 地址第一个字节的最低位是 1 。
3)广播(broadcast)表示一对全体,其MAC 地址每个比特都是 1 。广播 MAC 地址是组播 MAC 地址的一个特例。
一个单播 MAC 地址(例如 BIA 地址)标识了一块特定的网卡;一个组播 MAC 地址标识的是一组网卡;广播 MAC 地址是组播 MAC 地址的一个特例,它标识了所有的网卡。从上图我们可以发现,并非一个 MAC 地址的前 3 个字节都是 OUI,只有单播 MAC 地址的前 3 个字节才是 OUI,而组播或广播 MAC 地址的前 3 个字节一定不是 OUI。特别需要说明的是,OUI 的第一个字节的最低位一定是 0。
MAC 地址举例
关于组播地址,有这么个误解:MAC地址第1字节必须是0x01才表示组播地址,连TCP/IP详解上也这么说(见中文版12.4.2第一段)。之所以有这样的误解,是因为到目前为止,大部分组播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组播地址对应的二层组播地址)。
之所以大部分组播地址都以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。
IEEE 802.3规定第48bit(2012-04-11修改为The first bit) 是1就表示组播地址,如果这一位是0,表示此MAC地址是单播地址,如果这位是1,表示此MAC地址是多播地址。见IEEE 802.3 3.2.3 Address fields: “The first bit (LSB) shall be used in the Destination Address field as an address type designation bit to identify the Destination Address either as an individual or as a group address. If this bit is 0, it shall indicate that the address field contains an individual address. If this bit is 1, it shall indicate that the address field contains a group address that identifies none, one or more, or all of the stations connected to the LAN. In the Source Address field, the first bit is reserved and set to 0.”
以太网线路上按“Big Endian”字节序传送报文(也就是最高字节先传送,关于字节序请参考相关文档),而比特序是”Little Endian”(也就是最低位先传送)。一个十六进制表示法表示的MAC地址01-80-C2-00-00-00,传送时的bit顺序就是:1000 0000 0000 0001 0100 0011 0000 0000 0000 0000 0000 0000。
所以无论MAC地址第1字节是0x01、0xC1或者是0x33都表示这个MAC地址是组播地址(以0x33开头的表示IPV6对应的二层组播地址)。
组播MAC和组播IP的映射
IANA规定,IPv4组播MAC地址的高24位为0x01005E,第25位为0,低23位为IPv4组播地址的低23位。IPv4组播地址与MAC地址的映射关系如图所示。
[图片上传失败...(image-51c517-1567050011749)]
IPv4组播地址的高4位是1110,代表组播标识,而低28位中只有23位被映射到IPv4组播MAC地址,这样IPv4组播地址中就有5位信息丢失。于是,就有32个IPv4组播地址映射到了同一个IPv4组播MAC地址上,因此在二层处理过程中,设备可能要接收一些本IPv4组播组以外的组播数据,而这些多余的组播数据就需要设备的上层进行过滤了。
附录:
查看IEEE分配的OUI
IEEE制定的组播地址表
参考:
http://blog.sina.com.cn/s/blog_3df962a30100kzci.html
https://www.cnblogs.com/lifan3a/articles/6650936.html