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

使用Python按指定IP过滤PCAP文件中TCP数据包的问题咨询

可行解决方案

核心问题说明

你之前尝试的代码存在2个核心问题,且sniff过滤方案在Windows下需要额外依赖,我们直接用纯Scapy原生逻辑实现过滤,无需安装WinDump/WinPcap额外组件:

  • IP源/目的地址是IP层的属性,不是TCP层的属性,你之前从pkt[TCP]读取IP字段的写法本身就有问题,正确属性为pkt[IP].src、pkt[IP].dst
  • 数GB级PCAP不要用rdpcap一次性读取全量数据包到内存,会直接占满系统内存导致运行失败,改用PcapReader逐包迭代读取即可,内存占用稳定在MB级

完整可运行代码

from scapy.all import PcapReader, wrpcap
from scapy.layers.inet import IP, TCP

target_ip = "11.22.33.44"
input_pcap = "C:\\temp\\test.pcap"
output_pcap = "C:\\temp\\filtered.pcap"

filtered_pkts = []
# 逐包迭代读取大PCAP,不占用过多内存
with PcapReader(input_pcap) as reader:
    for pkt in reader:
        # 先判断数据包是否同时存在IP层和TCP层,避免取值报错
        if IP in pkt and TCP in pkt:
            # 判断源IP或目的IP匹配目标地址
            if pkt[IP].src == target_ip or pkt[IP].dst == target_ip:
                filtered_pkts.append(pkt)

# 写入过滤后的数据包
wrpcap(output_pcap, filtered_pkts)

超大型PCAP优化方案

如果过滤后的数据包总量也超过内存承载上限,可以改为逐包写入,完全不需要缓存全量过滤结果:

from scapy.all import PcapReader, PcapWriter
from scapy.layers.inet import IP, TCP

target_ip = "11.22.33.44"
input_pcap = "C:\\temp\\test.pcap"
output_pcap = "C:\\temp\\filtered.pcap"

with PcapReader(input_pcap) as reader, PcapWriter(output_pcap, append=True, sync=True) as writer:
    for pkt in reader:
        if IP in pkt and TCP in pkt:
            if pkt[IP].src == target_ip or pkt[IP].dst == target_ip:
                writer.write(pkt)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:45:03