目录
10.1 引言
UDP(User Datagram Protocol):用户数据报协议。一种传输层协议。
IPv4中协议字段值:17。
特点:
有消息边界。
开销更小,因为没有TCP复杂机制。
当UDP应用程序每次调用send/write,就发出一个UDP数据报。
而TCP不一定,因为TCP可能分段,重组。
即TCP应用程序执行多次send/write调用会组合成一个数据包发送,或可能一个send/write调用被分成多个数据包发送。
10.2 UDP 头部
头部格式如下:
字段:
源端口
目的端口
长度:UDP报文总长度,包括头部和数据。
校验和:校验整个UDP报文。
每个socket在创建时必须指定协议类型(TCP或UDP),并绑定到特定端口。
因此,一个套接字不能同时监听TCP/UDP相同端口。
一个主机可以创建两个socket,分别监听TCP和UDP的相同端口号,表示两种不同服务。
10.3 UDP校验和
UDP校验和:校验范围覆盖UDP头部、UDP数据,伪头部。
伪头部(pseudo-header):
计算UDP校验和时,根据IP头信息生成的虚拟头部。
伪头部格式通常包括:
源IP、目标IP、协议类型(UDP),UDP数据报总长等。
作用:提供更多信息,确保校验更精确。
伪头部细节如下图:
NAT会改变报文IP和端口,所以经过NAT后需要重新校验和。
IPv4头中也有校验和,但只校验IPv4头内容,不包括IP载荷。
在每跳都要重新计算,因为TTL字段值减小。
小结:
IPv4头的校验和字段:只校验IPv4头内容。
传输层TCP/UDP头的校验和字段:校验范围不仅包含传输层头,还有载荷。
10.4 例子
10.5 UDP 和 IPv6
IPv6中TCP/UDP都需要伪头部来计算校验和。
Teredo隧道:
IPv6数据被封装成IPv4 UDP数据报后,发给Teredo中继,中继解封装后把IPv6报文转发给主机。
Teredo和GRE对比:
通用性:
GRE更通用,可封装任何类型数据包。
Teredo只用于IPv4 UDP封装IPv6数据。
实现方式:
GRE:不需要服务器或中继。
Teredo:需要服务器和中继。
10.6 UDP-Lite
UDP:校验是可选的,要么校验整个UDP报文,要么不校验。
UDP-Lite:对UDP数据一部分校验,而不是整个数据报校验。
所以未校验部分,容忍比特差错。
UDP-Lite:有单独的IPv4协议和IPv6协议号。算是一种新的传输层协议。
所以UDP- Lite有一个校验和覆盖范围字段,表示需要校验哪部分数据。
最小值为8,即只