それでは実際のIPv6パケットの例を見てみよう。まずは、一番シンプルな、TCP通信中のパケットの例である。
IPv6のTCPパケットの例
これは、Network Monitor 3.4でIPv6のTCP通信の様子をキャプチャしたところ。いったん通信相手との接続が完了すれば、下位レイヤがIPv4からIPv6になるだけで、TCPやHTTPレイヤのプロトコルの内容は変わらない。
(1)IPv6の通信だけをキャプチャしたり、表示したりするには、「IPv6」というキーワードだけが記述されたフィルタを設定すればよい。Wireshark(フリーのネットワーク・プロトコル・アナライザ)でも同じく、IPv6というキーワードでIPv6通信だけをフィルタできる。
(2)IPv6のヘッダの内容を見るにはこれを選択・展開する。
(3)先頭の「0110」がIPv6パケットを表す。残りの部分はフラグやフロー・ラベル。このパケットではすべて0になっている。
(4)IPv6ヘッダを除く、TCPやHTTPプロトコル部分のサイズ。
(5)IPv6基本ヘッダの次には、TCPプロトコルが続いている。
(6)ホップ数の初期値は128。この場合は128段以上のルーティングはできない。
(7)あて先と送信元のIPv6アドレス。どちらもリンクローカル・ユニキャスト・アドレス。
(8)上位プロトコル。
(9)この40bytesがIPv6基本ヘッダ部分。その直後にはTCPが続いている。
中央下のペインにプロトコルの階層が表示されているが、イーサネット・フレームの次にIPv6→TCP→HTTPと階層化されているのが分かるだろう。IPv6ヘッダが40bytesあるが、TCPやHTTPプロトコルはIPv4の場合と違いはない。
UDPの場合は次のようになる。これはIPv6版のDHCPプロトコルの例である。
IPv6のUDPパケットの例
これはIPv6のUDP(DHCPv6)通信のパケットをキャプチャしたところ。
(1)IPv6のヘッダの内容を見るにはこれを選択・展開する。
(2)IPv6基本ヘッダの次には、UDPプロトコルが続いている。
(3)上位プロトコルはUDPで、その上にはDHCPv6が載っている。
プロトコル階層は、イーサネット→IPv6→UDP→DHCPv6Clientとなっている。UDPやDHCPの内容はIPv4の場合と同じだ(ただしDHCPパケットの中はIPv6向けに少し異なっている)。
次はICMPv6の例を見てみよう。次のコマンドは、IPv6のプロトコル・スタックがほかのノードを検索するときに送信される、ICMPv6の「Neighbor Solicitation」メッセージの例だ(IPv4のICMPとARPを併せたような機能を持つ。詳細は本連載の第3回を参照)。
IPv6のICMPパケットの例
IPv6では、ICMP(やIPv6のARPのような機能)はIPv6では1つのプロトコルに統合されている。
(1)IPv6のヘッダの内容を見るにはこれを選択・展開する。
(2)IPv6基本ヘッダの次には、ICMPv6プロトコルが続いている。
IPv4では、ICMP(やARP)は、IPとは異なるプロトコル番号を持つパケットであったが、IPv6では同じIPv6ヘッダを持ち、その中でTCPやUDP、ICMPなどに分かれている。そのため、例えばファイアウォールを設定する場合は、IPv6プロトコル1つをブロックするだけで、(ICMPv6を含む)IPv6関連の全プロトコルを禁止できる。
次はイーサネットの1フレームに入りきらないくらい大きなパケットをやり取りしてみよう。「ping -6 -l 4000 SVR1」を実行すると(「-6」はIPv6での通信を強制するオプション)、次のように、1回のpingごとに、3つのICMPv6パケットが送信され、3つ揃った時点でそれらがやはり3つのパケットに分割されて送り返されてくる。
IPv6のフラグメント・パケットの例
これは「ping -6 -l 4000 SVR1」を実行して、相手ノードから応答が返ってきたところ。イーサネットのフレームサイズは約1500bytesだが、それを超えているので、3つのパケットに分割されて(フラグメント化されて)返ってくる。IPv6ではフラグメントは拡張ヘッダでサポートされているので、基本ヘッダに加えて、拡張ヘッダが使われている。
(1)IPv6のヘッダの内容を見るにはこれを選択・展開する。
(2)IPv6基本ヘッダの次には、TCPやUDP,ICMPv6ではなく、拡張ヘッダの「IPv6 Fragment header」が続いている。
(3)拡張ヘッダのフラグメント・ヘッダ。
(4)拡張ヘッダの次にICMPv6プロトコルが続いている。
(5)ICMPv6プロトコル・ブロック。
(6)IPv6の基本ヘッダ。40bytesの固定サイズ。
(7)フラグメント拡張ヘッダのサイズは8bytes。
(8)ここから先がICMPv6プロトコルのブロック。先頭8bytesが制御コードやフラグで、その先(「abcdefg……」と続いている部分)はpingコマンドで送受信されている文字列データ。
1つのIPv6パケットに入りきらないので、フラグメントが行われている。フラグメントの拡張ヘッダが使用されているので、IPv6の基本ヘッダ中のネクスト・ヘッダ・フィールドには「IPv6 Fragment header(タイプ=44)」がセットされている。
今回は、IPパケットの構造とその例を見てきた。IPv4よりもパケット構造が単純化されているので、慣れればこちらの方が分かりやすいかもしれない。ネットワーク・プロトコルを理解したり、その挙動を調べたりするには、実際に稼働しているネットワークを調査するのが一番である。ネットワーク・モニタやWiresharkなどのツールを駆使して(関連記事参照)、パケットをキャプチャしてどんどんモニタしていただきたい。Windows OSでIPv6を使うように設定していなくても、すでに多くのIPv6パケットがネットワーク上で送受信されていることが分かるだろう。
次回は、L2アドレスを解決するIPv6の近隣探索機能について取り上げる。
■関連記事(Windows Server Insider)
「Windows管理者のためのIPv6入門」