【发布时间】:2018-12-18 01:36:17
【问题描述】:
我正在尝试将包含数百个 TCP 流的大型 pcap 文件拆分为单独的文件。我目前的方法(见下文)对我来说似乎效率很低。我的问题是:通过 TCP 流将 pcap 文件拆分为单独文件的最有效方法是什么?
目前的做法
在我目前的方法中,我首先使用 tshark 找出文件中有哪些 TCP 流。接下来,对于这些 TCP 流中的每一个,我读取原始文件并提取给定的流。下面的代码 sn-p 显示了我的方法:
#!/bin/bash
# Get all TCP stream numbers
for stream in `tshark -r $file -T fields -e tcp.stream | sort -n | uniq`
do
# Extract specified stream from $file and write it to a separate file.
tshark -r "$file" -Y "tcp.stream eq $stream" -w "$file.$stream.pcap"
done
但是,这种方法似乎效率低下,因为 tshark 必须多次读取 pcap 文件(每个流一次)。理想情况下,我想要一个解决方案,它可以遍历原始 pcap 文件一次,并在找到属于特定连接的数据包后,将其附加到该文件中。
其他方法
我也四处寻找其他方法,但它们似乎不适合我的情况:
- PcapPlusPlus' PcapSplitter 对 TCP 连接的定义略有不同。他们将“连接”定义为相同的(协议、源 ip、目标 ip、源端口、目标端口)元组,如果多个 TCP 流具有相同的元组,这可能会表现出奇怪的行为。我相信 wireshark/tshark 实际上基于 SYN:SYN-ACK 和 FIN:FIN-ACK 标志的 TCP 流(但如果我错了,请纠正我)。
- Python's Scapy Scapy 与 PcapSplitter 存在相同的问题,因为除了上述 5 元组之外,它不提供任何拆分 TCP 流的方法。 (当然我可以自己写,但这超出了我目前的工作范围)。
对于这两种解决方案,我也不完全确定它们是否能够正确处理错误捕获。
问题
因此,我想对如何以最有效的方式基于 TCP 流将 pcap 文件拆分为单独的文件提出一些建议。
【问题讨论】: