UDP 多播在 Unix 上的行为如何?

UDP 多播在 Unix 上的行为如何?

一位Unix专家告诉我,ip-multicast使用以太网多播(依靠MAC地址传播)而不是IPv4多播。

这是真的?它取决于内核或版本吗?

答案1

我认为这里存在术语混淆。事实上,IP层和链路层共同工作来实现组播工作。

对于 IPv4 和 IPv6,多播 IP 地址都映射到链路层多播 MAC 地址。有专用的、仅限多播的 MAC 地址。对于 IPv4,MAC 地址的形式为01:00:5e:xx:yy:zz;对于 IPv6,MAC 地址的形式为33:33:ww:xx:yy:zz

默认情况下,发送到这些 MAC 地址的帧会通过以太网交换机泛洪到 VLAN 中的所有端口,但作为优化,交换机可以实施 IGMP 侦听,以便根据哪些端口实际订阅了多播组来限制哪些端口接收帧。

当主机开始侦听多播组时,其以太网 MAC 层被编程为允许发送到适当 MAC 地址的帧通过。否则,除非处于混杂模式,否则以太网硬件将丢弃这些帧。

一旦主机收到多播帧(因为以太网交换机已转发该帧并且 MAC 层已允许该帧进入),IP 层就会查看 IP 地址并将数据包定向到适当的套接字。

有关专用组播 MAC 地址的详细信息

对不同的多播地址使用不同的 MAC 地址允许主机轻松地仅接收与该主机订阅的多播组关联的以太网帧(这意味着订阅该组的主机上至少有一个活动套接字)。其他的将在硬件中被有效地丢弃,无论是通过主机自己的以太网芯片,还是通过网络上的以太网交换机。

多播组的数量多于专用 MAC 地址的数量,因此实际上许多 IP 多播地址映射到同一 MAC 地址。这意味着上述过滤并不完美:当硬件配置为允许一个 MAC 地址时,这实际上允许发送到一组 IP 多播地址的数据包。即便如此,硬件仍会完成大部分过滤工作,因此效率足够高。

对于 IPv4,有 268435456 个 IP 多播地址,而只有 8388608 个 MAC 地址,因此映射为 32 比 1(每 32 个 IP 地址 1 个 MAC 地址)。请参阅 RFC 1112 第 6.4 节

对于 IPv6,有无数的 IP 多播地址和只有 4294967296 个 MAC 地址,因此映射是多对一的。请参阅 RFC 2464 第 7 节。如果使这种映射至少更接近 1 对 1 那就太好了,但 IPv6 地址空间的庞大规模使其不可能实现。很多年前,我口头上听说过一个故事,即使保留 32 位的 MAC 地址,也已经是一种压力了。故事是这样的,根据 IEEE 的 MAC 地址分配方案(IEEE 负责 MAC 地址的分配),该数量的 MAC 地址对应于 256 个 OUI 分配,并且 IEEE 将要求分配 OUI 的货币费用的 256 倍; IETF 不可能向 IEEE 支付这么多钱,因此 IETF 选择了一个明显未使用的大小和对齐方式正确的块,并将其占用。

相关内容