📡 UDP广播和组播:一对多的通信方式

6 阅读4分钟

知识点编号:019
难度等级:⭐⭐(了解)
面试频率:🔥🔥🔥


🎯 一句话总结

广播像大喇叭喊话(所有人都听到),组播像群发消息(只有群成员收到)!📢


🤔 三种通信方式

1. 单播(Unicast)📞

一对一通信

发送方 ─────> 接收方

例子:打电话
你打给朋友,只有朋友能接到

TCP和UDP都支持

2. 广播(Broadcast)📢

一对所有通信

        ┌──> 设备1
        ├──> 设备2
发送方 ──┼──> 设备3
        ├──> 设备4
        └──> 设备5

例子:教室里用喇叭喊话
所有人都能听到

只有UDP支持!TCP不支持!

3. 组播/多播(Multicast)👥

一对组通信

        ┌──> 组成员1
        ├──> 组成员2
发送方 ──┤
        ❌ 非成员(收不到)
        ❌ 非成员(收不到)

例子:微信群发消息
只有群成员能收到

只有UDP支持!

📡 广播实现

广播地址

受限广播:255.255.255.255
- 只在本地子网广播
- 不会跨路由器

直接广播:192.168.1.255
- 向指定子网广播
- 例如:192.168.1.0/24的广播地址是192.168.1.255

Java代码示例

// 广播发送方
public class UDPBroadcastSender {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket();
        
        // 启用广播
        socket.setBroadcast(true);
        
        String message = "Hello Everyone!";
        byte[] data = message.getBytes();
        
        // 广播地址:255.255.255.255
        InetAddress broadcastAddr = InetAddress.getByName("255.255.255.255");
        DatagramPacket packet = new DatagramPacket(
            data, data.length, broadcastAddr, 9999
        );
        
        // 发送广播
        socket.send(packet);
        System.out.println("📢 广播消息:" + message);
        
        socket.close();
    }
}

// 广播接收方
public class UDPBroadcastReceiver {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(9999);
        
        System.out.println("👂 监听广播消息...");
        
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        
        while (true) {
            socket.receive(packet);
            String message = new String(packet.getData(), 0, packet.getLength());
            System.out.println("📥 收到广播:" + message);
            System.out.println("   来自:" + packet.getAddress());
        }
    }
}

👥 组播实现

组播地址

组播IP范围:224.0.0.0 ~ 239.255.255.255

分类:
224.0.0.0 ~ 224.0.0.255:本地链路
224.0.1.0 ~ 238.255.255.255:用户可用
239.0.0.0 ~ 239.255.255.255:本地管理组播

常用:
224.0.0.1:所有主机
224.0.0.2:所有路由器
224.0.1.1:NTP时间同步

Java代码示例

// 组播发送方
public class UDPMulticastSender {
    public static void main(String[] args) throws Exception {
        MulticastSocket socket = new MulticastSocket();
        
        String message = "Hello Group!";
        byte[] data = message.getBytes();
        
        // 组播地址
        InetAddress group = InetAddress.getByName("224.0.0.1");
        DatagramPacket packet = new DatagramPacket(
            data, data.length, group, 9999
        );
        
        // 发送组播
        socket.send(packet);
        System.out.println("👥 发送组播:" + message);
        
        socket.close();
    }
}

// 组播接收方
public class UDPMulticastReceiver {
    public static void main(String[] args) throws Exception {
        MulticastSocket socket = new MulticastSocket(9999);
        
        // 加入组播组
        InetAddress group = InetAddress.getByName("224.0.0.1");
        socket.joinGroup(group);
        System.out.println("✅ 已加入组播组:" + group);
        
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        
        while (true) {
            socket.receive(packet);
            String message = new String(packet.getData(), 0, packet.getLength());
            System.out.println("📥 收到组播:" + message);
        }
        
        // 离开组播组
        // socket.leaveGroup(group);
    }
}

🎯 应用场景

广播应用

1. 设备发现 🔍
   - 局域网内发现打印机
   - 智能家居设备发现
   - Chromecast设备发现

2. DHCP分配 🌐
   - 客户端广播:我要IP地址
   - DHCP服务器响应

3. ARP协议 📍
   - 广播:谁的IP是192.168.1.1?
   - 对应设备响应MAC地址

示例代码:设备发现
String message = "DISCOVER";
InetAddress broadcast = InetAddress.getByName("255.255.255.255");
// 发送广播
// 所有设备收到后响应

组播应用

1. IPTV 📺
   - 视频直播
   - 一份数据,多个观众

2. 在线会议 👥
   - 多人视频会议
   - 路由器复制数据给参会者

3. 股票行情 📈
   - 实时推送行情
   - 订阅者收到更新

4. 网络游戏 🎮
   - 同一区域玩家
   - 位置更新组播

优势:
发送方:只发一份数据
路由器:自动复制给组成员
节省带宽!

🐛 常见面试题

Q1:UDP广播和组播的区别?

答案:

广播(Broadcast):
- 一对所有
- 地址:255.255.255.255
- 所有设备都收到
- 只在局域网内
- 不能跨路由器

组播(Multicast):
- 一对组
- 地址:224.0.0.0-239.255.255.255
- 只有组成员收到
- 可以跨路由器(需要路由器支持)
- 需要加入组(joinGroup)

对比:
广播:大喇叭喊话,所有人都听到
组播:微信群消息,只有群成员收到

使用场景:
广播:设备发现、DHCP、ARP
组播:IPTV、视频会议、游戏

选择:
- 局域网设备发现 → 广播
- 多人视频会议 → 组播

Q2:TCP为什么不支持广播和组播?

答案:

原因:

1. TCP是面向连接的
   - 需要三次握手建立连接
   - 一对一的连接
   - 无法一对多

2. TCP需要确认应答
   - 每个包都要ACK
   - 如果100个接收方,要收100个ACK?
   - 不现实

3. TCP有流量控制
   - 根据接收方窗口调整速度
   - 100个接收方,100个窗口?
   - 无法实现

4. TCP保证顺序
   - 序列号机制
   - 一对多时无法保证所有人的顺序

结论:
TCP的可靠性机制决定了只能一对一
广播和组播需要UDP实现

如果需要可靠的多播?
- 在UDP组播基础上
- 应用层实现可靠性
- 例如:可靠组播协议(RMP)

🎓 总结

UDP广播和组播的关键点:

  1. 单播:一对一
  2. 广播:一对所有(局域网)
  3. 组播:一对组(需加入组)
  4. TCP不支持:只能UDP

记忆口诀

单播打电话 📞
广播大喇叭 📢
组播发群消息 👥
TCP不支持 ❌

文档创建时间:2025-10-31