以消息为单位发送
UDP把应用交来的消息放入数据报,首部包含源端口、目的端口、长度和校验和等字段。基本首部为8字节,消息继续由IP承载,并不先建立TCP式连接。
接收方得到的是单独的数据报,而不是TCP那样连续的字节流。不过,发送一个报文不代表它一定抵达;UDP本身不负责保证顺序或排除重复。
UDP校验还把IP来源与目的地址、协议号和长度等信息组成伪首部纳入计算,帮助发现错投递;伪首部不是额外发送的一段UDP首部。IPv4中的全零校验和表示没有生成校验,而计算结果为零时用全一编码。IPv6默认要求UDP校验,零校验模式只允许在满足另外规范条件的隧道封装等特定场景使用,不能把“UDP校验可选”不分版本地套用。
可靠性必须另有安排
有些应用允许略过过期信息,另一些则在UDP之上自行加入确认、恢复和会话状态。选择UDP只是选择传输基础,不能由此推断整个应用必然“不可靠”或必然“实时”。
校验和检查传输差错,并不验证消息发送者的身份。若应用需要机密性、认证或防重放,应使用另外明确规定的保护机制,而不是把端口号当作信任凭据。
报文大小与拥塞不是免费项
UDP没有内建拥塞控制,使用它的互联网应用仍要避免过量发送造成拥塞崩溃,并与其他通信分享容量。没有连接握手,不等于可以无限制地发送数据。
较大的数据报还可能引发IP分片,任一片丢失就会使整份报文无法重组。RFC 8085因此把路径MTU、分片风险和丢失处理列为应用设计需要处理的问题。
参考:[2]