UDP简介
UDP 是一个简单的面向消息的传输层协议,尽管UDP 提供标头和有效负载的完整性验证(通过校验和),但它不保证向上层协议提供消息传递,并且 UDP 层在发送后不会保留 UDP 消息的状态。因此 UDP 有时被称为不可靠的数据报协议。如果需要传输可靠性,则必须在用户应用程序中实现。
UDP 使用具有最小协议机制的简单无连接通信模型。UDP 提供数据完整性的校验和,以及用于在数据报的源和目标寻址不同函数的端口号。
既然 TCP 提供了可靠数据传输服务,而 UDP 不能提供,那么 TCP 是否总是首选的呢?答案是否定的,因为有许多应用更适合用 UDP,原因主要有以下几个方面:
- 关于发送什么数据以及何时发送的应用层控制更为精细: 采用
UDP时,只要应用进程将数据传递给UDP,UDP就会将此数据打包进UDP报文段并立即将其传递给网络层; - 无需建立连接:
TCP在开始数据传输之前要经过三次握手,而UDP却不需要任何准备即可进行数据传输; - 无连接状态:
TCP需要在端系统中维护连接状态,此连接状态包括接收和发送缓存、拥塞控制参数以及序号与确认好的参数。而UDP不维护连接状态,也不跟踪这些参数; - 分组首部开销小: 每个
TCP报文段都有20个字节的首部开销,而UDP仅有8字节的开销;
| 应用 | 应用层协议 | 传输层协议 |
|---|---|---|
| 电子邮件 | SMTP | TCP |
| 远程终端访问 | Telnet | TCP |
| Web | HTTP | TCP |
| 文件传输 | FTP | TCP |
| 远程文件服务器 | NFS | 通常UDP |
| 流式多媒体 | 通常专用 | TCP或UDP |
| 因特网电话 | 通常专用 | TCP或UDP |
| 网络管理 | SNMP | 通常UDP |
| 域名转换 | DNS | 通常UDP |
上面的表格列出了流行的因特网应用机器所使用的运输协议,例如 DNS 运行在 UDP 智商,从而避免了 TCP 的连接创建时延。
UDP首部格式
上图展示了 UDP 首部的格式,除去数据的部分正是 UDP 的首部,它的首部由端口号,目标端口号,包长度和校验和组成。
源端口号
表示发送端端口号,字段长16位,该字段是可选项,有时可能不会设置源端口号,没有源端口号的时候该字段的值设置为0,可用于不需要返回的通信中。
目标端口号
表示接收端端口,字段航都16位。
包长度
该字段保存了 UDP 首部的长度跟数据的长度之和,单位为字节。
校验和
校验和是为了提高可靠的 UDP 首部和数据而设计,它提供了差错检测功能,这就是说,检验和用于确定当 UDP 报文段从源到达目的地移动时,其中的比特是否发生了变化,例如,由于链路中的噪声干扰或者存储在路由器时引入的问题。
发送方的 UDP 对报文段中的所有16比特字的和进行反码运算,求和时遇到的位溢出都会被忽略,举个例子,假定我们有三个16比特的子:
0110 0110 0110 0000
0101 0101 0101 0101
1000 1111 0000 1100
这些 16比特字的前两个之和是:
0110 0110 0110 0000
0101 0101 0101 0101
+ ——————————
1011 1011 1011 0101
然后再将上面的结果和第三个16比特的数进行相加:
1011 1011 1011 0101
1000 1111 0000 1100
+ ——————————
0100 1010 1100 0010
最后一次相加的为会有加法溢出,溢出位1会被舍弃,然后进行反码运算。反码运算就是将所有的0换成1,所有的1换成0,因此 0100 1010 1100 0010 的反码运算结果是 1011 0101 0011 1101,这就变为了校验和。
在接收方,全部的4个16比特自包括检验和加在一起,如果该分组中没有引入差错,则显然在接收方处该和将是 1111 1111 1111 1111,如果这些比特之一是0,那么我们就知道该分组中已经出现了差错。
这其实是一种 端到端 的设计原则,这个原则说的是要让传输中各种错误发生的概率降低到一个可以接受的水平,虽然 UDP 提供了差错检测,但它对差错恢复无能为力,也更不会有重传机制。
UDP伪首部
计算校验和时,需要在 UDP 之前增加12个字节的伪首部。这种首部并不是用户数据报的真正首部,伪首部并不在网络中传输,只是在计算检验和,临时添加在 UDP 用户数据报前,得到一个临时的用户数据报。
UDP 的校验和是把首部和数据部分一起校验,再将求和结果求反码,填入校验和字段。
发送方将计算完毕的校验和填入首部的校验和字段后,去除伪首部发送UDP报文。
接收方收到 UDP 报文后,生成伪首部,将伪首部、首部、数据每16位一组进行二进制反码求和,若求和结果全为1则无差错传输,否则丢弃。
本文正在参加「金石计划」