第11章 UDP:用户数据报协议
所属:TCP/IP详解 卷1:协议 来源:TCP/IP详解 卷1:协议
本章介绍UDP协议,包括UDP首部、UDP的特点、端口号和校验和等。
11.1 引言
UDP的作用
UDP(User Datagram Protocol):
- 用户数据报协议
- 传输层协议
- 无连接、不可靠
- 简单高效
UDP是简单的传输层协议。
UDP的特点
UDP的特点:
-
无连接
- 不需要建立连接
- 想发就发
- 开销小
-
不可靠
- 不保证交付
- 不保证顺序
- 不重传
- 没有确认
-
面向数据报
- 一个数据报一个边界
- 发多少收多少
- 不会粘包
-
没有流量控制
- 不管对方能不能收
- 发了再说
-
没有拥塞控制
- 不管网络拥不拥塞
- 一直发
UDP简单但不可靠。
UDP vs TCP
UDP vs TCP:
| 对比项 | UDP | TCP |
|---|---|---|
| 连接 | 无连接 | 面向连接 |
| 可靠性 | 不可靠 | 可靠 |
| 顺序 | 不保证 | 保证 |
| 流量控制 | 无 | 有 |
| 拥塞控制 | 无 | 有 |
| 开销 | 小 | 大 |
| 速度 | 快 | 慢 |
| 数据边界 | 有 | 无(字节流) |
| 适用场景 | 实时应用、DNS等 | 文件传输、网页等 |
UDP和TCP各有优缺点。
本章讨论的内容
本章讨论的内容:
- UDP首部
- UDP端口号
- UDP校验和
- UDP的特点
- UDP的用途
本章介绍UDP协议。
11.2 UDP首部
UDP首部格式
UDP首部格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 源端口 | 目的端口 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 长度 | 校验和 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
UDP首部很简单,只有8字节。
UDP首部字段
UDP首部各字段:
| 字段 | 长度 | 说明 |
|---|---|---|
| 源端口 | 16位 | 发送方端口号,可选 |
| 目的端口 | 16位 | 接收方端口号 |
| 长度 | 16位 | UDP数据报总长度(首部+数据) |
| 校验和 | 16位 | 校验和,可选 |
| 数据 | 可变 | 用户数据 |
UDP首部只有4个字段,8字节。
长度字段
长度字段:
- 16位
- UDP数据报的总长度
- 包含首部和数据
- 最小是8(只有首部,没有数据)
- 最大是65535
注意:
- IP数据报最大65535
- IP首部至少20字节
- UDP数据最大65535 - 20 - 8 = 65507字节
- 但实际受MTU限制,会分片
长度字段是UDP数据报的总长度。
11.3 UDP端口号
端口号的作用
端口号的作用:
- 标识不同的应用
- 多路复用和分用
- 发送方多个应用共用UDP
- 接收方分用给不同应用
端口号标识应用程序。
端口号范围
端口号范围:
- 16位,0-65535
分类:
| 范围 | 名称 | 说明 |
|---|---|---|
| 0-1023 | 知名端口 | 固定分配,需要权限 |
| 1024-49151 | 注册端口 | 注册使用 |
| 49152-65535 | 动态/私有端口 | 临时使用,客户端用 |
端口号分为三类。
常见的UDP端口
常见的UDP端口:
| 端口 | 服务 | 说明 |
|---|---|---|
| 53 | DNS | 域名系统 |
| 67 | DHCP服务器 | 动态主机配置 |
| 68 | DHCP客户端 | 动态主机配置 |
| 69 | TFTP | 简单文件传输 |
| 123 | NTP | 网络时间协议 |
| 161 | SNMP | 简单网络管理 |
| 500 | IKE | IPsec密钥交换 |
| 514 | Syslog | 系统日志 |
| 1900 | SSDP | 简单服务发现 |
| 5060 | SIP | 会话发起协议 |
很多服务用UDP。
11.4 UDP校验和
校验和的作用
校验和的作用:
- 检测数据是否出错
- 传输过程中有没有被改
- 可选的,可以不用
校验和检测差错。
校验和的计算
UDP校验和的计算:
- 计算范围:伪首部 + UDP首部 + 数据
- 伪首部包含IP地址等信息
- 16位二进制反码求和
为什么有伪首部:
- 验证数据是不是发给这个地址的
- 防止IP地址错误导致送错
- 包含源IP、目的IP、协议、UDP长度
校验和包含伪首部。
伪首部
伪首部格式:
+---------------------------+
| 源IP地址 | 4字节
+---------------------------+
| 目的IP地址 | 4字节
+---------------------------+
| 0 | 协议 | UDP长度 |
+---------------------------+
伪首部字段:
- 源IP地址
- 目的IP地址
- 0(填充)
- 协议(17表示UDP)
- UDP长度
伪首部不是真正的首部,只是计算用的。
校验和可选
校验和是可选的:
- 校验和为0表示不校验
- 可以关闭校验和
- 提高性能
- 但不可靠
建议:
- 还是开着吧
- 差错检测很重要
- 性能影响不大
校验和可选,但建议开启。
11.5 UDP的用途
为什么用UDP
为什么用UDP:
-
简单
- 实现简单
- 不用维护连接状态
-
快
- 没有连接建立
- 没有确认
- 延迟小
-
开销小
- 首部只有8字节
- 没有额外的控制报文
-
支持广播和多播
- TCP不支持
- UDP支持
UDP有自己的优势。
适合UDP的场景
适合UDP的场景:
-
实时应用
- 视频会议
- 语音通话
- 直播
- 丢一点没关系,延迟要小
-
查询-响应类应用
- DNS
- DHCP
- SNMP
- 一次请求一次响应,比建立连接简单
-
广播/多播
- 一对多
- TCP做不到
- UDP可以
-
游戏
- 实时游戏
- 状态同步
- 延迟敏感
很多场景适合UDP。
不适合UDP的场景
不适合UDP的场景:
-
文件传输
- 需要可靠
- 需要顺序
- 用TCP
-
网页浏览
- 需要可靠
- 用TCP
-
需要保证交付的
- 丢了不行的
- 用TCP
可靠传输用TCP。
UDP上的可靠传输
UDP上的可靠传输:
- UDP本身不可靠
- 但可以在UDP上自己实现可靠传输
- 应用层做确认、重传等
- 比如QUIC、WebRTC等
为什么在UDP上实现:
- 更灵活
- 可以自己控制
- 避免TCP的一些问题
- 比如队头阻塞
可以在UDP上实现可靠传输。
11.6 小结
UDP概述
-
什么是UDP
- 用户数据报协议
- 传输层
- 无连接、不可靠
-
特点
- 无连接
- 不可靠
- 面向数据报
- 没有流量控制
- 没有拥塞控制
-
vs TCP
- UDP简单快
- TCP可靠复杂
UDP首部
-
首部格式
- 8字节
- 源端口、目的端口
- 长度、校验和
-
字段
- 源端口:16位,可选
- 目的端口:16位
- 长度:16位,总长度
- 校验和:16位,可选
端口号
-
作用
- 标识应用
- 多路复用/分用
-
范围
- 0-65535
- 知名、注册、动态
-
常见端口
- 53 DNS
- 67/68 DHCP
- 69 TFTP
- 123 NTP
- 等等
校验和
-
作用
- 检测差错
-
计算
- 伪首部 + UDP首部 + 数据
- 反码求和
-
伪首部
- 源IP、目的IP
- 协议、长度
-
可选
- 可以关闭
- 建议开启
UDP的用途
-
为什么用UDP
- 简单
- 快
- 开销小
- 支持广播多播
-
适合的场景
- 实时应用
- 查询响应
- 广播多播
- 游戏
-
不适合的场景
- 文件传输
- 网页
- 需要可靠的
-
UDP上的可靠传输
- 应用层实现
- QUIC等
关键概念
-
UDP
- 用户数据报协议
- 无连接不可靠
-
端口号
- 标识应用
- 多路复用
-
校验和
- 检测差错
- 伪首部
-
适用场景
- 实时、查询、广播多播