知识点编号:016
难度等级:⭐⭐(必掌握)
面试频率:🔥🔥🔥🔥
🎯 一句话总结
UDP就像顺丰特快:速度快,但不保证一定送到!🚀
🤔 UDP的核心特点
1. 无连接 🔓
TCP:打电话
- 先拨号(三次握手)
- 确认接通
- 开始说话
- 挂电话(四次挥手)
UDP:喊话
- 直接喊出去
- 不管对方在不在
- 不需要握手
- 也不需要挥手
2. 不可靠 ⚠️
UDP不保证:
❌ 数据一定到达
❌ 数据按序到达
❌ 数据不重复
❌ 数据不损坏(虽有校验,但可选)
发送3个包:
发送:包1、包2、包3
接收:包1、❌、包3(包2丢了)
或者:包3、包1、包2(乱序了)
或者:包1、包1、包2(重复了)
UDP:我发了就不管了!🤷
3. 面向数据报 📦
UDP有消息边界!
发送:
send("Hello")
send("World")
接收:
recv() → "Hello"
recv() → "World"
✅ 每个send()对应一个独立的数据报
✅ 不会粘包!
❌ 但可能丢包、乱序
对比TCP:
TCP无边界,可能收到"HelloWorld"(粘包)
UDP有边界,一定是分开的
4. 头部小 🎒
UDP头部:8字节
+--------+--------+
| 源端口 | 目标端口 | 4字节
+--------+--------+
| 长度 | 校验和 | 4字节
+--------+--------+
TCP头部:至少20字节
开销对比:
UDP:8字节
TCP:20-60字节
发送100字节数据:
UDP:108字节(开销7.4%)
TCP:120字节(开销20%)
小数据传输时,UDP效率更高!
5. 速度快 ⚡
为什么快?
1. 无连接开销
- 不需要三次握手
- 不需要四次挥手
- 节省时间
2. 无流量控制
- 不管接收方能不能处理
- 直接发!
3. 无拥塞控制
- 不管网络拥不拥塞
- 直接发!
4. 无重传机制
- 不等ACK
- 不重传
- 直接发!
结果:速度快,但可能丢包
6. 支持一对多 📡
UDP支持:
✅ 单播(一对一)
✅ 广播(一对所有)
✅ 组播(一对组)
TCP只支持:
✅ 单播(一对一)
示例:
局域网广播:
UDP发送到255.255.255.255
所有设备都能收到!
视频直播:
服务器发一份数据
路由器复制给多个观众
节省带宽!
📊 UDP vs TCP 对比
| 特性 | UDP 🚀 | TCP 🐌 |
|---|---|---|
| 连接 | 无连接 | 面向连接 |
| 可靠性 | 不可靠 | 可靠 |
| 速度 | 快 | 慢 |
| 顺序 | 不保证 | 保证 |
| 边界 | 有(数据报) | 无(字节流) |
| 头部 | 8字节 | 20-60字节 |
| 应用 | 视频、游戏、DNS | HTTP、文件传输 |
💻 Java代码示例
UDP发送方
public class UDPSender {
public static void main(String[] args) throws Exception {
// 创建UDP Socket(无需连接)
DatagramSocket socket = new DatagramSocket();
// 准备数据
String message = "Hello UDP!";
byte[] data = message.getBytes();
// 创建数据报
InetAddress address = InetAddress.getByName("localhost");
DatagramPacket packet = new DatagramPacket(
data, // 数据
data.length, // 长度
address, // 目标地址
9999 // 目标端口
);
// 发送(直接发,不管对方在不在)
socket.send(packet);
System.out.println("已发送:" + message);
// 关闭
socket.close();
}
}
UDP接收方
public class UDPReceiver {
public static void main(String[] args) throws Exception {
// 创建UDP Socket并绑定端口
DatagramSocket socket = new DatagramSocket(9999);
System.out.println("UDP服务器启动,监听9999端口");
// 准备接收缓冲区
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() +
":" + packet.getPort());
}
}
}
🐛 常见面试题
Q1:UDP的特点是什么?
答案:
UDP(User Datagram Protocol)的特点:
1. 无连接
- 不需要建立连接
- 直接发送数据
2. 不可靠
- 不保证数据到达
- 不保证顺序
- 不保证不重复
3. 面向数据报
- 有消息边界
- 不会粘包
- 每个send()是独立的数据报
4. 头部小(8字节)
- 开销低
- 效率高
5. 速度快
- 无握手挥手
- 无流量控制
- 无拥塞控制
- 无重传
6. 支持广播和组播
- 一对多通信
- 适合直播、广播
适用场景:
✅ 实时性要求高(视频、游戏)
✅ 可以容忍丢包(语音通话)
✅ 小数据传输(DNS查询)
✅ 广播通信(局域网发现)
Q2:UDP为什么比TCP快?
答案:
UDP快的原因:
1. 无连接建立开销
TCP:三次握手(1.5 RTT)
UDP:0开销,直接发
2. 无连接释放开销
TCP:四次挥手(2 RTT)
UDP:0开销,发完就走
3. 无确认和重传
TCP:等待ACK,超时重传
UDP:发了就不管了
4. 无流量控制
TCP:根据接收窗口调整速度
UDP:全速发送
5. 无拥塞控制
TCP:慢启动、拥塞避免
UDP:不管网络状况,直接发
6. 头部更小
UDP:8字节
TCP:20-60字节
速度对比(示例):
场景:传输1MB数据,RTT=50ms
TCP时间 ≈ 75ms(握手) + 传输时间 + 100ms(挥手) + ACK延迟
UDP时间 ≈ 传输时间
小文件传输时,UDP可能快几倍!
但是!
UDP快是因为牺牲了可靠性
实际应用要权衡速度和可靠性
🎓 总结
UDP的关键点:
- 无连接:直接发送
- 不可靠:可能丢包、乱序
- 有边界:不粘包
- 速度快:无额外开销
- 支持广播:一对多
记忆口诀:
UDP无连接 🔓
速度快但不可靠 ⚡
有边界不粘包 📦
支持广播一对多 📡
文档创建时间:2025-10-31