UDP协议
# 格式
- 16 位源端口号:表示数据从哪里来。
- 16 位目的端口号:表示数据要到哪里去。
- 16 位 UDP 长度:表示整个数据报(UDP 首部+UDP 数据)的长度。
- 16 位 UDP 检验和:如果 UDP 报文的检验和出错,就会直接将报文丢弃。
格式如下:
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| 源端口号 | 目的端口号 |
+--------+--------+--------+--------+
| UDP长度 | UDP校验和 |
+--------+--------+--------+--------+
| |
| 数据部分 |
+-----------------------------------+
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 特点
- 无连接: 知道对端的 IP 和端口号就直接进行传输, 不需要建立连接;
- 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP 协议层也不会给应用层返回任何错误信息;
- 面向数据报: 不能够灵活的控制读写数据的次数和数量,应用层交给 UDP 多长的报文, UDP 原样发送, 既不会拆分, 也不会合并;
- UDP 没有真正意义上的发送缓冲区。调用 sendto 会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作,UDP 具有接收缓冲区。但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致;如果缓冲区满了,再到达的 UDP 数据就会被丢弃。所以,UDP 的 socket 既能读,也能写,因此 UDP 是全双工的。
# 封装和分用
UDP 报头
struct udp_header {
uint16_t src_port;
uint16_t drc_port;
uint16_t length;
uint16_t check;
};
1
2
3
4
5
6
2
3
4
5
6
# 载荷分离和交付上层
载荷分离 当传输层从下层获取到一个报文后,就会读取该报文的前 8 个字节(固定报头),提取出对应的目的端口号。通过目的端口号找到对应的上层应用层进程,然后将剩下的有效载荷向上交付给该应用层进程。
交付上层 当应用层将数据交给传输层后,在传输层就会创建一个 UDP 报头类型的变量,然后填充报头当中的各个字段,此时就得到了一个 UDP 报头。此时操作系统再在内核当中开辟一块空间,将 UDP 报头和有效载荷拷贝到一起,此时就形成了 UDP 报文。
# 基于 UDP 的应用层协议
NFS: 网络文件系统、TFTP: 简单文件传输协议、DHCP: 动态主机配置协议、DNS: 域名解析协议等
上次更新: 2025/11/11, 22:03:54