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