IP多播与广播

← 返回 MOC | ← 主页

IPTV 机顶盒换台,运营商不需要给每台机顶盒单独发一路视频流——用多播,发一份,有需要的设备自己来”订阅”。


三种发送方式对比

方式目标地址是否跨路由器典型场景
单播(Unicast)一对一具体 IPHTTP、TCP 连接
广播(Broadcast)一对所有255.255.255.255否(默认不跨)DHCP、ARP
多播(Multicast)一对一组224.0.0.0 ~ 239.255.255.255是(需路由器支持)视频直播、IPTV、设备发现

广播

广播发给局域网内所有设备,路由器默认不转发广播包(防止广播风暴蔓延到整个互联网)。

**受限广播:**目的 IP 255.255.255.255,只在本地链路广播,路由器一定不转发。

**直接广播:**目的 IP 是某个网络的广播地址(主机位全 1),如 192.168.1.255。路由器可以配置是否转发。

广播的使用场景:

  • DHCP Discover:设备上线时广播寻找 DHCP 服务器
  • ARP 请求:广播询问某个 IP 对应的 MAC 地址
  • 局域网设备发现:某些协议用广播宣告自己的存在

**广播风暴:**如果网络里有环路,广播包会被无限转发,占满带宽。VLAN 可以隔离广播域,把广播限制在一个 VLAN 内,不影响其他 VLAN。


多播(组播)

多播只发给”订阅”了某个多播组的设备,比广播精准,比单播省带宽。

**D 类地址:**224.0.0.0 ~ 239.255.255.255,专门用于多播。

知名多播地址(永久组地址):

地址含义
224.0.0.1本地所有主机
224.0.0.2本地所有路由器
224.0.0.5OSPF 路由器
224.0.0.251mDNS(局域网设备发现)

**临时组地址:**应用程序动态申请,用完释放。


IGMP:加入和退出多播组

主机通过 IGMP(互联网组管理协议)告诉路由器”我要加入/退出这个多播组”。

工作流程:

主机想收某个多播流(如 IPTV 某频道)
  → 发 IGMP Report 给路由器:"我要加入 224.x.x.x 这个组"
  → 路由器开始把这个多播流转发到这个接口

主机换台(退出这个组)
  → 发 IGMP Leave 给路由器
  → 路由器查询这个接口还有没有其他成员
  → 没有了就停止转发

路由器定期发 IGMP Query
  → 询问"还有人在这个组吗?"
  → 有成员的主机回 IGMP Report

IGMPv1/v2/v3 的演进:

  • v1:只能加入,不能主动退出
  • v2:增加了 Leave Group 消息,退出更快
  • v3:支持指定源多播(SSM),只接收特定源发来的多播流

嵌入式场景

**视频监控推流:**摄像头用 RTP/UDP 多播推流,多个客户端同时收,带宽只用一份。

**mDNS 设备发现:**局域网内设备互相发现,不需要 DNS 服务器。地址是 224.0.0.251,端口 5353。Apple 的 Bonjour、Linux 的 Avahi 都用这个。嵌入式设备可以用 mDNS 宣告自己的服务(如 mydevice.local)。

**工业协议:**EtherNet/IP、PROFINET 用多播传输实时控制数据。

Linux 下加入多播组的代码:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
int sock = socket(AF_INET, SOCK_DGRAM, 0);
 
struct ip_mreq mreq;
inet_pton(AF_INET, "224.0.0.251", &mreq.imr_multiaddr);  // 多播组地址
mreq.imr_interface.s_addr = INADDR_ANY;                   // 使用默认网卡
 
// 加入多播组
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
 
// 退出多播组
setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));

笔试题直击

Q:广播和多播的区别,各自适用场景

广播发给局域网内所有设备,不跨路由器,适合 DHCP/ARP 这种需要”问所有人”的场景;多播只发给订阅了某个组的设备,可以跨路由器(需要路由器支持 IGMP),适合视频直播、IPTV 这种”一对多但不是所有人”的场景。

Q:为什么多播比广播更适合跨网段场景?

广播路由器默认不转发,只能在本地局域网内用。多播通过 IGMP 和多播路由协议(如 PIM),可以跨越多个路由器,把流量精准送到有需要的网段,不会打扰不需要的设备。

Q:什么是多播?在嵌入式系统中的应用?

多播是一对多的通信方式,发送方只发一份数据,网络负责复制并送到所有订阅了该多播组的接收方。嵌入式中常用于:视频监控推流(RTP多播)、局域网设备发现(mDNS,224.0.0.251)、工业实时控制协议(EtherNet/IP)。


如果你正在跟随梳理, 返回 MOC←