SORACOM Maxさんの Qiita 記事を目にし自分も試してみた。
記事 → https://qiita.com/ma2shita/items/e456fc0d38fba4bb4ea6
旧バージョンを導入している場合は、予めアンインストールが必要です。
(再起動不要)
あらためて Wireshark 3.3.0 64-bit 導入(本環境は Windows 10 / 64 bit)。インストール後は再起動不要。
適当にキャプチャを実施し、Maxさんの記事通りに「レイアウト変更」を行ってみると表示されます。
例としてパケットダイアグラム上 UDP Source Port をマウスオーバーで確認します。(Youtube を UDP#443 で受信)
補足:UDP Over QUIC(Quick UDP Internet Connections)は TLS を使用していません。TCP/2 などの実装を別途ご確認ください。
Windows 標準電卓で Hex (16進数)を Dec (10進数)変換してみましょう。
01-BB (Hex) は 443 (Dec) と判明します。
Source Port は正しいですね。
次にトレース用ランダムパケット生成を行い、それも Wireshark で読み取り確認をします。(特別な意味は無いので、そんなことができるのだと確認程度に)
パスを通していないので、カレントディレクトリを Wireshark パスへ。
生成されたファイルはエディタで【人間は可読不可】です。
シングル LLC フレームを pcap 形式で生成したものを Wireshark で表示。
なお、生成コマンドは次の通り。
randpkt -b 100 -c 1 -t llc single_llc.pcap
LLC は 1フレーム 50バイト(400ビット)で、極めてシンプルな構造。いきなり TCP パケットから学習するよりも、フレーム幅が小さいものから理解力を高めたほうがイイと思います(個人差あり)。
物足らない方へ randpkt.c (GPL2.0) を読んでみましょう。
github にソースがあります。
https://github.com/boundary/wireshark/blob/master/randpkt.c
生成できるパケットはソース内で定義されています。
PKT_ARP, PKT_BGP, PKT_BVLC, PKT_DNS, PKT_ETHERNET, PKT_FDDI, PKT_GIOP, PKT_ICMP, PKT_IP, PKT_LLC, PKT_M2M, PKT_MEGACO, PKT_NBNS, PKT_NCP2222, PKT_SCTP, PKT_SYSLOG, PKT_TCP, PKT_TDS, PKT_TR, PKT_UDP, PKT_USB, PKT_USB_LINUX
実にいいですね、パケット学習するために必要な基礎的なパケットが網羅。
今回の LLC の型は次の通りです。
/* TR, indicating LLC */
guint8 pkt_llc[] = {
0x10, 0x40, 0x68, 0x00,
0x19, 0x69, 0x95, 0x8b,
0x00, 0x01, 0xfa, 0x68,
0xc4, 0x67
};
LLC パケット構成
{ "llc", "Logical Link Control", PKT_LLC, WTAP_ENCAP_TOKEN_RING, pkt_llc, array_length(pkt_llc), NULL, 0 },
ソースコード L.489 からは型と構成をもとにして電文パース生成するルーチンです。WIN32 環境は UTF16->UTF8 お約束エンティティが入っているので、C言語の基礎理解があるかどうかも分かりますね。(人間が)
フォールバックやエラー処理も必要最低限な内容が記述され終了です。
念のために C言語をご存じではない方向けへ補足すると、C言語はオブジェクトオリエンテッド(オブジェクト指向)なので、共通で使用できる関数ヘッダ・ソースは一纏めにしてライブラリ化して再利用が可能です。今回使用したトレース用ランダムパケット生成は、\wireshark-3.3.0\wiretap\wtap.h (ワイヤタップ・ライブラリ)を始めとする幾つかのライブラリを再利用しています。
この再利用定義は C ソースの前段に プリプロセッサ include ブロックに定義します。また、include 以外に ifdef (endif で閉じる) はプリプロセッサの条件コンパイルと呼ばれ、異なるライブラリを切り替えることができる便利な機能です。他にもプリプロセッサで今回は登場しませんが define もありマクロ定義を行います。このように C言語の文法を知ると、プロトコルを書くことができると1ミリでも感じることができるので面白いと思いませんか?
#include <config.h> #include <glib.h> #include <stdio.h> #include <stdlib.h> #include <ui/clopts_common.h> #include <ui/cmdarg_err.h> #include <wsutil/file_util.h> #include <wsutil/filesystem.h> #include <wsutil/privileges.h> #include <cli_main.h> #ifdef HAVE_PLUGINS #include <wsutil/plugins.h> #endif #include <wsutil/report_message.h> #ifdef HAVE_GETOPT_H #include <getopt.h> #endif #ifndef HAVE_GETOPT_LONG #include "wsutil/wsgetopt.h" #endif #include "randpkt_core/randpkt_core.h"
Wireshark として使われるライブラリは、トレース用ランダムパケット生成にも再利用可能もできるので、結果として生産性が高い開発コード集大成となります。
C言語に限定しませんが、何らかのフレームワークで開発経験を行う際にはフレームワークはどのような体系となっているのかを理解して取り組むことが肝要です。特定のフレームワークでしか開発経験が無いという方で新しい他のフレームワークでまったく開発ができないという方が皆無であるように、開発経験がなくても通信プロトコルはどのような構成になっているのか、ペイロードを送り伝えるために通信規約(プロトコル)はどのような仕様になっているのかを理解してその分野の通信エンジニアとして活躍ができるのだと考えます。
そのための入り口として、Wireshark (旧 ethereal) はソースコードもついているので学習道具としても最適でしょう。
ソースコードを読んで楽しめない方でも、Wireshark を使ってパケットアナライズを楽しみたい方は次の書籍はおススメです。職場や学校等で、パケットアナライザを使えばどんな通信をしているか分かるから!と言うだけで指導しない方と出会った場合は不運と思わずに、彼ら以上に使いこなせるチャンスです。そのためにも是非ご一読ください。3回くらい読んで実践すれば Wireshark は IoT エンジニアにとって必要不可欠な道具であることも理解できると思います。
以上、ご覧いただき有難うございました。