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