• 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)
    
  • 相关阅读:
    Linux command: grep
    VirtualBox内Linux系统怎样与Windows共享文件夹
    Centos 安装R
    Cannot retrieve metalink for repository: epel 错误解决办法
    sed 替换换行回车
    Get and Set Column/Row Names for Data Frames
    TCGA phenotype各列的含义
    R语言 格式化数字
    qvalue: Check that you have valid p-values or use a different range of lambda
    淘宝开源的H5移动开发UI框架genie-ui
  • 原文地址:https://www.cnblogs.com/theory/p/13338763.html
Copyright © 2020-2023  润新知