IP 数据包 checksum 计算

计算步骤

代码

def calculate_checksum(header: bytes) -> int:
    """
    计算IP头部的校验和

    :param header: IP头部的字节序列
    :return: 计算得到的校验和
    """
    # 确保IP头部的字节数为偶数,如果为奇数则补0
    if len(header) % 2 == 1:
        header += b'\x00'

    # 将IP头部拆分为16位的字
    checksum = 0
    for i in range(0, len(header), 2):
        word = (header[i] << 8) + header[i + 1]  # 将两个字节合成为16位字
        checksum += word

        # 处理进位
        checksum = (checksum & 0xFFFF) + (checksum >> 16)

    # 取反
    checksum = ~checksum & 0xFFFF

    return checksum