URIに含まれるIPv6ゾーンID - RFC 6874

   このエントリをはてなブックマークに登録    2018/10/18-1

fe80::/64というリンクローカルIPv6アドレス(リンクローカルユニキャストIPv6アドレス)は、同一リンク内でのみ利用可能なリンクローカルスコープのIPv6アドレスです。 リンクローカルスコープのIPv6アドレスは、同一リンク内においてのみ利用可能であるため、他のリンク内に存在しているリンクローカルIPv6アドレスに干渉しません。 そのため、たとえば、fe80::aというIPv6アドレスが、それぞれ異なるリンクに存在していてもOKです。

さらに、リンクローカルIPv6アドレスは、IPv6が有効になっている全てのネットワークインターフェースに対して設定されるため、世界中のさまざまなリンクでfe80::/64というプレフィックスが存在しています。 そのため、fe80::/64による128ビットのIPv6アドレスだけでは、通信相手を一意に指定できない場合があります。

たとえば、fe80::aというリンクローカルIPv6アドレスと通信を行う場合、あるリンク中で利用されているとき、そのIPv6アドレスがどのリンクに接続されたものかを指定する必要があります。 fe80::a%eth0 のような感じです。

IPv6アドレスを表現するときに、ゾーンID(ゾーンインデックス)とともに表現する方法がRFC 4007で紹介されていますが、ゾーンIDそのものをどのように表現するのかに関しては、RFC 4007は「implementation dependent and is out of scope of this document」としています。 システムによってはeth0などの表現がゾーンIDとして使われることがありますが、あれは実装依存の表現なのです。

さて、このように表現が実装依存するゾーンIDですが、ゾーンIDと組み合わせてIPv6アドレスが表現されたものがURIに含まれる場合に関して定義したRFC 6874が2013年に発行されています。

RFC 4007では、ゾーンIDとIPv6アドレスを組み合わせて表現する際のフォーマットを「<address>%<zone_id>」としています。 しかし、URIの構文(Generic Syntax)を定義しているRFC 3986では、「This syntax does not support IPv6 scoped addressing zone identifiers.」と明確に示してあり、ゾーンIDとIPv6アドレスを組み合わせた表記をサポートしていません。

RFC 6874では、ゾーンIDとIPv6アドレスの間にある%に対してPercent-Encodingを行なった値ですが%25を利用することを定義しています。 これにより、fe80::a%eth0を含むURLの表現は、以下のようになります。

http://[fe80::a%25eth0]/

注意が必要なのは、この仕様が必ずしも実装されているとは限らないという点です。 グローバルスコープであるグローバルIPv6アドレスでは、ゾーンIDは使われることはありません(仕様上使えません)。 URI中にゾーンIDを使いたくなるのは、多少特殊な状況に限られることもあり、サポートしていないソフトウェア(ライブラリ等含む)に出会うこともあります。

   このエントリをはてなブックマークに登録