组播 MAC 地址为什么只有 23 位能使用呢?据说是有一个很有趣的故事:Steve Deering 在研究 IP 组播时想向 IEEE 申请 16 个 OUIs(Organizational Unique Identifiers),每个 OUI 占有 24 位地址空间,这样总共就有 16 * 2^24 个 MAC 组播地址,这样正好就能够和 IPv4 组播地址一一对应。但是每个 OUI 需要花费 $1000,Steve 的经理觉得很贵,因此只买了一个 OUI(24位),并且只给 Steve 一半的地址空间(23 位)用于组播研究。
因此,每一个 IPv4 组播地址有 28 个有效位可以使用,而 MAC 组播地址中只有 23 个有效位可以使用,那么如何完成这两者之间的映射呢?方法就是:将 IPv4 IP 地址中的最后 23 位映射到 MAC 组播地址的后 23 位,这样得到的 MAC 组播地址也就是该 IPv4 组播地址对应的 MAC 地址。这样也造成每 32 个组播 IPv4 地址会映射到同一个 MAC 组播地址。
举一个例子,对于 IPv4 组播地址 224.11.1.2 而言,其对应的 MAC 组播地址即为 01:00:5E:0B:01:02:
# get common 23 bit of mac and ip address for value in$mac_addr do # ignore first 24 bit in mac addr if [ $count -lt 3 ]; then count=$((count + 1)) continue; fi
value=$(echo"ibase=16; $value" | bc) byte=$(($value & ${ip_mask[$count]})) # get binary format binary_byte=$(echo"obase=2; $byte" | bc) # padding leading zero binary_byte=$(printf"%08s"$binary_byte | tr' ''0') ipaddr_23_bit=${ipaddr_23_bit}${binary_byte} count=$((count + 1)) done
IFS=$OLDIFS # always skip first bit of ipaddr_23_bit ipaddr_23_bit=${ipaddr_23_bit:1}
# generate 32 multicast ip address for value in `seq 0 31` do ipaddr_5_bit=$(echo"obase=2; $value" | bc) # padding leading zero ipaddr_5_bit=$(printf"%05s"$ipaddr_5_bit | tr' ''0')
if check_ip_valid $1 ; then ip_to_mac $1 elif check_mac_valid $1 ; then mac_to_ip $1 else echo"Usage: $0 ip address(224.0.0.0) or mac address(01:00:5E:00:00:00)" exit 1 fi