You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python代码计算TCP校验和?

纯Python实现TCP校验和

TCP校验和的计算依赖伪头部(包含IP层信息)和TCP段本身,以下是纯Python实现代码:

import struct
import socket

def tcp_checksum(src_ip, dst_ip, tcp_segment):
    # 构造伪头部:源IP(4字节)、目的IP(4字节)、保留位(1字节)、协议号(1字节)、TCP长度(2字节)
    src_ip_packed = socket.inet_aton(src_ip)
    dst_ip_packed = socket.inet_aton(dst_ip)
    pseudo_header = struct.pack('!4s4sBBH', src_ip_packed, dst_ip_packed, 0, 6, len(tcp_segment))
    
    # 拼接伪头部与TCP段(注意TCP段的校验和字段需预先设为0)
    checksum_data = pseudo_header + tcp_segment
    
    # 处理奇数长度,补0字节
    if len(checksum_data) % 2 != 0:
        checksum_data += b'\x00'
    
    # 按16位分组累加
    total = 0
    for i in range(0, len(checksum_data), 2):
        total += struct.unpack('!H', checksum_data[i:i+2])[0]
    
    # 处理进位:将高16位与低16位相加,直到无进位
    total = (total & 0xFFFF) + (total >> 16)
    total = (total & 0xFFFF) + (total >> 16)
    
    # 取反得到16位校验和
    return ~total & 0xFFFF

# 示例:结合Scapy生成的TCP段计算校验和
from scapy.all import TCP

# 创建TCP对象并将校验和设为0
tcp = TCP()
tcp.chksum = 0
tcp_bytes = bytes(tcp)

# 替换为实际的源、目的IP
src_ip = "192.168.0.10"
dst_ip = "192.168.0.1"

# 计算并输出校验和
calculated_chksum = tcp_checksum(src_ip, dst_ip, tcp_bytes)
print(f"计算出的TCP校验和: {hex(calculated_chksum)}")

关键说明

  • 伪头部是必须的,它让校验和覆盖了IP层的源/目的IP,保证端到端的数据完整性
  • 计算前必须将TCP段的chksum字段设为0,否则结果会错误
  • 最终取反操作要通过& 0xFFFF确保结果是16位无符号整数

内容的提问来源于stack exchange,提问作者Curse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:00:16