Linux

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

  • May 3, 2015

一位 Unix 專家告訴我,ip-multicast 使用乙太網多播(取決於 MAC 地址來傳播)而不是 IPv4 多播。

這是真的?它取決於核心或版本嗎?

我相信這裡存在術語混淆。事實上,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 將要求 256 倍於分配 OUI 的貨幣費用; IETF 不可能向 IEEE 支付這麼多錢,因此 IETF 選擇了一個明顯未使用且大小和對齊方式正確的塊並將其占用。

引用自:https://unix.stackexchange.com/questions/199883