UDP协议是一个简单的面向数据报的运输层协议。进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。
这与面向字节流协议的TCP不同,应用层产生的全体数据与真正发送的单个IP数据报可能没什么关系。
特点
UDP是无连接的
不需要建立连接,也不需要在最后释放连接,因此减少了开销和发送数据之前的时延。UDP使用尽最大努力交付
UDP是面向报文
进程的每一个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。这个与面向字节流的协议不同,如TCP, 应用程序产生的全体数据与真正发送的单个IP数据报没有什么联系。UDP没有拥塞控制
因此网络出现拥塞不会使源主机的发送速率降低。这对某些实时应用很重要。(例如IP电话,实时视频会议)要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据。UDP支持一对一,一对多,多对一和多对多的交互通信
而TCP因为建立连接,只能支持1对1,所以TCP不提供广播或多播服务。UDP首部开销很小
只有8字节,比TCP的20字节的首部要短。
UDP报文格式
源端口
源端口号,标记发送进程。目的端口
目的端口号,标记接收进程。长度
UDP报文长度(首部+数据),其最小值是8(仅含首部)。UDP首部长度固定为8,所以减去8,则得到数据部分的起始地址。-
检验和
包括UDP首部和数据部分,IP首部的检验和只覆盖IP的首部。
同时UDP和TCP的检验和都会覆盖首部和数据,但UDP检验和是可选的,TCP检验和是必需的。
其次,TCP和UDP的检验和都包括12字节的伪首部。
IP分片
IP层要发送一份数据报时,要查询接口的MTU,并将IP数据报长度与其比较,如果需要则要进行分片。分片可以发生在原始发送端主机上面,也可以发生在中间路由器上。
当IP数据报被分片后,每一片都成为一个独立的分组,具有自己的IP首部,任何运输层首部只会出现在第1片数据报分片中。并在选择路由时与其他分组独立。当数据报的这些片到达目的端时,可能会发生失序,但是在IP首部中有足够多的信息让接收端能正确组装这些数据报片。
尽管IP分片过程是透明的,但即使只丢失一片数据也要重传整个数据报,因为IP层没有超时重传机制。由更高层来负责超时和重传(TCP 有超时和重传机制,但UDP没有)。当来自TCP报文段的某一片丢失了后,TCP超时后会重发整个TCP报文段,该报文段对应于一份IP数据报,没有办法只重传数据报中的一个数据报片。
以太网上,数据帧的最大长度是1500字节,其中1472字节给数据(1500 - IP首部为20字节 - UDP首部为8字节)。
现在假定我们发送一个数据内容为1473长度的报文,则会发生IP分片。
ICMP不可达差错
发生ICMP不可达差错的一种情况就是:当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志比特。
如果某个程序需要判断到达目的端的路途中最小MTU是多少(路径MTU发现机制)。那么这个差错就可以被程序利用。
这种情况下的ICMP不可达差错报文格式如图所示: