UDP协议
UDP协议
UDP(User Datagram Protocol,用户数据报协议)是一个无连接的传输层协议,提供简单的报文传输服务。它不保证数据包的可靠性、顺序或完整性,因此适用于对速度要求高而对可靠性要求低的应用场景,如视频流、在线游戏等。具有以下特定:
- 无连接:不存在建立连接需要的时延和开销。
- 不可靠:数据包可能丢失、重复或乱序,不提供重传机制,无拥塞控制,需要由应用层处理。
- 面向报文:对应用层交下来的数据,既不合并,也不拆分,保留数据的边界,添加UDP头部后直接交给IP层;对IP层给上来的数据,去除UDP头部后,也原封不动的交给应用层。所以UDP报文不能控制读写数据的次数和长度。
- 轻量:UDP头部开销只有8字节。
- 支持一对一、一对多、多对一、多对多通信。
UDP Header
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| Source | Destination |
| Port | Port |
+--------+--------+--------+--------+
| | |
| Length | Checksum |
+--------+--------+--------+--------+
|
| data octets ...
+---------------- ...
字段说明
- 源端口号:2字节,需要对方回复时使用,不需要时可用全0填充。
- 目的端口号:2字节,必填。
- 长度:2字节,UDP头部和数据的总长度,最小为8字节(仅有UDP头,无payload)。
- 校验和:2字节,校验UDP头和数据的完整性,如果不需要校验则可用全0填充。
checksum计算
在计算checksum时,引入伪首部(pseudo header),伪首部不是UDP真正的首部,既不向下传送也不向上递交,只用于计算checksum。伪首部共12字节,格式如下:
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| source IP address |
+--------+--------+--------+--------+
| destination IP address |
+--------+--------+--------+--------+
| zero |protocol| UDP length |
+--------+--------+--------+--------+
- source IP address:源IP地址,4字节。
- destination IP address:目的IP地址,4字节。
- zero:1字节,固定为全0。
- protocol:1字节,固定为17(UDP协议号)。
- UDP length: 2字节,UDP头部和数据的总长度。
UDP checksum计算步骤:
- 将伪首部、UDP头部和数据拼接成一个大的数据块。
- 如果UDP数据部分长度不是偶数个字节,则需则数据末尾填入1个全0字节(该字节不发送,只用于计算checksum)。
- 将checksum字段置为0。
- 将数据块按16 bit分组,进行求和。
- 如果出现溢出,产生了进位,则需将高16 bit加到低16 bit上。
- 如果求和结果为全0,则将其置为全1(全0代表不计算校验和)。
- 对求和结果按二进制取反码,将这个值,写入checksum字段。
接收端校验时,把收到的UDP数据报加上伪首部(如果不为偶数个字节,那么还需要补上全零字节)后,按二进制反码计算出这些16 bit的和。当无差错时其结果应全为1。