UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系。
UDP数据报封装成一份IP数据报的格式。如下图所示。
UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。
UDP首部
UDP首部
UDP报文首部结构如上图所示,它由RFC 768定义。应用层数据占用了UDP报文段的数据字段。例如,对于DNS引用,数据字段要么包含一个查询报文,要么包含一个响应报文。对于流式音频应用,音频抽样数据填充到数据字段。UDP首部只有4个字段,每个字段由两个字节组成。
端口号表示发送进程和接收进程。由于IP层已经把IP数据报分配给TCP或UDP(根据IP首部中协议字段值),因此TCP端口号由TCP来查看,而UDP端口号由UDP来查看。TCP端口号与UDP端口号是相互独立的。
UDP长度字段指的是UDP首部和UDP数据的字节长度。该字段最小值为8字节(发送一份0字节的UDP数据报是OK的)。这个UDP长度是有冗余的。IP数据报长度指的是数据报全长,因此UDP数据报长度是全长减去IP首部的长度。
接收主机使用检验和来检查报文段中是否存在差错。
选择UDP而不是TCP的原因
1. 应用层能更好地控制要发送的数据和发送时间。采用UDP时,只要应用进程将数据传递给UDP。UDP就会将此数据打包成UDP报文段并立即将其传递给网络层。另一方面,TCP有一个拥塞控制机制以便当源和目的主机间的一条或多条链路变得非常拥塞时,遏制运输层TCP发送方。TCP仍将继续重新发送数据报文段并加以确认,而不管可靠交付需要用都长时间。实时运用通常要求最快的发送速率,不想过分地延迟报文段的传送,且能容忍一些数据丢失,而TCP服务模型并不是特别适合这些应用的需求。
2. 无需连接建立。TCP在开始数据传输之前要经过三次握手。UDP却不需要任何准备即可进行数据传输。因此UDP不会引入建立连接的时延。这可能是DNS运行在UDP之上而不是运行在TCP之上的主要原因(如果运行在TCP之上,则DNS会慢的多)。HTTP使用TCP而不是UDP,是因为对于具有文本数据的Web网页来说,可靠性是至关重要的。
3. 无连接状态。TCP需要在端系统中维护连接状态。此连接状态包括接收和发送缓存、拥塞控制参数、序号与确认号的参数。另一方面,UDP不维护连接状态,也不跟踪这些参数。因此,某些专门应用服务器使用UDP而不是TCP,以便能支持更多的活动客户机。
4. 分组首部开销小。每个TCP报文段都有20字节的首部开销,而UDP仅有8字节的开销。
使用UDP的服务
1. DNS运行在UDP之上,从而避免了TCP的连接创建时间
2. UDP用于承载网络管理数据(SNMP)。在这种场合下,UDP要优于TCP,因为网络管理应用程序通常必须在该网络处于重压状态时运行,而正是在这时可靠的、拥塞受控的数据传输变得难以实现。
3. TCP和UDP都可以用于因特网电话,实时视频会议、流式存储音频与视频。