UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能。
应用层给UDP多长的报文,UDP就照样发送,即一次发送一个完整报文
一、UDP首部格式
这里的长度是指(首部+数据)
UDP校验:
在发送端:
- 填上伪首部
- 全0填充检验和字段
- 全0填充数据部分
- 伪首部+首部+数据部分采用二进制反码求和
- 把求和反码填入检验和字段
- 去掉伪首部,发送
在接收端:
- 填上伪首部
- 伪首部+首部+数据部分采用二进制反码求和(此时校验和不为0了)
- 结果全为1则无差错,否则发生差错
二、用python实现UDP校验和
实验步骤:
①传入一个16位整数数组
②每个数加起来,当和溢出时,回卷
③将所有数的和求反,这个值就是校验和
④验证校验和的正确性:校验和+所有16位整数 = -1
"""
@author: xsy
@date: 2020/3/28
@desc: UDP校验和
"""
# 计算·udp校验和(_data是一个16位整数的数组)
def calculate_udp_sum(_data):
_sum = 0x0
for d in _data:
_sum = _sum + (d & 0xffff)
# 溢出回卷
if _sum < 0xffff:
_sum = (_sum >> 16) + (_sum & 0xffff)
# 取反
return ~_sum
def check_ans(_ans, _data):
if ans + data[0] + data[1] + data[2] == -1:
print('校验结果正确')
else:
print('校验结果失败')
# 测试数据
data = [0b0110011001100000, 0b0101010101010101, 0b1000111100001100]
# 校验和
ans = calculate_udp_sum(data)
# 检测UDP校验和是否正确
check_ans(ans, data)