連載
» 2012年05月24日 00時00分 公開

Windows管理者のためのIPv6入門:第3回 L2アドレスを解決する近隣探索プロトコル (2/2)

[打越浩幸,デジタルアドバンテージ]
前のページへ 1|2       

 では、実際のプロトコルの例をネットワーク・モニタで見てみよう。PC1からPC2に対してpingを実行し(PC1上でPC2のIPv6アドレスを指定して「ping -6 fe80::17b:3788:8e5a:231f」のように実行する)、そのときの近隣探索パケットの内容を表示させたのが次の画面である。pingの実行に先立ってPC1の近隣探索キャッシュの内容をクリアしているので(クリア方法は後述)、PC2のMACアドレスを求めるべく、PC1からNeighbor Solicitationパケットがマルチキャスト送信されている。

近隣探索の問い合わせパケットの例
  (1)Neighbor Solicitationパケット。
  (2)イーサネット・レベル・ヘッダでは、パケットのあて先はマルチキャスト・アドレスになっているので、同一マルチキャスト・グループに属するすべてのノードへ送信される。。
  (3)「FF02::〜」で始まるアドレスはIPv6のマルチキャスト・アドレス。
  (4)135はNeighbor Solicitationメッセージのタイプ番号。
  (5)このIPv6アドレスをMACアドレスに変換したい。
  (6)これは送信元(PC1)のMACアドレス。

 やや複雑に見えるかもしれないが、上から順にイーサネット・ヘッダ、IPv6ヘッダ、ICMPv6が階層的に表示されている。

 Neighbor Solicitationパケットを受信したPC2は、次のようにただちにNeighbor Advertisementパケットで応答している。上の問い合わせと違って、応答はマルチキャストではなく、ユニキャストで行われている。

近隣探索の応答パケットの例
Neighbor Solicitationパケットに対する応答がすぐ返されている。
  (1)応答パケット。
  (2)これはPC1のMACアドレス。マルチキャストやブロードキャストではなく、ユニキャストで返信している。
  (3)PC1のIPv6アドレス。
  (4)136はNeighbor Advertisementメッセージのタイプ番号。
  (5)これがPC2のMACアドレス。

 Neighbor Solicitationメッセージで要求を送ると、それに対する応答がNeighbor Advertisementで返されている。応答中にはPC2のMACアドレスが入っているので(下側の画面の(5)。「00-15-5D-00-90-49」)、これでPC1はPC2のL2アドレス情報を入手できる。以後は、これをあて先としてイーサネットのパケットを送信すればよい。

 このあたりのやり取りはIPv4のARPと似ているが、パケットの送信にブロードキャストではなく、マルチキャストが使われている点が少し異なる。本連載の第1回「IPv6アドレスの種類」で、IPv6ではブロードキャストではなくマルチキャストを利用していると書いたが、それはこの近接探索のパケットでも同様である。例えば上側の「近隣探索の問い合わせパケットの例」をよく見ていただきたい。イーサネット・ヘッダ中のあて先アドレスがブロードキャスト・アドレス「FF-FF-FF-FF-FF-FF」ではなく、「33-33-FF-5A-23-1F」となっている。これはイーサネットのマルチキャスト・アドレスである(先頭バイトの最下位bitが1なのは、イーサネットのマルチキャストを表す)。またIPv6ヘッダ中のあて先アドレスが、pingの引数に指定した「fe80::17b:3788:8e5a:231f」ではなく、「ff02::1:ff5a:231f」となっている。これも特別なマルチキャスト・アドレスである。以下これらのマルチキャスト・アドレスについて簡単に説明しておくが、ほかにも多くのマルチキャスト・アドレスがある。

●ソリシテッド・ノード・マルチキャスト・アドレス(solicited node multicast address)

 これはインターフェイスに割り当てられているIPv6のユニキャスト・アドレスなどから自動的に作成されるマルチキャスト・アドレス。「ff02::1:ff00:0/104」というマルチキャスト・アドレスに、IPv6アドレスの最下位24bit(3bytes)を合成して作成される。例えば「fe80::17b:3788:8e5a:231f」というIPv6アドレスからは「ff02::1:ff5a:231f」というソリシテッド・ノード・マルチキャスト・アドレスが得られる。

●マルチキャストMACアドレス

 IPv6のイーサネットにおいてマルチキャスト送信したい場合は、「33-33-xx-xx-xx-xx」という専用のマルチキャストMACアドレスを使うことになっている。先頭の2bytesは「33-33」とする。例えば「ff02::1:ff5a:231f」というIPv6マルチキャスト・アドレスをマルチキャストMACアドレスにすると「33-33-FF-5A-23-1F」となる。

近隣探索結果のキャッシュ

 近隣探索はコストのかかる処理であり、IPv6の通信をするたびに実行していては高速な通信は望めない。IPv4のARPでは、一度取得したARPの結果はARPテーブルにキャッシュしておき、余計なARP処理を抑制するようになっていた。

 IPv6にも同様に仕組みがあり、一度取得した近隣情報は「近隣キャッシュ(neighbor cache)」に保存されるようになっている。ただしIPv4のARPテーブルよりもやや複雑で、IPv6アドレスに対応するL2アドレス情報を保持するだけでなく、ホストかルータか、到達可能性があるかどうかなど、ルーティング・テーブルのような役目も持っている。

 Windows OSにおいて近隣テーブルの内容を確認するにはコマンド・プロンプトを開き、netshコマンドを起動してIPv6制御用のコマンドを実行する。具体的にはnetsh起動後、interface→ipv6コンテキストへ移動して「show neighbors」コマンドを実行する。デフォルトでは全インターフェイスの近隣テーブルの内容が表示されるが、引数にインターフェイス番号を指定すると、指定されたインターフェイスに割り当てられている近隣テーブルだけが表示される。なおインターフェイス番号やインターフェイスに割り当てられているIPv6アドレス情報などを表示させるには、「show interface」や「show address」コマンドを実行すればよい(以下、Windows 7上での実行結果)。

C:\>netsh
netsh>interface
netsh interface>ipv6
netsh interface ipv6>show

使用できるコマンドは次のとおりです:

netsh コンテキストから引き継いだコマンド:
show alias - 定義されているエイリアスをすべて一覧表示します。
show helper - トップ レベルのヘルパーをすべて表示します。
show mode - 現在のモードを表示します。このコンテキストのコマンド:
show addresses - 現在の IP アドレスを表示します。
show compartments - コンパートメント パラメーターを表示します。
show destinationcache - 宛先キャッシュ エントリを表示します。
show dnsservers - DNS サーバー アドレスを表示します。
show dynamicportrange - 動的ポート範囲の構成パラメーターを表示します。
show global - グローバル構成パラメーターを表示します。
show interfaces - インターフェイス パラメーターを表示します。
show ipstats - IP 統計情報を表示します。
show joins - 参加したマルチキャスト グループを表示します。
show neighbors - 近隣キャッシュ エントリを表示します。
show offload - offload 情報を表示します。
show potentialrouters - 利用可能なルーターを表示します。
show prefixpolicies - プレフィックス ポリシー エントリを表示します。
show privacy - プライバシー構成パラメーターを表示します。
show route - ルート テーブル エントリを表示します。
show siteprefixes - サイト プレフィックス テーブル エントリを表示します。
show subinterfaces - サブインターフェイス パラメーターを表示します。
show tcpstats - TCP 統計情報を表示します。
show teredo - Teredo 状態を表示します。
show udpstats - UDP 統計情報を表示します。
netsh interface ipv6>show interface

Idx   Met         MTU          状態                 名前
---  ----  ----------  ------------  -------------------
  1    50  4294967295  connected     Loopback Pseudo-Interface 1
 12    50        1280  disconnected  isatap.{2290C0EE-EAB9-469F-AD2E-CDE5498F6C8A}
 14    50        1280  disconnected  Teredo Tunneling Pseudo-Interface
 13     5        1500  connected     ローカル エリア接続 2

netsh interface ipv6>show neighbor 13

インターフェイス 13: ローカル エリア接続 2


インターネット アドレス     物理アドレス       種類
-------------------------  -----------------  ---------
fe80::157b:3788:8e5a:231f  00-15-5d-00-90-49  Stale
fe80::157b:3788:8e5a:4433  到達不可           到達不可
fe80::f96b:8bcb:ce31:1bd9  00-15-5d-00-90-4a  Stale
ff02::1:2                  33-33-00-01-00-02  恒久
ff02::1:3                  33-33-00-01-00-03  恒久
ff02::1:ff5a:231f          33-33-ff-5a-23-1f  恒久

netsh interface ipv6>

 表の一番右側に表示されている「種類」は、そのエントリの現在の状態を表す。IPv6ではモバイル形態などでの運用も考慮しているため、IPアドレスが使用中にひんぱんに切り替わるといった事態も考えられる。そこでIPv4のARPとは違い、各エントリには細かく「状態」が決められ、寿命や探索結果の再利用などについて細かく規定されている(タイムアウトに関するパラメータなども、IPv4の場合よりも短く設定されているものが多い)。規格では次の状態が規定されており、これらが上記のshow neighborsコマンドの状態欄に表示されている。

状態名 意味
(エントリなし) 初期状態。名前解決処理が始まると(Neighbor Solicitationを送信すると)、Incomplete状態へ遷移する
Incomplete(不完全) 近隣ノードに対してL2アドレス解決処理が進行中の状態。Neighbor Solicitation送信後、Neighbor Advertisement待ちの状態。Neighbor Advertisementを受信できずにタイムアウトすると初期状態へ戻る
Reachable(到達可能) Incomplete でNeighbor Advertisement を受信するとこの状態へ遷移する。近隣ノードが有効な状態(最後に通信してから、長くても10秒しか経過していない状態。ただし実際の時間はレジストリなどで変更可能)
Stale 近隣ノードに対して到達可能かどうかが不明な状態。Reachableから例えば10秒経過すると、この状態へ遷移する
Delay 近隣ノードがStale状態で、何かをパケットを送信するとこのDelay状態へ遷移する。その後、該当する近隣ノードからデータを受信するなど、到達可能性が(上位プロトコルによって)確認されればReachable状態へ遷移する
Probe(プローブ) Delay状態において、近隣ノードとの到達可能性が(上位プロトコルによって)確認されずに一定時間経過し(例えば10秒など)、タイムアウトすればこの状態へ遷移する。Probe状態では、Neighbor Solicitation送信後、Neighbor Advertisementを待つ。Neighbor Advertisementを受信すれば(到達可能性が確認されれば)、Reachableへ繊維するが、そうでなければエントリをクリアし、初期状態へ遷移する
Permanent(恒久) 固定的に割り当てられたエントリ。もしくはインターフェイスに対して自動的に作成されたエントリ
(ルータ) ルータを表すノード
IPv6近隣探索テーブル・エントリの状態
netshを日本語モードのコンソールから起動すると、括弧内に示したように、いくつかメッセージが日本語で表示される。

●エントリの手動追加

 エントリを手動で追加するには、set neighborコマンドを利用する。なお、このコマンドや次の削除コマンドを実行するためには、管理者権限のあるコマンド・プロンプト上でnetshを起動する必要がある。

netsh interface ipv6>set neighbors 14 "fec0::5" "12-34-56-78-9a-bc"

●エントリの手動削除

 エントリを手動で削除するには、set neighborコマンドを利用する。引数を付けずに「del neighbors」を実行すると、すべてのエントリが削除される。

netsh interface ipv6>del neighbors 14 "fec0::5"


 今回はL3アドレスからL2アドレスを求める、L2アドレス解決について解説した。次回はIPv6アドレスの自動構成や手動による割り当て方法などについて見ていく。


「Windows管理者のためのIPv6入門」のインデックス

Windows管理者のためのIPv6入門

前のページへ 1|2       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。