UDP的概述
UDP(User Datagram Protocol, 用户数据报协议)。UDP是传输层的协议,功能即为在IP数据报服务之上增加了最基本的服务:复用和分用以及差错检测。
UDP提供不可靠服务,具有TCP所没有的优势:
- UDP无连接,时间上不存在建立连接需要的时延。空间上,TCP需要在端系统中维护连接状态,需要一定的开销。此连接装入包括接收和发送缓存,拥塞控制参数和序号与确认号的参数。UDP不维护连接状态,也不跟踪这些参数,开销小。空间和时间上都有优势。
- 分组首部开销小,TCP首部20字节;UDP首部8字节。
- UDP没有拥塞控制,应用层能够更好的控制要发送的数据和发送时间,网络中的拥塞控制也不会影响主机的发送速率。某些实时应用要求以稳定的速度放送,能容忍一些数据丢失,但是不能允许有较大时延。
- UDP提供尽最大努力的交付,不保证可靠交付。所有维护传输可靠性的工作都需要用户在应用层来完成。没有TCP的确认机制、重传机制。如果因为网络原因没有传送到对端,UDP也不会给应用层返回错误信息。
- UDP是面向报文的,对应用层交下来的报文,添加首部后直接向下交付为IP层,既不合并,也不拆分,保留这些报文的边界。对IP层交上来UDP用户数据报,在去除首部后就原封不动地上交给应用进程,报文不可分割,是UDP数据报处理的最小单位。
- UDP常用一次性传输比较少量数据的网络应用,如DNS、SNMP,因为对于这些应用,若采用TCP,为连接的创建,维护和拆除带来不小的开销。UDP也常用于多媒体应用数据的可靠传输对他们而言并不重要,TCP拥塞控制会使他们有较大的延迟,也是不可容忍的。
UDP的首部格式
UDP数据报分为首部和用户数据部分,整个UDP数据报作为IP数据报的数据封装在IP数据报中。
UDP首部有8个字节,由4个字段构成,每个字段都是两个字节。
- 源端口:源端口号,需要对方回信时选用,不需要时全部置0;
- 目的端口:目的端口号,在终点交付报文的时候需要用到;
- 长度:UDP的数据报的长度(包括首部和数据)其最小值为8(只有首部);
- 检验和:检验UDP数据报在传输中是否出错,有错则丢弃。
校验和是可选的,当源主机不想计算校验和,则直接令该字段全为0。
当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交给应用进程。
如果接收方UDP发现收到的报文中的目的端口号不正确,就丢弃该报文,并由ICMP发送“端口不可达”差错报文给对方。
UDP校验
在计算校验和的时候,需要在UDP数据报之前增加12字节的伪首部,伪首部并不是UDP真正的首部。只是在计算校验和,临时添加在UDP数据报前面,得到一个临时的UDP数据报。校验和就是按照这个临时的UDP数据报计算的。伪首部既不向下传送也不向上递交,而是仅仅为了计算校验和。这样既检查了UDP数据报,又对数据报IP地址和目的IP地址进行了校验。
UDP校验和计算方法和IP数据报首部校验和的计算方法相似,都使用二进制反码运算求和再取反,但不同的是:IP数据报的校验和只检验IP数据报和首部,但UDP的检验和把首部和数据部分一起校验。
发送方,首先把全零放入校验和字段并添加伪首部,然后把UDP数据报看成是由许多16位的字串连接起来,若UDP数据报和数据部分不是偶数字节,则要在数据部分末尾增加一个全零字节,接下来就按照二进制反码计算出这些16位字的和。将此和的二进制反码写入检验和字段。在接受方,把收到的UDP数据报加上伪首部后,按二进制反码计算出这些16位字的和。当无差错时其结果全为1。否则就表明有差错出现,接收方应该丢弃这个UDP数据报。