第11章 UDP:用户数据报协议

11.1 引言

UDP是一个简单的面向数据报的运输层协议。

  • 无连接
  • 不可靠
  • 不保证到达
  • 封装在IP中(协议号17)

11.2 UDP首部

+--------+--------+--------+--------+ | 源IP地址 | +--------+--------+--------+--------+ | 目的IP地址 | +--------+--------+--------+--------+ | 0 | 协议 | UDP长度 | +--------+--------+--------+--------+

text

  • 覆盖UDP首部和数据
  • 可选(但在实践中应启用)
  • 端到端检验

统计数据(Mogul 1992)

层差错数总分组数
以太网44170,000,000
IP61170,000,000
UDP14170,000,000
TCP350140,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发现等功能。