ネットワークの基本の理解の近道になる手段のひとつとして、実際に生のパケットをキャプチャして中身を自分の目で確認することが挙げられます。そこで今回は、実際にWiresharkでパケットをキャプチャし、そのデータにはどういった意味があるのか、Wiresharkの基本的な使用方法を交えて説明します。実際にキャプチャすると、よくネットワークの参考書等で目にする「TCP/IP階層モデル」というネットワークアーキテクチャが把握でき、ネットワークでつながれた異なるPCの異なるプロセス同士がデータを送受信できる仕組みを確認することができます。

 

Wiresharkとは

Wiresharkは、LAN上に流れているパケットを「見える化」するパケットキャプチャツールです。ネットワーク(LAN)上にはいろいろな種類のパケットが流れていますが、パケットをリアルタイムにキャプチャして、そのパケットはどのような種別のデータ(フィールド)があり、その値は何なのか、というパケットの中身を詳細に表示することができます。開発者のデバッグや、ネットワークのトラブルシューティングが主な用途です。

パケットキャプチャツール(LANアナライザという言い方が正確かもしれません)には様々ありますが、オープンソースのWiresharkは誰でも自由に利用でき、WindowsだけでなくMac OS X、Linux、各種BSDなど、様々なプラットフォームでも利用できます。そして具体的に何ができて何ができないのか、以下の表に簡単にまとめてみました。

 

Wiresharkの使い方

実際にWiresharkを使ってパケットをキャプチャしてみたいと思います。今回は、以下のような構成でDT10のログデータをEthernet経由で取得します。

少し補足しますと、DT10とはターゲットプログラムにテストポイント(≒printfデバッグで使用するprint文)を自動で挿入して、実際にターゲットプログラムが実行されたときにテストポイントの情報を取得し、実行経路や処理時間・カバレッジなどを解析できる弊社のテストツールです。ターゲットプログラムからDT10アプリケーションの動作しているPCに対してテストポイントデータが送信されているときにキャプチャを実行しました。

 
パケット取得の開始と停止

Wiresharkを起動すると、ネットワークインターフェースの一覧が表示されますので、パケットキャプチャしたい項目を選択します。以下の図のようにIPv6や仮想環境のものなど、今回実際に見たいもの以外に複数のインターフェースが表示されます。マウスを当てるとIPアドレスなどの情報がポップアップされますので、適切なものを選択します。ちなみに、「Ctrl」や「Shift」キーで複数のインターフェースを選択することも可能です。

選択すると、以下のような画面に切り替わり、パケットキャプチャが開始されます。キャプチャが開始されると、リアルタイムにリストが更新されますが、パラパラと短時間にたくさんのパケットがキャプチャされたり、知らないネットワーク用語がたくさん並びますので、初めてお使いになる方はちょっとびっくりするかもしれません。

パケットのキャプチャを停止するには画面左上部分の「停止」ボタンを押下します。ほんの数十秒のキャプチャでしたが、たくさんのパケットが存在するためこのままだと目的のデータまでたどり着くのが大変そうです。

 
リストを見やすくする方法

そこで、目的のデータに素早くたどり着く方法のひとつとして「フィルタ機能」があります。キャプチャするパケット自体にフィルタリングをするキャプチャフィルタと、取得したデータから表示するパケットをフィルタリングする表示フィルタがありますが、今回は後者の表示フィルタを使用します。以下の表は一例ですが、各プロトコルや「送信元」「送信先」といった要素でフィルタリングできます。

フィルタの書式は様々なものがありほんの一例に過ぎませんが、上記の式をフィルタ指定欄に入力します。それにより、指定したフィールドの指定した値に合致するパケットを表示します。逆に、指定した値に合致するパケットを非表示にする場合は、「ip.src!=192.168.100.100」のように「==」ではなく「!=」と書くこともできます。今回の場合は送信元のIPアドレスが192.168.10.136、TCPポート番号が3000でしたので、以下のように併せてフィルタリングを行い、確認したいデータのみを表示させることができました。

 
パケットの見方

リスト上でパケットをクリックすると、そのパケットの詳細表示と、生のデータがHEX(16進数)で表示されます。詳細表示では、どういったデータ領域(フィールド)が存在しその値は何なのか、ということを階層やプロトコルごとに人間が理解できる形で表示しています。詳細表示の左端「>」をクリックすると関連するフィールドがさらに表示され、該当するHEXの箇所がハイライトされます。

ターゲットプログラムから送信されるDT10のテストポイントのデータは上図のHEXでハイライトされている部分の10byteですが、実際にはパケット上に存在するデータはこれより多いことが分かります。この「アプリケーションが送信したデータ」より多くなっている部分を知るために関わってくるのが、「TCP/IP」というネットワークアーキテクチャです。

 

「TCP/IP」とパケットの流れ

 
TCP/IP階層モデルと各階層のデータ

TCP/IP階層モデルと「それぞれの階層は要するになに?」ということを表すと以下の表のようになります。

MACアドレスとは、ネットワーク機器やネットワークアダプタ(無線LANも含む)に付加されている、世界でただひとつの値です。IPアドレスはいわば「ネットワークの識別番号」+「そのネットワーク内での機器の識別番号」の組み合わせです。ここまでで、データを届ける宛先のPCまでたどり着きます。実際にはMACアドレスとIPアドレスを紐づけするための処理や、ルーティングと呼ばれる最適な経路選択処理、ルータやハブを経由する際の処理など今回は割愛しますが、様々な処理が途中にあります。
 

そしてたどり着いたPC内には様々なアプリケーション・プロセスが実行されているわけですが、ポート番号とは、アプリケーション・プロセスを識別するための値となります。ソフトウェア開発者の方で「ソケット」という用語を聞いたことがある方もいるかもしれませんが、このソケットとは、アプリケーション・プロセスとネットワークをつなげるデータの出入り口となるようなものです。そして通信相手のソケットを認識するためにポート番号が使用されます。

 
パケットが送信元から受信先にたどり着くまで

さて、今回行っているような、あるPCのアプリケーションから別のPCのアプリケーションまでデータを送信する流れを「TCP/IP」モデルに沿って大まかに示すと、上の図のようになります。左の送信側は、単にアプリケーションからデータを送信するといっても、矢印の流れのように送信するデータを下の層へと渡していきます。その過程で、それぞれの階層のヘッダを元のデータの先頭にどんどん付加していき、最終的にはネットワークインターフェース層からデータが送信されます。

そして受信側は、送信側とは逆に受信したデータを下位から上位の層に渡していきます。その過程では、それぞれの階層が送信側の対応する階層のヘッダを解釈し、ヘッダ以降のデータを上位の階層へと渡します。このようにして送信されたデータはアプリケーション層のデータのみとなって、最終的に目的地となる通信相手のアプリケーションにたどり着くのです。

 
パケットを覗いてみる

以上を踏まえて、Wiresharkで取得したパケットを覗いてみると、アプリケーションが送信したデータ以外に存在するデータは、それぞれの階層で付加される、あるいは解釈されるデータが先頭から並んでいることが実際に確認できます。

そして、下の図は各ヘッダのデータ構造を表したものです。例えばインターネット層で言うと、IPv4かIPv6かを示す「バージョン」、TCPやUDPかを示す「プロトコル」など、今回説明した以外にも通信に必要な様々なデータが存在することが分かります。

なおWiresharkのログと上記の表には少し相違点があります。ネットワークインターフェース層の「プリアンプル」はパケット送信前の同期信号でWiresharkには表示されませんので、Wiresharkに表示されるデータの先頭は宛先のMACアドレスになります。同じく「フレームチェックシーケンス」も表示されません。また、Ethernetのパケットの最小サイズは64byteと決められており、このサイズに満たない場合はパディングという0詰めデータが付加されます。これは上記の表では存在しませんが、Wiresharkには表示されます。

 

まとめ

さて、今回はネットワークの非常に基本的な部分についてまとめました。ネットワークで通信をするには、様々なデータ領域や取り決めなど、基本的な部分とは言えたくさんあることがお分かりいただけたかと思います。慣れ親しんでいる方からすると、「TCP/IPモデル」や、そもそも「Wiresharkでパケットをキャプチャする」ことは当たり前のことなのかもしれませんが、ネットワークの学習・理解には、その当たり前を理解するハードルの高さが同時に存在するといえます。本稿が読んでいる方の学習・参考にするためのひとつとしてお役に立てれば幸いです。


組込みソフトのバグを解析する「動的テストツールDT+」


「DT+(ディーティープラス)」は、組込みソフトウェアのリアルな実行経路を見える化できるデバッグツールです。 経路情報を取得するためのテストポイントを、ソースコードに自動で挿入して、いつも通り実行するだけ。

詳細はこちら

【 無料セミナー 】
レガシーコードをいじる前に知っておいてほしい「動的テスト」の3つの使い方

レガシーコードやOSSなどの資産を使ったソフトウェア開発では、ベースコードへの理解は最重要。
しっかり理解せずに開発してしまうと、あとで不具合発生の温床になってしまうことも。
そんなときこそ、ソフトウェアの実挙動を解析する「動的テスト」の出番。
はじめましてのソースコード相手でも短時間でかなり深く理解できる仕組みをご紹介します。

お申し込みはこちら!