udp协议
2026年4月6日 · 688 字 · 更新 2026年4月7日
UDP和TCP的区别
如果说TCP是为了“假装有连接”而精雕细琢,UDP则是“为了速度而抛弃一切”的极简主义
- TCP会三次握手后建立可靠性连接,而UDP不会,它不提供可靠性保证
- TCP是面向字节流的,而UDP继承了IP协议的原始特性,是基于数据报的,一个一个地收发
- TCP能做流量控制和拥塞控制,而UDP只管发
- TCP通过状态机来维护两端状态,而UDP是无状态的
极简的头部
UDP的头部由源端口、目标端口、长度、校验和四个字段组成,总共只有8字节。一个UDP包到达目标机器后,解包的流程如下:
- 解包自下到上,从链路层开始,网卡收到一个帧,如果发现MAC地址是自己的,则取下帧头,剩下的内容交给网络层
- 网络层去看IP头,如果目的IP是自己,则取下IP头,IP头中有一个Protocol字段,标识了这个包是UDP协议的,于是会交给UDP协议栈处理
- UDP协议栈解析UDP头,拿到里面的源端口和目的端口,然后查找本机是否有应用程序在监听这个端口。如果有,就把UDP包中的数据交给这个程序的socket接收缓冲区
- 之后应用程序通过系统调用,从socket缓冲区把数据取出来,做业务处理
socket用于应用层和传输层的接口,其中包含两个缓冲区(接收缓冲区、发送缓冲区)
UDP使用场景
虽然UDP不可靠,但有些地方非它不可
- 实时性要求极高的场景,如音视频通话/直播,掉一帧没关系,最多画面闪一下。如果使用TCP重传而导致延迟1秒,通话就无法进行了
- 广播与多播场景,UDP可以实现一呼百应,如DHCP分配IP、内网发现
- 轻量级查询场景,如DNS,查询IP的时候,不需要像TCP那样先三次握手,速度非常快
QUIC基于UDP,在应用层手动实现了可靠性
UDP的痛点
- 分片攻击:UDP不感知路径MTU,也没有像TCP一样的MSS协商机制,如果发送超过MTU的数据报,会在IP层发生分片。一旦其中任意一个分片丢失,整个UDP数据报都无法重组,直接丢弃
- 放大攻击:攻击者伪造源IP,向开放的UDP服务(如DNS、NTP)发送请求,服务器会向“受害者IP”返回更大的响应,从而形成流量放大攻击