TCP 流分析

问题描述 投票:0回答:1

我想提取 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 流,然后计算流的参数。

你有什么推荐?

python tcp scapy pyshark
1个回答
2
投票

我将从 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
© www.soinside.com 2019 - 2024. All rights reserved.