Как я могу рассчитать среднее время прибытия пакета на акулу с файлом .pcapng? - PullRequest
1 голос
/ 27 апреля 2019

Как рассчитать среднее время прибытия пакетов на wire-shark с файлом .pcapng?

Я перехватил несколько пакетов на WIRE-SHARK, и мне нужно его проанализировать.Конечно, я пытался что-то сделать с вкладкой анализа на Wire Shark, но я не могу найти эффективный способ узнать среднее время между поступлениями пакетов.

Есть ли эффективный способ найти его?

1 Ответ

0 голосов
/ 03 мая 2019

Я только что написал плагин pdml2flow для этого: pdml2flow-frame-frame-inter-time-time .

В настоящее время он не публикуется на pip, поэтому вам нужно git clone && python setup.py install плагин самостоятельно. Но как только вы это сделаете, вы сможете:

  • Печать времени прибытия из вашего захвата dump.capture:
$ tshark -r dump.capture -Tpdml | pdml2flow +frame-inter-arrival-time
{"inter_arrival_times": [7.152557373046875e-07, 0.0, 0.1733696460723877], "frames": null}
{"inter_arrival_times": [3.7670135498046875e-05, 2.3126602172851562e-05], "frames": null}
{"inter_arrival_times": [0.16418147087097168, 0.0007672309875488281, 0.16009950637817383, 0.00016069412231445312, 0.0007240772247314453, 0.15914177894592285, 3.814697265625e-05, 5.245208740234375e-06], "frames": null}
{"inter_arrival_times": [0.1608715057373047, 0.15995335578918457, 2.384185791015625e-07, 2.384185791015625e-07, 2.384185791015625e-07, 0.15888381004333496], "frames": null}
{"inter_arrival_times": [0.16829872131347656, 0.0007762908935546875, 0.14913678169250488, 0.000125885009765625, 0.000736236572265625, 10.19379997253418], "frames": null}
  • Печать времени прибытия с другой агрегацией потока. Например, по интерфейсу, если вы захватили несколько интерфейсов:
$ tshark -r dump.capture -Tpdml | pdml2flow -f frame.interface_name +frame-inter-arrival-time 
{"inter_arrival_times": [7.152557373046875e-07, 0.0, 0.00018739700317382812, 3.7670135498046875e-05, 2.3126602172851562e-05, 0.008971691131591797, 0.16414976119995117, 4.76837158203125e-07, 3.123283386230469e-05, 0.0007672309875488281, 0.16007304191589355, 2.6464462280273438e-05, 0.00016069412231445312, 0.0007240772247314453, 0.1590421199798584, 2.384185791015625e-07, 2.384185791015625e-07, 2.384185791015625e-07, 9.894371032714844e-05, 3.814697265625e-05, 5.245208740234375e-06, 0.0006232261657714844, 0.15811824798583984, 0.010167837142944336, 1.2636184692382812e-05, 0.0007762908935546875, 0.14911913871765137, 1.7642974853515625e-05, 0.000125885009765625, 0.000736236572265625, 0.16014313697814941, 0.035120248794555664, 0.2039034366607666, 1.907348632, ... ] }
  • Печать времени прибытия без агрегации потока:
$ tshark -r dump.capture -Tpdml |  pdml2flow +frame-inter-arrival-time --no_flow
0.0
7.152557373046875e-07
0.0
0.00018739700317382812
3.7670135498046875e-05
2.3126602172851562e-05
0.008971691131591797
0.16414976119995117
4.76837158203125e-07
3.123283386230469e-05

Логика плагина реализована в:

plugin/plugin.py [a305598] : вычисляет время прибытия кадра

# vim: set fenc=utf8 ts=4 sw=4 et :
from pdml2flow.plugin import Plugin2
from argparse import ArgumentParser

from json import dumps

argparser = ArgumentParser('Calculate inter arrival times of frames in a flow or on an interface')

DEFAULT_NO_FLOW = False
argparser.add_argument(
    '--no_flow',
    action = 'store_true',
    dest = 'no_flow',
    default = DEFAULT_NO_FLOW,
    help = 'Calculate inter arrival time to the previous frame on the interface, not in the flow [default: {}]'.format(
        DEFAULT_NO_FLOW
    )
)

PRINT_FRAMES = False
argparser.add_argument(
    '--frames',
    action = 'store_true',
    dest = 'frames',
    default = PRINT_FRAMES,
    help = 'Print the frames alongside the inter arrival time [default: {}]'.format(
        PRINT_FRAMES,
    )
)

def _get_frame_time(x):
    return x['frame']['time_epoch']['raw']

class Plugin(Plugin2):

    @staticmethod
    def help():
        """Return a help string."""
        return argparser.format_help()

    def __init__(self, *args):
        """Called once during startup."""
        self._args = argparser.parse_args(args)
        self._last_frame_time = None

    def flow_end(self, flow):
        """Calculate and print the frame inter-arrival time."""
        if not self._args.no_flow:
            inter_arrival_times = []
            prev_t = None
            for t in _get_frame_time(flow.frames):
                if prev_t:
                    inter_arrival_times.append(
                        t - prev_t
                    )
                prev_t = t
            print(
                dumps({
                    'inter_arrival_times': inter_arrival_times,
                    'frames': flow.frames if self._args.frames else None
                })
            )

    def frame_new(self, frame, flow):
        """Calculate and print the frame inter-arrival time."""
        if self._args.no_flow:
            frame_time_now = _get_frame_time(frame)[0]

            if not self._last_frame_time:
                self._last_frame_time = frame_time_now

            print(
                frame_time_now - self._last_frame_time
            )
            self._last_frame_time = frame_time_now

if __name__ == '__main__':
    print(Plugin.help())

Надеюсь, это поможет. Обратная связь / функция или запросы на изменение всегда приветствуются. :)

...