■IPv6の主要なプロトコル
IPv6では以下の3つの重要なプロトコルがあります。
- ICMPv6
- ND ( Neighbor Discovery )
- MLD ( Multicast Listener Discovery )
NDおよびMLDの動作にはICMPv6を利用しているのでICMPv6ではIPv6では必須の技術となります。上記3つのプロトコルについて詳しく見ていきます。
■ICMPv6
ICMPv4は送信したパケットのエラー通知やネットワークから情報取得を行なっていました。ICMPv4のこういった特性を利用してPingやTracerouteといったアプリケーションは動作していました。IPv6では利用される重要性がより大きくなっておりICMPv6が動作しなければIPv6では通信が成り立ちません。例えばIPv4でいうARP通信はIPv6ではNDが行います。このNDは情報の伝達にICMPv6を利用するのでこれが動作しなければIPv6上では通信が成り立たないというわけです。
IPv6が動作する際、以下のような場面でICMPv6は利用されます。
- エラー報告
- 状態通知
- L2アドレス解決
- L3アドレス解決
- マルチキャストリスニング
IPv4で利用されていたARPやIGMPはICMPとは独立して動作しており、各々の動作を実行するのにICMPは不要でした。しかしIPv6ではIPv4において個別に実行されていたプロトコル群の機能がICMPv6に集約されています。ただ、一見すると全ての処理をICMPv6が担当しているように見えますが、複雑な処理はNDやMLDが行なっています。
■Neighbor Discovery
IPv6の動作機構を理解する上で最も重要なのがND ( Neighbor Discovery ) です。上記に書いた通りICMPv6はIPv4の重要なプロトコルを統合していますがその大半はこのNDで実現されます。NDが提供する機能を以下にまとめます。
機能 | 概要 |
リンク層アドレス検出 | IPv4のARPに相当する。リンク層アドレスとIPv6アドレスを関連付ける |
隣接ルータ検出 | ノードが接続可能な同一リンク上のルータを検出する |
アドレスプレフィックス検出 | 接続されたリンクのアドレスプレフィックスを検出し直接通信可能なアドレス範囲と ルータ経由でしか通信できない範囲かを識別する |
パラメータ検出 | リンクMTUやホップリミットの値を検出する |
重複アドレス検出 | ノードに割り当てたアドレスが他のノードと重複していないか検出する |
隣接ノード状態検出 | 隣接ノードの通信不能状態を検出する |
Next-HOP決定 | パケットの転送先を決定する |
IPv6アドレス自動設定 | DHCPを用いずにIPv6ノードだけでアドレスを自動設定する |
NDは大きくわけて3つのメッセージに分類できます。
・RS ( Router Solicitation ) / RA ( Router Advertisement )
IPv6アドレス自動生成、ネクストホップ決定、パラメータ検出、アドレスプレフィックス検出、隣接ルータ検出に利用されます。
・NS ( Neighbor Solicitation ) / NA ( Neighbor Advertisement )
リンク層のアドレスの解決 ( ARPの代替 ) 、重複アドレスの検出、隣接ノード状態検出に利用されます。
・Redirect
より最適なネクストホップを通知するためのメッセージです。
Redirectを除くこれらの全てのメッセージはマルチキャストを利用します。NDの動作を理解するにはIPv6で新たに追加されたマルチキャストの新しい仕組みを理解しなければいけません。それが「ソリシテッドノード・マルチキャストグループ」です。
■ソリシテッドノード・マルチキャストアドレス
IPv4ではARP等で頻繁にブロードキャストが利用されていました。このため自分宛のパケットであろうがなかろうがブロードキャストが発生するリンク上の全てのノードがブロードキャストを受信していました。IPv6ではブロードキャストの代わりにマルチキャストを送信することでブロードキャストのような制約をうけないよう考慮されています。
そのためIPv6ノードはインターフェイスを有効にするときにff02::1 ( All Node Multicast Group ) とソリシテッドノード・マルチキャストの2つに必ず参加しなければならないと規定されています。ソリシテッドノード・マルチキャストはインターフェイスに設定されているユニキャストアドレスやエニーキャストアドレスから自動生成されるマルチキャストアドレスです。
ソリシテッドノード・マルチキャストプレフィックス部分にwell knownマルチキャストプレフィックスであるff02::1:ff/104とユニキャストアドレスの下位24bitを組み合わせて構成されます。下記がその一例です。
L2で使用されるマルチキャストMacアドレスもユニキャストアドレスから生成されます。IPv6用のマルチキャストアドレスとして予約されている33-33とユニキャストアドレスの下位32ビットを使用します。
■ARPの仕組み
IPv6ではARPによるブロードキャストを実行するのではなく上記のソリシテッドノード・マルチキャストを利用します。IPv6ではインターフェイスにIPv6アドレスが設定された時点でソリシテッドノード・マルチキャストグループに参加しています。そしてパケットを送信する側は送信したいユニキャストアドレスがわかっていればそこからソリシテッドノード・マルチキャストを計算しARP解決が可能な状態になっています。このソリシテッドノード・マルチキャストに対してNSを送信すると受け取ったノードはMACアドレスをNAに付加してユニキャストで返信します。
この動作がIPv6になって全てのIPv6ノードがソリシテッドノード・マルチキャストに参加しなければならないというルールに従うようになりARP解決が可能になったことで関係のないノードは巻き込まれずにすむようになりました。
但し、ソリシテッドノード・マルチキャストアドレスの生成方法では下位24ビットのみを使用するので他のノードと重複する可能性があります。ソリシテッドノード・マルチキャストは全ネットワーク上でユニークであることを保証するものではないので重複の可能性は否めません。ですが、重複したからといってARP解決ができないわけではありません。NSを運んでくるICMPv6にはターゲットフィールドが存在しこの中に目的のユニキャストアドレスが存在しているので、自身のアドレスと一致しているか確認し一致しなければ無視します。
このような仕組みをもうけることでソリシテッドノード・マルチキャストが重複しているノードが存在してもARP解決は正しく行われます。
■IPv6アドレスの自動設定
IPv4にはアドレス設定において「手動設定」と「ステートフル( DHCP ) 設定」がありました。IPv6にはこれらに加えてストレートレス設定と呼ばれる手法が追加されました。このステートレスアドレスはICMPv6のRAとDADの機能で構成されます。ステートレスアドレスによる自動設定は以下のステップで行われます。
1. MACアドレスからのリンクローカルアドレス生成
2. DAD ( 重複アドレスの検出 )
3. RAによるアドレスプレフィックスの取得
4. アドレス自動設定完了
以下、各ステップの詳細です。
①Macアドレスからリンクローカルアドレス生成
MACアドレスは48bit長のアドレス体系であり、EUI-48とも呼ばれます。一方、IPv6のインターフェイスIDは64bitなのでMacアドレスをそのまま流用するには少し足りません。そこでIEEEではEUI-48の64bit版であるEUI-64を定めているのでMacアドレスをこのEUI-64形式に変換することでインターフェイスIDとして利用します。
②DAD ( Duplicate Address Detection )
仮にリンクローカルアドレスが生成されてもインターフェイスにはまだ割り当てられません。この仮のアドレスが同一セグメント上で既に利用されていないか確認する処理が実行されます。この処理をDAD ( Duplicate Address Detection ) と呼びます。送信元IPアドレスを::とし、仮で生成したリンクローカルアドレスNSのターゲット・フィールドに挿入して、ソリシテッドノード・マルチキャストにNSを送信します。もし、この仮のアドレスが使用されていなければNSに応答するノードはないので重複しているノードは存在しないと断定できます。
③RAによるアドレスプレフィックスの取得
リンクローカルアドレスが生成されたのでこれを送信元とし、送信先をff02::2にしてRSを送信します。このRSを周辺のルータが受信するとアドレスプレフィックスを含んだRAを返信します。
④アドレスの完成
③で取得したアドレスプレフィックスと①で生成されたインターフェイスIDからユニキャストアドレスが完成します。
グローバルユニキャストアドレスの場合は手動と上記のEUI-64の両方どちらでも作成可能です。リンクローカルユニキャストアドレスの場合はインターフェイス上でIPv6が有効となった時点で上記ステップを踏み、自動で生成されます。
■NUD ( Neighbor Unreachability Detection )
リンク層アドレスを取得したらリンク上の周辺ノードが正常に動作しているかIPv6で確認可能です。IPv6にはネイバーキャッシュと呼ばれるテーブルが存在します。これは同一セグメント上にIPv6アドレスとMacアドレスを管理するためのものでIPv4のARPテーブルに該当します。NUDはこのネイバーキャッシュの維持管理を行うことで実現します。
ネイバーキャッシュには以下の情報が含まれます。
①ネイバーノード:同一セグメント上に存在するIPv6ノードを示します。
②リンク層アドレス:ネイバーノードのIPv6に対応するリンク層アドレスを示します。
③ルータフラグ:ネイバーノードがルータかホストのどちらであるか示します。
④到達性の状態:ネイバーノードにパケットが到達可能であるか示します。この到達性の状態には以下の5項目があります。
状態 | 説明 |
INCOMPLETE | NSを送信したがNAを受け取れなかった状態であり該当ノードのMacがわからない状態 |
REACHABLE | NAを受信し到達可能であることが確認できた状態。 |
STALE | NAを受信してから到達可能時間を超えた状態です。最近通信がないことを意味します。 |
DELAY | STALEのときに該当ノードにパケットを届ける必要が生じた状態。 |
PROBE | 再送タイマーごとに到達性を確認するためのユニキャストを送信した状態 |