知识点编号: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广播和组播的关键点:
- 单播:一对一
- 广播:一对所有(局域网)
- 组播:一对组(需加入组)
- TCP不支持:只能UDP
记忆口诀:
单播打电话 📞
广播大喇叭 📢
组播发群消息 👥
TCP不支持 ❌
文档创建时间:2025-10-31