UDP
设计哲学: 只做传输协议能做的最少工作。只在IP的数据报服务上增加复用和分用以及差错检测的功能
优点
- 无需建立连接
- 无连接状态
- 分组首部开销小,仅有8字节开销
- UDP没有拥塞控制。拥塞也不会影响主机的发送效率,能够容忍一些数据的丢失,但不允许有较大的延迟
- 适用于一次性传输比较少了的数据的网络应用。如DNS、SNMP
- UDP提供尽最大努力交付。不保证可靠交付
- 面向报文
首部格式
- 源端口
- 目的端口
- 长度
- 校验和
UDP校验
在计算校验和时,在UDP数据报前增加12字节的伪首部。
伪首部由 源IP地址 目的IP地址、0字段、协议字段(UDP为17)、UDP数据报长度
伪首部仅仅只用来做校验和,不向下传送也不向上传递。
- UDP校验和校验出UDP数据报是错误的时候,可以丢弃,也可以交付给上层,但需要附上错误报告
- 通过伪首部,可以检查源端口号、目的端口号和UDP用户数据报的数据部分。还可以检查IP数据报的源IP地址和目的地址
可靠性UDP
实现可靠传输一般有两种途径,一是基于ARQ(Automatic Repeat reQuest)的确认和重传机制,二是使用前向纠错(FEC)。
FEC:是纠删码在通信中的应用,一般在链路层用的比较多。可靠UDP传输主要还是依靠重传机制。
ARQ:
ARQ包括停等式、回退N帧、选择重传等机制。由于停等式的效率太低,TCP和可靠UDP协议一般使用的是基于回退N帧机制和滑动窗口协议的连续式ARQ。
可靠UDP协议
- UDT(UDP-based Data Transfer Protocol):DT的主要目的是支持高速广域网上的海量数据传输,所以除了在UDP之上实现类似TCP的协议和算法之外,UDT还对TCP的拥塞算法做了一些细节上的调整。不过UDT的重传效率较低,无效报文,实际效果并不理想。
- KCP:KCP是一个很简单的ARQ的实现,包括选择重传和快重传等机制,对上层提供一个可靠的字节流。应用层可以使用多流复用的框架来实现对多个流的支持
- QUIC:QUIC是Google实现的一种可靠UDP传输协议,并且已经被选择作为HTTP/3的基础。
- 内建安全性,集成TLS
- 连接建立过程和TLS协商过程合并,减少往返请求次数,提高连接速度
- 集成多种拥塞算法,包括最新的BBR
- 多流支持,每个流有独立的拥塞控制,避免单个流中的丢包阻塞其它所有流(Head-of-line Blocking问题),更好的支持类似HTTP/2中的乱序请求
- 连接迁移:QUIC可以通过连接ID来唯一标识一个连接,当用户在有线、无线、移动网络之间切换时,可以保持上层连接的有效性,不需要再进行重连