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

如何在PCAP的TCP/IP包中设置Kind=15选项并重算校验和(优先用Scapy)

TCP Kind=15(替代校验和)选项配置与校验和重算方案

一、RFC1146相关要求说明

RFC1146规定,TCP替代校验和需通过SYN包协商启用,且一旦启用需在整个连接的所有数据包中使用。但你的测试场景是跳过SYN包直接在后续包添加Kind=15选项,这属于非标准操作,只要目标测试硬件能识别该选项即可执行,无需严格遵循标准协商流程。

Kind=15选项的固定格式为:1字节Kind值(15)、1字节Length值(4)、2字节替代校验和,总长度4字节。

二、基于Scapy的实现步骤

1. 加载原始PCAP文件

from scapy.all import rdpcap, wrpcap, IP, TCP

# 替换为你的输入PCAP路径
raw_packets = rdpcap("input.pcap")

2. 定位目标连接并修改非SYN包

先指定目标TCP连接的IP和端口,然后过滤掉SYN包,为其余符合条件的包添加Kind=15选项并重新计算校验和:

# 替换为你的目标连接信息(源/目的IP+端口)
target_connection = (("192.168.1.100", 12345), ("10.0.0.5", 80))
modified_packets = []

for pkt in raw_packets:
    if IP not in pkt or TCP not in pkt:
        modified_packets.append(pkt)
        continue

    # 匹配目标双向连接
    is_target_conn = ((pkt[IP].src, pkt[TCP].sport) == target_connection[0] and 
                      (pkt[IP].dst, pkt[TCP].dport) == target_connection[1]) or \
                     ((pkt[IP].src, pkt[TCP].sport) == target_connection[1] and 
                      (pkt[IP].dst, pkt[TCP].dport) == target_connection[0])
    
    if not is_target_conn:
        modified_packets.append(pkt)
        continue

    # 跳过纯SYN包(仅SYN标志位为1,无ACK)
    if pkt[TCP].flags & 0x02 and not pkt[TCP].flags & 0x10:
        modified_packets.append(pkt)
        continue

    # 构造Kind=15选项(先占位校验和)
    alt_checksum_opt = b'\x0f\x04\x00\x00'
    tcp_layer = pkt[TCP]

    # 合并原有TCP选项与新选项
    tcp_layer.options = tcp_layer.options + [('Unknown', alt_checksum_opt)]
    # 清空原有校验和,让Scapy自动重算标准TCP/IP校验和
    tcp_layer.chksum = None
    pkt[IP].chksum = None

    # 手动计算替代校验和(RFC1146规定为TCP段的16位补码和取反)
    def calc_alt_chksum(data):
        chksum = 0
        # 按16位字累加
        for i in range(0, len(data), 2):
            if i + 1 < len(data):
                word = (data[i] << 8) + data[i+1]
            else:
                word = data[i] << 8
            chksum += word
        # 处理溢出
        chksum = (chksum >> 16) + (chksum & 0xffff)
        chksum += chksum >> 16
        return ~chksum & 0xffff

    # 生成TCP段字节流用于计算
    tcp_bytes = bytes(tcp_layer)
    alt_chksum = calc_alt_chksum(tcp_bytes)
    # 更新选项中的校验和值
    updated_opt = b'\x0f\x04' + alt_chksum.to_bytes(2, byteorder='big')
    tcp_layer.options = tcp_layer.options[:-1] + [('Unknown', updated_opt)]

    # 更新数据包的TCP层
    pkt[TCP] = tcp_layer
    modified_packets.append(pkt)

3. 保存修改后的PCAP文件

# 替换为输出PCAP路径
wrpcap("modified_test.pcap", modified_packets)

三、核心注意事项

  • Scapy不支持自动计算Kind=15的替代校验和,必须手动实现RFC1146规定的16位补码和逻辑。
  • 若只需为部分非SYN包添加选项,可在循环中增加额外筛选条件(比如按数据包序号、传输方向过滤)。
  • 跳过SYN协商直接添加Kind=15属于测试场景下的特殊操作,不符合标准TCP流程,需确认测试硬件兼容该模式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:19:52