それでは、実際にIPv6を使ってみよう。まずはIPv6のアドレスを確認してみる。テストに使用したシステムは、Windows 7のPCが2台である。コンピュータ名は「PC1」「PC2」だ。実際にはHyper-Vの仮想環境上で実行しているが、実環境でもそう違いはない。ただしすでにIPv6環境がネットワーク上にあるとIPv6の挙動が異なるので、ここではプライベート・ネットワーク(外部からは完全に分離、隔離されたネットワーク)環境を構築し、その中で動作させている。つまり、ピア・トゥ・ピアのワークグループ・ネットワーク環境である。IPv6のルータもないし、IPv6アドレスを配布してくれるDHCPサーバもいない。
このようなネットワークの場合、IPv4では各PCに「APIPA」というアドレス(169.254.0.0/16)が割り当てられるが、IPv6の場合は次のようになる。
※Windows 7(PC1)上で実行
C:\>ipconfig …IP情報の確認
Windows IP 構成
イーサネット アダプター ローカル エリア接続 2: …ネットワーク・インターフェイス
接続固有の DNS サフィックス . :
リンクローカル IPv6 アドレス. : fe80::ed87:66e3:4fb2:2b4f%13 …IPv6情報
自動構成 IPv4 アドレス. . . . : 169.254.43.79 …IPv4情報。APIPA
サブネット マスク . . . . . . : 255.255.0.0
デフォルト ゲートウェイ . . . :
…(以下省略)…
「リンクローカル IPv6 アドレス」のところにある「fe80::ed87:66e3:4fb2:2b4f%13」が、このPC1の起動時に割り当てられたIPv6アドレスである(末尾の「%13」はスコープIDという。詳細は後述)。先頭が「fe80::」なので、リンクローカル・ユニキャスト・アドレスであることが分かる。下位64bitにはランダムなアドレスが割り当てられている。このように、IPv6にはアドレスの自己調整設定機能がある(ゼロ・コンフィギュレーションなどとも呼ばれる)。このIPv6アドレスは、起動時にほかのPCと衝突しないようにランダムな値が生成され、利用される。
ではIPv6のpingコマンドを実行してみよう。まず対象となるコンピュータ(この場合はPC2)上でipconfigを実行し、IPv6アドレスを調べておく。そしてそのIPv6アドレスを引数にしてpingコマンドを実行する。アドレスがIPv6形式なら、pingは自動的にIPv6のパケットを送信する。
※PC2(fe80::157b:3788:8e5a:231f)にpingを実行
C:\>ping fe80::157b:3788:8e5a:231f …IPv6アドレスを指定して実行
fe80::157b:3788:8e5a:231f に ping を送信しています 32 バイトのデータ:
fe80::157b:3788:8e5a:231f からの応答: 時間 <1ms …応答
fe80::157b:3788:8e5a:231f からの応答: 時間 <1ms
fe80::157b:3788:8e5a:231f からの応答: 時間 <1ms
fe80::157b:3788:8e5a:231f からの応答: 時間 <1ms
fe80::157b:3788:8e5a:231f の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 0ms、平均 = 0ms
IPv6のアドレス形式でpingが実行されていることが分かるだろう。アドレスの表記以外は、通常のIPv4の場合と同じである。
なおこのpingを実行するにあたり、裏では、通信相手(PC2)のIPv6アドレスからMACアドレスを求めるためのプロトコルが動作している(IPv4におけるARPのようなもの。MACアドレスが分からないとイーサネットではパケットを送信できない)。この詳細については次回解説する。今回は、IPv6アドレスの見方やその指定方法などを理解しておけば十分である。
ところでこの長いIPv6アドレスを使うのはとても面倒である。特に今回のようにランダムな値が設定されていると、それを覚えるのも大変だ。そこでWindows OSのIPv6では、IPv4の場合と同じように、コンピュータ名からこのIPv6アドレスを検索する名前解決サービスLLMNR(Link-local Multicast Name Resolution)が利用できるようになっている。ちなみにIPv4の場合に利用されていたNetBIOS(NBT)の名前解決機能はIPv6では利用できない。
名前を指定してIPv6でpingを実行するには、pingに-6オプションを付けて実行する。IPv4を強制するなら-4だ。-4も-6も付けないと、ネットワークの状態によって(事前の通信状況によって)、どちらで通信するかが変わってくる。
C:\>ping -6 pc2 …IPv6でping
PC2 [fe80::157b:3788:8e5a:231f%13]に ping を送信しています 32 バイトのデータ:
fe80::157b:3788:8e5a:231f%13 からの応答: 時間 <1ms
fe80::157b:3788:8e5a:231f%13 からの応答: 時間 <1ms
fe80::157b:3788:8e5a:231f%13 からの応答: 時間 <1ms
fe80::157b:3788:8e5a:231f%13 からの応答: 時間 <1ms
fe80::157b:3788:8e5a:231f%13 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 0ms、平均 = 0ms
IPv6アドレスの末尾にやはり「%13」というスコープIDがついているが、IPv6形式で実行しているのが分かる。
IPv4でpingを実行すると次のようになる。
C:\>ping -4 pc2 …IPv4でping
PC2 [169.254.35.31]に ping を送信しています 32 バイトのデータ:
169.254.35.31 からの応答: バイト数 =32 時間 <1ms TTL=128
169.254.35.31 からの応答: バイト数 =32 時間 <1ms TTL=128
169.254.35.31 からの応答: バイト数 =32 時間 <1ms TTL=128
169.254.35.31 からの応答: バイト数 =32 時間 <1ms TTL=128
169.254.35.31 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 0ms、平均 = 0ms
IPv4のアドレスで通信しているのが分かる。
このように、アプリケーションによってはIPv4とIPv6のどちらか適切な方(たぶん、内部では早く名前解決などができた方だと思われる)を選んで通信するようになっている。
ところで上の例では、IPv6アドレスの末尾に「%13」という変わった文字列がついているが、これは「スコープID」と呼ばれる、ネットワーク・インターフェイスの識別番号データだ。先ほどIPv6アドレスは1台のノードに複数つけることができるといったが、複数のインターフェイスがある場合、どのインターフェイスからパケットを送信するかが問題となることがある。例えば自動的に作成されている内部トンネル用インターフェイスから送信しようとしても相手には届かないし、相手先へつながっていないインターフェイス経由で送信してもエラーになる。そういう場合は、送信する元のインターフェイスを指定するために、このスコープIDを指定すればよい。またpingコマンドなどは、パケットを受信したインターフェイスが分かるように、IPv6アドレスの末尾にスコープIDが表示されることがある。
スコープIDとは、具体的にはネットワーク・インターフェイスの番号である。「%13」なら、13番のインターフェイスを使って送受信したという意味だ。ちなみに、これはローカルのPCのインターフェイス番号である。通信相手のPCのインターフェイス番号ではない。
インターフェイスの番号は、例えば「route print」コマンドを実行すると確認できる。
C:\>route print …ルーティング・テーブルの表示
==========================================================
インターフェイス一覧 …ここに番号が表示されている
13...00 15 5d 00 90 48 ..Microsoft Virtual Machine バス ネットワーク アダプター #2
1........................Software Loopback Interface 1
12...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter
14...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
==========================================================
…(中略)…
IPv6 ルート テーブル …IPv6のルーティング・テーブル
==========================================================
アクティブ ルート:
If メトリック ネットワーク宛先 ゲートウェイ
1 306 ::1/128 リンク上 …IPv6のアドレス例(リンク上 の原語はOn-Link)。これはループバック・アドレス
13 261 fe80::/64 リンク上
13 261 fe80::ed87:66e3:4fb2:2b4f/128 …割り当てられたIPv6アドレス
リンク上
1 306 ff00::/8 リンク上 …マルチキャスト・アドレス
13 261 ff00::/8 リンク上
==========================================================
固定ルート:
なし
先頭にある「インターフェイス一覧」の左端に表示されているのがインターフェイス番号である。この場合は13番の「Microsoft Virtual Machine バス ネットワーク アダプター #2」が使われていたことが分かる。
最後に、Internet Explorer(IE)でIPv6のアドレスを指定した例を紹介しよう。IEでIPv6アドレスを指定するには、[ ] で囲んで「http:// [fe80::f96b:8bcb:ce31:1bd9]/」 のように指定する。囲まずに直接 「http://fe80::f96b:8bcb:ce31:1bd9/」のように指定するとエラーとなる。
ちなみにこの状態でnetstatコマンドを実行すると、次のようになる。IPv6経由で接続していると、アドレス表記が長くなるだけで、あとは通常のIPv4使用時と変わらない。TCPやUDPを使う側からすれば、IPv6でもIPv4でもそう大きな違いはないといえる。
C:\>netstat …接続の確認
アクティブな接続
プロトコル ローカル アドレス 外部アドレス 状態
TCP [fe80::ed87:66e3:4fb2:2b4f%13]:49166 SVR1:http ESTABLISHED
C:\>netstat -n …IPv6アドレスを表示させる
アクティブな接続
プロトコル ローカル アドレス 外部アドレス 状態
TCP [fe80::ed87:66e3:4fb2:2b4f%13]:49166 [fe80::f96b:8bcb:ce31:1bd9%13]:80 ESTABLISHED
今回はIPv6アドレスの基礎と、pingでのIPv6の使用例などについてみてきた。ユーザーの視点からすると、IPv6でもアドレス表記が長くなっていることを除けば、特に従来と大きな違いはないようにも見える。だが内部的にはIPv4と比べると、さまざまな点が改良されている。次回はIPv6のパケットの構造について取り上げる。
Copyright© Digital Advantage Corp. All Rights Reserved.