Skip to content

广播与多播

广播(Broadcast)

广播是一种一对多的通信方式,只有传输层协议为 UDP 时才支持(TCP 是端对端通信,不支持广播)。

广播地址
  • 子网内广播地址:主机号全部为 1,格式为 xxx.xxx.xxx.255(子网掩码决定主机号范围)。
    • 示例:
      • 子网掩码 255.255.255.0,IP 192.168.31.56 → 广播地址 192.168.31.255
      • 子网掩码 255.255.128.0,IP 192.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,IP 192.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)。
多播编程流程
  1. 创建 UDP 套接字

    c
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
  2. 加入多播组
    使用 struct ip_mreq 指定多播组和网卡:

    c
    struct ip_mreq {  
        struct in_addr imr_multiaddr; // 多播组地址(D 类地址)  
        struct in_addr imr_interface; // 网卡 IP 地址  
    };

    示例:

    c
    struct 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));
  3. 数据通信

    • 发送端:sendto() 到多播组地址。
    • 接收端:正常接收数据(需先加入多播组)。
  4. 离开多播组

    c
    setsockopt(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.255D 类地址(224.0.0.0~239.255.255.255
接收范围同一子网所有主机仅加入多播组的主机
带宽占用高(可能引发广播风暴)低(按需接收)
启用方式设置 SO_BROADCAST 套接字选项加入多播组(IP_ADD_MEMBERSHIP
适用场景局域网内简单通知跨子网高效分发(视频流、实时数据)

知识如风,常伴吾身