我想提取 PCAP 文件的 TCP 流并获取然后分析流的参数,例如 iRTT、重传率(类似于 Wireshark 中的“tcp.analysis”)。我尝试使用 Pyshark 来使用 Wireshark 分析,但它在字段中不可用,并且使用此代码遇到“内存错误”:
import pyshark
pkts = pyshark.FileCapture("test.pcapng", use_ek=False)
streams = {}
for pkt in pkts:
if 'tcp' not in pkt:
continue
if pkt.tcp.stream not in streams:
streams[pkt.tcp.stream] = list()
streams[pkt.tcp.stream].append(pkt)
我不知道如何使用 Scapy 来达到我的目的。有两个挑战:以有效的方式分割 TCP 流,然后计算流的参数。
你有什么推荐?
我将从 tshark 开始,我相信它使用与wireshark相同的底层代码。
也许可以从类似的事情开始
tshark -T fields -e frame.number -e frame.time_epoch \
-e tcp.stream -e ip.src -e ip.dst -e tcp.srcport -e tcp.dstport \
-e tcp.analysis.ack_rtt -r input_file.pcap
您可以在本示例的输出中看到 ack RTT,但我确信除了 ack_rtt 之外还有其他可用字段。
1 1689889766.834655000 0 10.0.1.10 10.0.1.44 32968 22
2 1689889767.261635000 0 10.0.1.44 10.0.1.10 22 32968 0.426980000
3 1689889767.261695000 0 10.0.1.10 10.0.1.44 32968 22 0.000060000
4 1689889767.262371000 0 10.0.1.10 10.0.1.44 32968 22
5 1689889767.263970000 0 10.0.1.44 10.0.1.10 22 32968 0.001599000
6 1689889767.722803000 0 10.0.1.44 10.0.1.10 22 32968
7 1689889767.722884000 0 10.0.1.10 10.0.1.44 32968 22 0.000081000
8 1689889767.726569000 0 10.0.1.10 10.0.1.44 32968 22
9 1689889767.729913000 0 10.0.1.44 10.0.1.10 22 32968 0.003344000
10 1689889767.729942000 0 10.0.1.10 10.0.1.44 32968 22
不过我没发现你的Python程序有什么问题。在代码后面添加一个部分来打印数据包对我有用。
import pyshark
pkts = pyshark.FileCapture("test.pcap")
streams = {}
for pkt in pkts:
if 'tcp' not in pkt:
continue
if pkt.tcp.stream not in streams:
streams[pkt.tcp.stream] = list()
streams[pkt.tcp.stream].append(pkt)
for stream in streams:
for pkt in streams[stream]:
try:
ack_rtt = pkt.tcp.analysis_ack_rtt
except AttributeError as e:
ack_rtt = '-'
print(f"{pkt.frame_info.number} {stream} {pkt.ip.src} {pkt.ip.dst} {pkt.tcp.srcport} {pkt.tcp.dstport} - ack_rtt: {ack_rtt}")
这给了我以下输出:
1 0 172.20.20.2 1.1.1.1 51100 1790 - ack_rtt: -
2 1 172.20.20.2 172.20.20.4 55168 1790 - ack_rtt: -
3 1 172.20.20.4 172.20.20.2 1790 55168 - ack_rtt: 0.000174000
4 1 172.20.20.2 172.20.20.4 55168 1790 - ack_rtt: 0.000072000
5 1 172.20.20.2 172.20.20.4 55168 1790 - ack_rtt: -
6 1 172.20.20.4 172.20.20.2 1790 55168 - ack_rtt: 0.000055000
7 1 172.20.20.2 172.20.20.4 55168 1790 - ack_rtt: -
8 1 172.20.20.4 172.20.20.2 1790 55168 - ack_rtt: 0.000055000
9 1 172.20.20.2 172.20.20.4 55168 1790 - ack_rtt: -
10 1 172.20.20.4 172.20.20.2 1790 55168 - ack_rtt: 0.000170000
11 1 172.20.20.2 172.20.20.4 55168 1790 - ack_rtt: -
12 1 172.20.20.4 172.20.20.2 1790 55168 - ack_rtt: 0.000041000