IP多播与广播
IPTV 机顶盒换台,运营商不需要给每台机顶盒单独发一路视频流——用多播,发一份,有需要的设备自己来”订阅”。
三种发送方式对比
| 方式 | 目标 | 地址 | 是否跨路由器 | 典型场景 |
|---|---|---|---|---|
| 单播(Unicast) | 一对一 | 具体 IP | 是 | HTTP、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.5 | OSPF 路由器 |
| 224.0.0.251 | mDNS(局域网设备发现) |
**临时组地址:**应用程序动态申请,用完释放。
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←