广播与多播
广播(Broadcast)
广播是一种一对多的通信方式,只有传输层协议为 UDP 时才支持(TCP 是端对端通信,不支持广播)。
广播地址
- 子网内广播地址:主机号全部为
1,格式为xxx.xxx.xxx.255(子网掩码决定主机号范围)。- 示例:
- 子网掩码
255.255.255.0,IP192.168.31.56→ 广播地址192.168.31.255。 - 子网掩码
255.255.128.0,IP192.168.31.56→ 广播地址192.168.127.255。子网掩码:11111111 11111111 10000000 00000000 IP 地址:11000000 10101000 00011111 00111000 广播地址:11000000 10101000 01111111 11111111 → 192.168.127.255 - 子网掩码
255.255.192.0,IP192.168.12.33→ 广播地址192.168.63.255。子网掩码:11111111 11111111 11000000 00000000 IP 地址:11000000 10101000 00001100 00100001 广播地址:11000000 10101000 00111111 11111111 → 192.168.63.255
- 子网掩码
- 示例:
- 全网广播地址:
255.255.255.255(可能引发网络风暴,实际意义有限)。
启用广播
需通过套接字选项显式开启:
c
int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));发送广播数据
发送时需指定广播地址:
c
struct sockaddr_in broadcast;
broadcast.sin_family = AF_INET;
broadcast.sin_port = htons(8899);
broadcast.sin_addr.s_addr = inet_addr("192.168.8.255"); // 子网广播地址
sendto(sockfd, buf, len, 0, (struct sockaddr*)&broadcast, sizeof(broadcast));接收广播数据
- Linux:接收端需绑定
INADDR_ANY(任意地址)才能接收广播数据。 - Windows:无需特殊绑定。
多播/组播(Multicast)
多播是一种折中的一对多通信方式,只有传输层协议为 UDP 时支持。与广播的区别:
- 广播:所有主机接收数据,可能引发广播风暴。
- 多播:仅加入特定多播组的主机接收数据,节省带宽。
多播地址
- IPv4 D 类地址:范围
224.0.0.0 ~ 239.255.255.255(最高位为1110)。
多播编程流程
创建 UDP 套接字:
cint sock = socket(AF_INET, SOCK_DGRAM, 0);加入多播组:
使用struct ip_mreq指定多播组和网卡:cstruct ip_mreq { struct in_addr imr_multiaddr; // 多播组地址(D 类地址) struct in_addr imr_interface; // 网卡 IP 地址 };示例:
cstruct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr("224.10.10.1"); // 多播组 mreq.imr_interface.s_addr = htonl(INADDR_ANY); // 任意网卡 setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*)&mreq, sizeof(mreq));数据通信:
- 发送端:
sendto()到多播组地址。 - 接收端:正常接收数据(需先加入多播组)。
- 发送端:
离开多播组:
csetsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, (void*)&mreq, sizeof(mreq)); close(sock);
路由配置(Linux)
需添加路由规则确保多播数据正常传输:
bash
route add -net 224.0.0.0 netmask 240.0.0.0 dev ens33 # 指定网卡
route add default gw 172.4.1.1 dev eth0 # 设置网关关键区别总结
| 特性 | 广播(Broadcast) | 多播(Multicast) |
|---|---|---|
| 地址范围 | 子网广播地址(如 192.168.1.255) | D 类地址(224.0.0.0~239.255.255.255) |
| 接收范围 | 同一子网所有主机 | 仅加入多播组的主机 |
| 带宽占用 | 高(可能引发广播风暴) | 低(按需接收) |
| 启用方式 | 设置 SO_BROADCAST 套接字选项 | 加入多播组(IP_ADD_MEMBERSHIP) |
| 适用场景 | 局域网内简单通知 | 跨子网高效分发(视频流、实时数据) |
