UDP用户数据报协议(User Datagram Protocol)
UDP(用户数据报协议)简介
UDP协议是英文User Datagram Protocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。 包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年, 虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。与我们所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。 根据OSI(开放系统互连)参考模型, UDP和TCP都属于传输层协议。UDP协议不提供端到端的确认和重传功能,它不保证信息包一定能到达目的地,因此称为不可靠协议。
UDP报文格式
下图显示了UDP报文格式。每个UDP报文称为一个用户数据报(User Datagram),用户数据报分为两个部分:UDP首部和UDP数据区。 首部被分为四个16比特的字段,分别代表源端口号﹑目的端口号﹑报文的长度以及UDP校验和。
16位源端口,表示发送端口和接收应答的端口。如果源端口没有使用,那么此字段的值就被指定为0。这是一个可选的字段。
16位源端口,表示分组被发往的端口。UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。
16位报文长度,表示包括报头和数据在内的整个用户数据报的长度。该字段的最小值是8。UDP数据报大小是对包含在报头和数据组件中的信息的一个简单的计数值。这个字段包括了大小可变的数据部分的长度和大小固定的报头长度。数据报的最大尺寸随操作系统的不同而不同。在两字节字段中,理论上数据报最多可达65535字节。然而,一些UDP实现将数据报的大小限制到了8192字节。
16位校验和。该字段是可选的。如果该字段值为零就说明不进行校验。UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必须具有校验值。
UDP校验和
UDP报中, 在伪首部中有一个值为零的填充八位组用于保证整个数据报的长度为16比特的整数倍。使用伪首部的的目的是检验UDP数据报已达到正确的目的地。在UDP校验和的计算过程中用到的伪首部长度为12字节,如下图所示。

伪首部的源IP地址字段和目的IP地址字段记录了发送UDP报文时使用的源IP地址和目的IP地址。 协议字段指明了所使用的协议类型代码(UDP是17),而UDP长度字段是UDP数据报的长度(伪首部的长度不计算在内)。
UDP计算校验和的方法和计算IP数据报首部校验和的方法相似。
但不同的是:IP数据报的校验和只检验IP数据报的首部,但UDP的校验和是将首部和数据部分一起都检验。 在发送端,首先是将全零放入检验和字段。再将伪首部以及UDP用户数据报看成是由许多16bit的字串接起来。 若UDP用户数据报的数据部分不是偶数个字节,则要填入一个全零字节(但此字段不发送)。
然后按二进制反码计算出这些16bit字的和(两个数进行二进制反码求和的运算的规则是:从低位到高位逐列进行计算。 0和0相加是0,0和1相加是1,1和1相加是0但要产生一个进位1,加到下一列。若最高位相加后产生进位,则最后得到的结果要加1)。 将此和的二进制反码写入校验和字段后,发送此UDP用户数据报。 在接收端,将收到的UDP用户数据报连同伪首部(以及可能的填充全零字节)一起,按二进制反码求这些16bit字的和。 当无差错时其结果应全为1。否则就表明有差错出现, 接收端就应将此UDP用户数据报丢弃(也可以上交给应用层,但附上出现了差错的警告)。
UDP特点
1) UDP是面向事务的协议,它用最少的传输服务为应用向其他程序发送报文提供了一个途径。2) UDP是无连接的、不可靠的传输机制。在发送数据报前,UDP在发送和接收两者之间不建立连接。
3) 数据分组的封装和解包都建立在UDP使用的协议端口上。
4) UDP让应用能直接访问Internet层的数据报服务,例如分段和重组等Internet层所提供的数据报服务,UDP应用也提供。
5) UDP使用IP协议作为数据传输机制的底层协议。
6) UDP报头和数据都以与最初传输时相同的形式被传送到最终目的地。
7) UDP不提供确认,也不对数据的到达顺序加以控制。因此UDP报文可能会丢失。
8) 不实现数据分组的传送和重复检测。
9) 当分组没有被传送时,UDP不能报告错误。然而,在传送UDP包时,有效数据被传输给有源和目标端口号标识的正确应用。
10) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、发送端和接收端主机性能的限制。