第11章 UDP:用户数据报协议
11.1 引言
UDP是一个简单的面向数据报的运输层协议。
- 无连接
- 不可靠
- 不保证到达
- 封装在IP中(协议号17)
11.2 UDP首部
+--------+--------+--------+--------+ | 源IP地址 | +--------+--------+--------+--------+ | 目的IP地址 | +--------+--------+--------+--------+ | 0 | 协议 | UDP长度 | +--------+--------+--------+--------+
text
- 覆盖UDP首部和数据
- 可选(但在实践中应启用)
- 端到端检验
统计数据(Mogul 1992)
| 层 | 差错数 | 总分组数 |
|---|---|---|
| 以太网 | 44 | 170,000,000 |
| IP | 61 | 170,000,000 |
| UDP | 14 | 170,000,000 |
| TCP | 350 | 140,000,000 |
11.4 一个简单的例子
bsdi % sock -u -i -n4 svr4 discard
text
- 不建立连接
- 每个写操作对应一个UDP数据报
- 源端口号每次变化(临时端口)
11.5 IP分片
分片字段
- 标识(16bit):唯一标识数据报
- 标志(3bit):DF(不分片)、MF(更多分片)
- 片偏移(13bit):8字节为单位
分片规则
- 除最后一片外,其他片为8字节整数倍
- 只在目的主机重装
- 丢失一片需重传整个数据报
分片示例
1473字节UDP数据报 → 1501字节IP数据报:
- 第一片:1480字节(UDP首部+1472数据)
- 第二片:1字节(剩余数据)
11.6 ICMP不可达差错(需要分片)
- 设置DF标志但数据报太大时产生
- 类型:3,代码:4
- 可包含下一跳MTU(新格式)
11.7 用Traceroute确定路径MTU
- 发送DF标志的数据报
- 收到”不能分片”差错后减小长度
- 逐步找到路径MTU
11.8 采用UDP的路径MTU发现
- Solaris 2.2支持
- 使用DF标志
- 收到ICMP差错后分片
- 每30秒重试更大MTU
11.9 UDP和ARP之间的交互作用
- 大量UDP分片可能触发ARP洪泛
- ARP只保留最后一个报文
- 可能导致数据报丢失
11.10 最大UDP数据报长度
- 理论最大:65507字节(65535-20-8)
- 实际限制:实现决定
- 多数应用限制为512字节或更小
11.11 ICMP源站抑制差错
- 系统处理速度跟不上时产生
- 类型:4
- 路由器应产生(旧标准)
- 新标准不鼓励使用
11.12 UDP服务器的设计
客户IP地址及端口号
- 必须告知应用程序
目的IP地址
IP_RECVDSTADDR选项
UDP输入队列
- 有限大小
- 溢出时丢弃数据报
限制本地IP地址
- 可绑定特定IP地址
- 通配符
*表示任意地址
限制远端IP地址
- 可绑定特定远端地址
每个端口多个接收者
- 多播支持多个端点共享同一端口
11.13 小结
UDP是简单的无连接协议,提供端口号和可选检验和。支持IP分片、路径MTU发现等功能。