一. 无连接运输:UDP
1.1 定义
- UDP(User Datagram Protocol)用户数据报协议:由 [RFC 768] 定义的协议。只做运输层协议能做的最少的工作,除了复用/分解功能以及少量差错检测外,几乎没有对IP协议增加别的东西。
运输层协议最低限度必须提供一种复用/分解服务。
- 构成:从应用进程得到数据,附加上源端口号字段和目的端口号字段,以及两个其他的小字段(长度字段,检验和字段checksum)形成报文段交付给网络层。
(网络层将UDP提供的报文段封装到IP数据报中,然后尽力而为地交付给目标主机。)
1.2 特点
UDP不提供不必要报文段交付之外的额外功能
- 尽力而为的交付(不可靠数据传输服务):不保证可靠交付,主机不需要维护复杂的连接状态。
QUIC协议(Quick UDP Internet Connections):快速UDP因特网连接,是一种基于 UDP 的传输层协议。将UDP作为支撑运输协议并在UDP之上的应用层协议中实现可靠性。保证了数据的完整性和有序性。
- 无连接的:通信时不需要创建连接(发送报文段之前,发送方域接收方运输层实体之间没有握手),减小了开销和发送数据前的时延。
- 无阻塞控制:不会影响发送端的发送频率。(与TCP相比发送时延少,交付时间短)
- 无连接状态 :由于不提供可靠数据传输服务,也没有拥塞控制机制,UDP不维护连接状态,也不跟踪参数(接收/发送缓存,拥塞控制参数以及序号与确认号的参数)。
- 面向报文:只在应用层交下来的报文前增加了首部后就向下交付IP层。
- 首部开销小:只有8个字节,相对于TCP的20个字节的首部要短
- 支持一对一、一对多、多对一、多对多的交互通信。
1.3 应用
- DNS:
- 使用UDP的优势:无需建立连接,运行速度快。
- 网络层将封装好的IP数据报发送给一个名字服务器,查询主机中的DNS应用程序等待响应。如果(由于底层网络丢失了查询或者响应或其他原因)未收到响应,要么向另一个名字服务器发送查询,要么通知调用它的应用程序无法获得响应。
- 流媒体
一种网上即时传输影音以供观赏的一种技术与过程。
流媒体技术将一连串的媒体数据压缩后,经过网上分段发送数据,在网上即时传输影音以供观赏。此技术使得数据包得以像流水一样发送。如果不使用此技术,就必须在使用前下载整个媒体文件。
- SNMP
SNMP(Simple Network Management Protocol)是一种用于网络管理的应用层协议,它为网络管理员提供了一种通过运行网络管理软件的中心计算机(即网络管理工作站)来管理设备的方法。
二. UDP报文段结构
UDP报文段包含数据报头(首部)和数据区两部分:
- 数据报头:由4个字段(每个字段有2字节)组成,分别是:源端口、目的端口、报文长度和校验和。
- 数据区:包含UDP数据,长度在8字节~65535字节之间,在终点交付报文时需要用到。
数据报头具体释义如下:
- 源端口:可选字段,通常包含发送数据报的应用程序所使用的UDP端口。需要对方回信时选用,如果不需要对方回信,可置0。
- 目的端口:接收端计算机上UDP软件使用的端口,占据16位。
- 报文长度:该字段占据16位,表示UDP数据报长度,包含UDP报文头和UDP数据长度。因为UDP报文头长度是8个字节,所以这个值最小为8。
- 校验和:检测UDP数据在传输中是否出错,有错则丢弃。该字段可选,当源主机不想计算校验和,则置0。
实际上计算检验和时UDP包含了伪首部,其中包括了源IP地址、目的IP地址、协议号、以及UDP数据的长度,这些信息也要包含在计算校验和的过程中,以确保数据的完整性和正确性。
三. UDP检验和
3.1 定义
- 目的: 提供差错检测功能,检测在被传输报文段中的差错 (如比特反转)
- 实现:
- 发送方: UDP数据报分成若干个16位的比特字(如果数据报的长度不是16位的整数倍,则在末尾填充0),对所有比特字进行求和运算,求和时遇到的任何溢出都被回卷,取累加和的反码作为校验和,放在 UDP报文段中的检验和字段。
进位回卷: 如果累加和超过16位,则将高位的进位加到低位上
ps:这里的取反码是指将16比特01数据中的0与1反转互换,即1变为0,0变为1。
- 接收方:接收到UDP数据报后会重新计算校验和,然后将计算得到的校验和与接收到的校验和进行比较。如果两者相同,则说明数据在传输过程中可能没有发生错误;如果不同,则说明数据被修改或损坏。
校验范围+校验和=1111111111111111 则通过校验, 否则没有通过校验
3.2 检验和计算实例
回卷:取出超过16位比特的进位(也就是数字1),与最后一位相加(如果出现多次溢出,则重复回卷过程直到无溢出),得到最后的和,再进一步得到检验和。
3.3 UDP检验和的局限
- UDP虽然提供差错检测,但是对差错恢复无能为力。
- 某种实现:丢弃受损报文段
- 其他实现:将受损报文段交给应用程序并给出警告。