1. UDP协议特点
UDP(用户数据报协议)的传输过程类似于寄信,具有以下四大核心特征:
-
无连接: 只要知道对端的IP和端口号即可直接发送数据,无需事先建立连接。
-
不可靠传输: 没有确认(ACK)和重传机制。如果数据因网络故障丢失,UDP协议层不会向应用层返回任何错误信息。
-
面向数据报: 应用层交给UDP多长的报文,UDP就原样发送,不拆分、不合并。
- 示例: 发送端调用一次
sendto发送100字节,接收端必须调用一次recvfrom接收100字节,不能分10次每次接收10字节。
- 示例: 发送端调用一次
-
全双工通信: UDP的 socket 支持同时进行读操作(
read/recv)和写操作(write/send),即支持双向数据同时传输。
2. UDP的缓冲区机制
UDP的读写缓冲机制与TCP有显著区别:
-
发送缓冲区:无。 UDP没有真正意义上的发送缓冲区。调用
sendto后,数据会直接交付给内核,由内核传递给网络层(IP层)进行封装和发送。 -
接收缓冲区:有。
-
乱序: 接收缓冲区不能保证收到报文的顺序与发送端一致。
-
丢包: 如果接收缓冲区满了,后续到达的UDP数据报会被直接丢弃。
-
3. UDP报文格式与大小限制
![[Pasted image 20260513192621.png]]
UDP的报头非常精简,固定为 8个字节:
| 字段 | 长度 | 说明 |
|---|---|---|
| 源端口号 | 16位 | 发送方应用程序的端口 |
| 目的端口号 | 16位 | 接收方应用程序的端口 |
| UDP长度 | 16位 | 表示整个数据报(UDP首部 + UDP数据)的最大长度 |
| UDP校验和 | 16位 | 用于校验数据完整性,如果校验和出错,报文会直接丢弃 |
⚠️ 关键限制(64K问题):
因为"UDP长度"字段占16位,这意味着一个UDP数据报的最大长度是 64KB (包含UDP首部)。在现代互联网中64KB很小,如果需要传输超过64KB的数据,必须在应用层手动分包发送,并在接收端手动拼装。
4. 通信模型与端口号 (Port)
传输层的主要职责是确保数据能从发送端传输到接收端,而端口号用于标识主机上不同的应用程序。
4.1 网络通信五元组
在TCP/IP协议中,通过以下五个元素来唯一标识一次网络通信(可通过 netstat -n 查看):
源IP + 源端口号 + 目的IP + 目的端口号 + 协议号
4.2 端口号范围划分
-
0 - 1023(知名端口号 / Well-Know Port): 固定分配给广为使用的应用层协议。开发者自己写程序时应避开这些端口。(可通过
cat /etc/services命令查看系统端口分配) -
1024 - 65535: 操作系统动态分配的端口号,通常用于客户端程序。
4.3 常见知名端口号
-
FTP: 21
-
SSH: 22
-
Telnet: 23
-
HTTP: 80
-
HTTPS: 443
两个经典问题
-
一个进程是否可以bind多个端口号? 可以。一个进程可以创建多个 socket,分别绑定不同的端口。
-
一个端口号是否可以被多个进程bind? 通常不可以(会提示端口被占用),但在某些特殊机制下(如父子进程继承或设置了特定的端口复用选项
SO_REUSEPORT),存在特殊情况。
5. 底层通信模型数据流向
在局域网内两台主机(A与B)通信时,数据流动呈现严格的自上而下的层级封装:
-
应用层: 生成业务数据(如消息文本、时间戳、昵称)。
-
系统调用接口: 通过
write/send等系统调用向内核传递数据。 -
OS 内核层: 负责管理协议栈(TCP/UDP)、缓冲区处理及向下层传递。
-
底层网络(网络层/链路层): 加上IP首部、MAC帧头,最终转化为物理信号通过局域网发送至对端。
6. 常见的基于UDP的应用层协议
虽然UDP不可靠,但其极低的延迟使其成为许多经典应用层协议的基石:
-
DNS: 域名解析协议(最常见)
-
DHCP: 动态主机配置协议(用于自动获取IP)
-
NFS: 网络文件系统
-
TFTP: 简单文件传输协议
-
BOOTP: 启动协议(用于无盘设备启动)
-
自定义协议: 开发者自己基于UDP封装的各类应用层协议(如游戏帧同步、视频流传输等)。