IPv6アドレスのテキスト表記 - RFC 4291とRFC 5952

   このエントリをはてなブックマークに登録    2017/9/29-1

コンピュータの中で扱うときにはIPv6アドレスは128ビットの情報として扱われますが、その128ビットを人間が理解するために文字列で表記することもあります。

IPv4の場合は、「192.0.2.100」のように8ビットごとに「.(ドット)」で区切るドット付き十進表記 (dotted decimal notation)で表現されますが、IPv6の場合は16ビットごとに「2001:db8:11aa:22bb:33cc:44dd:55ee:66ff」のように「:(コロン)」区切りの十六進法で表現されます。

IPv4アドレスのテキスト表現(ドット付き十進表記)


IPv6アドレスのテキスト表記

IPv6表記には省略を行うことを前提とした表記ルールがあります。 IPv6アドレスをテキストでそのまま全部書くと長くなりがちなためです。

IPv6の表記に関して注意が必要なのが、2006年に発行されたRFC 4291定義されたIPv6表記法では同じIPv6アドレスに対して複数の表記方法が存在する場合がある点です。

そのため、表記方法を統一して単純化する方法として、2010年にRFC 5952が発行されています。

RFC 4291のルール

まず、RFC 4291のルールを紹介します。 IPv6アドレス体系を規定しているRFC 4291のIPv6アドレステキスト表記ルールは以下のようになっています。

IPv6アドレスは16ビットごとに区切った表記が使われますが、それぞれの16ビットのフィールドの先頭で連続する0を省略することができます。

RFC 4291では、複数の16ビットフィールドにわたって0が続く場合に、「::」で省略しても良いという表記ルールもあります。

ただし、「::」が適用可能な16ビットフィールドが複数存在するとき、「::」を利用して省略を行って良いのは1箇所のみです。

IPv4アドレスをIPv6アドレス内に含む特殊なIPv6アドレスの表記として、以下の表記がRFC 4291で例示されています。

  • 0:0:0:0:0:0:13.1.68.3
  • 0:0:0:0:0:FFFF:129.144.52.38

上記を圧縮したもの。

  • ::13.1.68.3
  • ::FFFF:129.144.52.38

RFC 5952のルール

RFC 4291のIPv6アドレス表記ルールでは、同じIPv6アドレスに対して複数の表記方法が可能となる場合があります。

たとえば、RFC 4291ルールで同じIPv6アドレスに対して複数表記が行われる例として、RFC 5952では以下のIPv6アドレス例が記載されています。 一見それぞれ異なるもののようにも見えますが、以下は全て同じIPv6アドレスを表現したものです。

  • 2001:db8:0:0:1:0:0:1
  • 2001:0db8:0:0:1:0:0:1
  • 2001:db8::1:0:0:1
  • 2001:db8::0:1:0:0:1
  • 2001:0db8::1:0:0:1
  • 2001:db8:0:0:1::1
  • 2001:db8:0000:0:1::1
  • 2001:DB8:0:0:1::1

このような曖昧さを排除し、統一されたIPv6アドレスのテキスト表現を規定しているのが2010年8 月に発行されたRFC 5952です。

RFC 5952には以下のルールが示されています。

「::」による短縮時に可能な限り短くする

16ビット0 が連続していて「::」による短縮が可能な場合、最も短縮できる表現を利用しなくて はなりません。 たとえば、2001:db8:0:0:0:0:2:1の場合、2001:db8::2:1 と表現すべきであり、2001:db8::0:2:1と表現してはいけません。

16ビットだけのため「::」を利用してはならない

  • 正 2001:db8:0:1:1:1:1:1
  • 誤 2001:db8::1:1:1:1:1

最も大きく短縮可能な箇所に「::」を利用する

2001:0:0:1:0:0:0:1というIPv6アドレスは、16ビットの0が2つ連続する箇所と、3つ連続する箇所がありますが、最も大きく短縮可能な3連続16ビット0を「::」で短縮し、2001:0:0:1::1のようにします。

同じ長さの16ビットの0フィールドが複数ある場合には最初の箇所に「::」を利用する

同じ長さの16ビット0がある場合、最初に登場する16ビット0を「::」で短縮して、2001:db8::1:0:0:1のようにします。

大文字ではなく小文字を利用する

16進数表現の10-15を表現するローマ字表記として大文字ではなく小文字を利用します。 abcdefを利用し、ABCDEFを利用しないように注意しましょう。

特殊IPv6アドレスでの利用

IPv4射影IPv6アドレス(IPv4-Mapped IPv6 Address)では「::ffff:192.0.2.1」のような表現を利用します。 先頭にある0が続く部分に関しては「::」で省略し、「0:0:0:0:0:ffff:192.0.2.1」のような表現を利用しないことが求められます。

ポート番号との表記

RFC 5952では、IPv6アドレスとポート番号を表現するときのありがちな例として以下のようなものが紹介されていますが、IPv6アドレスとポート番号を「:」で区切る上から2番面の表現は推奨されていないとしてあります。

推奨されているのは、IPv6アドレス部分を[] (鉤括弧)で囲った一番上の例です。 []でIPv6アドレス部分を囲った表現はRFC 3986でも利用されています。 Webブラウザなど、非常に多くのアプリケーションが、この[]を利用した表記を採用しています。

  • [2001:db8::1]:80
  • 2001:db8::1:80 (この方法は推奨されません)
  • 2001:db8::1.80
  • 2001:db8::1 port 80
  • 2001:db8::1p80
  • 2001:db8::1#80

注意点

RFC 5952は、人間が混乱しないための表記方法を提案するものであり、データベース内などで利 用するためのものではありません。 RFC 5952は、テキストとしてIPv6アドレス情報を出力するときに読みやすい方法にしましょうという話であって、文字列をパースするときの条件を示したものではないのです。

そのため、文字列で表現されたIPv6アドレスをパースするアプリケーションを作る場合には、RFC 4291に従った表記を正しく処理できるようにする必要があります。

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