# 用户数据报协议UDP
## UDP的主要特点
1. UDP是**无链接**的,即发送数据之前不需要建立链接(结束后也不需要释放链接),减少了开销和发送数据之间的时延。
2. UDP使用的是**尽最大努力交付**,即不保证可靠交付,主机不需要维护复杂的链接状态表。
3. UDP是**面向报文的**,发送方的UDP对应用层交下来的报文,在添加首部后就向下IP(网络)层交付。UDP对应用层交下来的报文,既不合并也不拆分,而是保留这些报文的边界。
:-: ![](https://img.kancloud.cn/83/42/8342941b6a4732e3c7a4e4b3de8e8357_539x249.png)
4. UDP**没有拥塞控制**,网络发生拥塞时不会使源主机的发送速率降低。这点在某些实时应用中很有用。
5. UDP支持一对一、一对多、多对一、多对多链接。
6. UDP的**首部开销小**,只有8个字节,比TCP的首部20字节要短很多。
## UDP首部格式
用户数据报UDP由2部分组成:**数据字段**和**首部字段**。首部字段很简单,只有8个字节,分为4个字段,每个字段都占2个字节。
### 首部字段
* 源端口: 源端口号,在需要对方回信时必传,如不需要,可传0。
* 目标端口: 目的端口号,在终点交付时,必须要传。
* 长度: UDP用户数据报的长度,最小时为8(仅有首部)。
* 校验和:检测UDP用户数据报在传输中是否有错,有错就丢弃。
:-: ![](https://img.kancloud.cn/d9/d7/d9d78605e02b3fa9236fe670aece7c2c_859x351.png)
### 端口分用
当数据接收端的传输层从IP层接收到UDP数据报文时,就会根据UDP首部中的目的端口把数据报文上交给相应的应用程序。
如果接收方UDP发现接收到的报文中目的端口不正确(不存在对应于该端口号的应用程序),就会丢弃报文,并由网际控制报文协议ICMP发送`端口不可达`差错给发送方。
### 伪首部
UDP用户数据报首部中的校验和字段计算方法有些特殊。在计算校验和时,要在用户数据报之前加12个字节的`伪首部`。所谓伪首部是因为这部分并不是UDP用户数据报真正的首部,只是在计算校验和的时候,临时加在UDP用户数据报首部前面的,伪首部既不向下传递也不向上提交,仅仅是用来计算校验和。