2.UDP协议

UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能。

图片

图片

应用层给UDP多长的报文,UDP就照样发送,即一次发送一个完整报文

一、UDP首部格式

图片
这里的长度是指(首部+数据)

UDP校验:

图片

图片

在发送端:

  1. 填上伪首部
  2. 全0填充检验和字段
  3. 全0填充数据部分
  4. 伪首部+首部+数据部分采用二进制反码求和
  5. 把求和反码填入检验和字段
  6. 去掉伪首部,发送

在接收端:

  1. 填上伪首部
  2. 伪首部+首部+数据部分采用二进制反码求和(此时校验和不为0了)
  3. 结果全为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)
posted @ 2020-06-21 20:32  衍射  阅读(175)  评论(0编辑  收藏  举报