このページは乱ことNobuoNakakoが運用する「Etherealを使おう」の一部です。お時間があれば表紙も訪れてやってください

リンク等についてはこちら。間違いを見つけた時や「ここはこうした方が良い」等の意見は遠慮なくこちらまで。


The Ethereal manual

IPを知る(RFC0791)
プロトコル

このページを読む前に「Etherealの読み方」を読んでおいておく事を強くお薦めします。

このサイトを見ている方で「IP」と言われて「それは何?」という方は皆無だと思います。従ってここではIP自体の簡単な説明は省かせていただきます。

RFC

IP(INTERNET PROTOCOL) のRFCは0791になります。

サンプルファイル

ここで解説するサンプルファイルはPINGのキャプチャデータで行いたいと思います。

ダウンロードはこちら

ファイルの開き方は「キャプチャ結果を開く」を参照して下さい。

フレーム(PDU)

IPのフレームは以下の様になっています。

16進で表すと以下の様になります。

解説

  • バージョンについて(4ビット)[Varsion]

このバージョンはIPのバージョンを指しています。現在一般的に使用されているIPはバージョン4になります。この他にバージョン6が存在しますが復旧は復旧はまだまだ先の様です。

Var4なので[4]と表示されている事を確認して下さい。

  • IHLについて(4ビット)[Header length]

IHL(Internet Header Length)IPフレームのヘッダ長を32bitwordで表したものです。つまり32bitで1wordという事になります。実は上の部分(ICMP)では無いのですがパケットによってはIPフレームに「オプション」というヘッダが付く場合があります。これは可変長(情報の長さが定まっていない)の為、IPフレームの全体の長さを示すIHLが必要となります。

実際にはIHLはデータの長さ情報が入っているのではなくデータが開始する位置を記載しています。

正しいヘッダの最小値は5で、上記でも最小値の[5]が表示されている事を確認して下さい(160bit)。最低5ワードですのでこのパケットの実際の長さではなく160ビット以下という意味に注意して下さい(これを説明しない文献が多すぎる)ちなみに最大は150ワード(4800bit)ですがそこまでキャプチャするデバイスはほとんど存在しません。

  • サービスタイプ(8ビット)[Differentiated Services Field]

DSFはIPフレーム自体の「品質」を設定する物です。具体的に言うとデータの優先順位や信頼性等の設定です。

 上記の16進数のデータでは[00]となっています。これがどういう意味かを解説したいと思います。

まず、下記の様にDSFの中身をもう少し細かく表示してみましょう。

上記の様にDSFでは「優先度」「遅延」「スループット」「信頼性」の4つの設定が出来ます。

優先度はビット0〜2の間になります。000が「通常」001が「優先」010が「即時的」011が「瞬間的」100が「瞬間的で且つ最優先」101が「最重要又は緊急命令用」110は「インターネットワーク制御」111は「ネットワーク制御」になります。

遅延についてはビット3で0か1かの設定が可能です。0が「通常」1が「低遅延」になります。

スループットはビット4、0か1の設定で、0が「通常」1が「高スループット」になります。

信頼性はビット5で0か1の設定で、0が「通常」1が「高信頼性」になります。

6ビット〜7ビットまでは将来的に仕様する予定があるらしく予約となっており2003年2月現在の所、まだ意味はありません。

つまり[00]はすべてが「通常」という事になります。Etherealの詳細フレームでは下記の様に表示されています。

  • 全パケット長について(16ビット)[Total Length]

TLは名前の通りヘッダとデータを含む全パケットの長さを表した物です。単位はオクテット、1オクテットは8ビットなので1オクテット=1バイトと考えて下さい。
(1バイト=8ビットとは限りませんが1オクテットはかならず8ビットです)

例の16進数データでは[00 3c]となっています。これを10進数に直すと「60」になります。つまり全体の長さは60オクテット(約60バイト)となります。

  • 識別子について(16ビット)[Identification]

フラグメントの組み立ての再に参照される。いわゆるIPのIDの事。[8845]となっていますがもし組み立てるパケットがある場合(今回の場合ありません)相手の数値は[8846]となるのが一般的です。

  • フラグについて(3ビット)[Flags]

フラグメントの制御部分になります。フラグメントとはTCPストリーム等パケットが分割されている場合、それを結合する事を言います。詳細については下記の通りです。

DFに0が入ると「フラグメント許可」1が入ると「フラグメントの禁止」になります。通常は0です。

MFに0が入ると「このパケットが最終フラグメント」という事になり、1が入ると「次にフラグメントするパケットがある」という事になります。

例では[00]ですので基本的に分割されていないという事になります。

  • フラグメントオフセットについて(13ビット)[Fragment offset]

これはこのパケットが分割されている場合(フラグメント)データグラムのどの位置にあるかを記したものになります。基本は最初の0が入ります。

8オクテット(64ビット)で1フラグメントになりますので注意して下さい。例では[00]ですので最初のフラグという事になります。

  • 生存時間について(8ビット)[Time to live]

TTLの事、インターネット上での(ルータネットワーク上)パケットの寿命を設定しているところです。

ここの値が0になるとこのパケットは破棄されてしまいます。このTTL値はパケットを処理するモジュールを1つ介するごとに1つずつ減っていきます。

単位は秒ですが1秒以内であってもパケットを処理するモジュールを介すると1つ減る事に注意してください。つまりこの数値は実際の寿命ではなく「生存できる最大時間を表示しているという事です」これは当該するパケットが転送できない場合に約にたつものです。

例では[80]となっていますがこれを10進数に直すと[128]になります。前にも述べた様に128秒生存するという訳ではありません。

  • プロトコルについて(8ビット)[Protocol]

このIPのフレームですがIOS参照モデルでいう第3層(L3)になります。このプロトコルは次の層、つまり第4層(L4)の情報を記載しています。

例では[01]と表記されていますがこれはICMPを指しています。

  • ヘッダチェックサムについて(16ビット)[Header checksum]

ヘッダの部分のチェックサムがこれになります。チェックサムとはデータを送受信する際の誤り検出方法の一つになります。

ヘッダ内全ての16ビットワードの1の補数の和(符号なし整数の最大値から絶対値を引き算し 1 を加えたもの)を計算します。

チェックサムする場合はこのフィールドの値を0にし、再計算します。

  • 送信元アドレスについて(32ビット)[Source]

これは送信元のIPアドレスを指しています。

例では[c0 a8 01 33]となっていますがこれを10進数に変換すると[192 168 1 51]となります。つまりIP192.168.1.51が送信元という事になります。

  • 宛先アドレスについて(32ビット)[Destination]

これは宛先のIPアドレスを指しています。

例では[d3 0e 0f 05]となっていますがこれを10進数に変換すると[211 14 15 5]となります。つまりIP211.14.15.5(Yahooのwwwサーバ)が宛先という事になります。


Copyright 2003 by Nobuo Nakako All right reserved.