0
1

パケットをPythonで分析してみる① プロトコルのパレート図

Last updated at Posted at 2024-04-05

はじめに

Pythonを使ってネットワークのパケットを分析してみる。
今回はキャプチャーファイル(tcpdumpの結果)から作ったCSVをPythonで読み込み、プロトコル別にパケットを集計してグラフ化する。
キャプチャーファイルからCSVを作成する方法はこちらを参照。

前提

  • JupyterNotebook
  • 適当なtcpdumpから作ったCSVファイル(サンプルではYahooのトップページにアクセスした際のキャプチャーを使用)

必要なモジュールのインポート

今回使用するモジュールをインポートする。
なお、以降は全てJupyterNotebook上で実行している。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

CSVの読み込み

CSVをデータフレームdfに読み込む。

df = pd.read_csv('test002.csv', index_col=0)

dfの内容を表示してみる。

df

001.jpg

プロトコル別に集計する

データフレームのProtocol列を集計してみる。

df.Protocol.value_counts()

結果

TCP        3119
TLSv1.3    1435
TLSv1.2     599
DNS         294
OCSP         70
QUIC         39
HTTP          6
SSLv2         3
NTP           2
Name: Protocol, dtype: int64

これを新しいデータフレームdf2に入れる。

df2=pd.DataFrame(df.Protocol.value_counts())

累積(Cumulative_sum)と累積比率(Cumulative_ratio)を計算し、df2に列を追加する。

df2["Cumulative_sum"] = np.cumsum(df2["Protocol"])
df2["Cumulative_ratio"] = df2["Cumulative_sum"] / sum(df2["Protocol"]) * 100

この時点でのdf2の内容を表示してみる。

df2

002.jpg

パレート図を作成する

df2の内容をもとにパレート図を描画してみる。

fig = plt.figure()
ax = fig.add_subplot(111)

data_num = len(df2)
 
ax.bar(range(data_num), df2["Protocol"])
ax.set_xticks(range(data_num))
ax.set_xticklabels(df2.index.tolist(), rotation=90)
ax.set_xlabel("(Protocol)")
ax.set_ylabel("(Packets)")
 
ax_add = ax.twinx()
ax_add.plot(range(data_num), df2["Cumulative_ratio"], color='red')
ax_add.set_ylim([0, 100])
ax_add.set_ylabel("(Percent)")

以下のようなパレート図が出力される。
003.png

このように、通信パケットの中で使用されているプロトコルをパケット数が多い順に可視化することができた。

以上。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1