IPv6理解のための3つのポイント

   このエントリをはてなブックマークに登録    2016/6/14-1

世界中でIPv6対応が進んでいます。昔は「次世代インターネットプロトコル」と言われていたIPv6ですが、「次世代」ではなく、既に現実として運用されるプロトコルへと成長しました。2016年6月から、iOSアプリの審査基準としてIPv4に依存するコードの禁止が追加され、IPv6対応をiOSアプリの義務なったことからも、IPv6に関する知識が必須となったエンジニアも多いのではないかと思います(Appleの発表)。

IPv6といえば、IPv4で32ビットだったIPアドレスが128ビットへと増えたということ以外は特に知らない方々も多いと思います。ここでは、そんな方々に向けて、IPv6理解のための3つのポイントを紹介をします。

1. IPv4とIPv6は全く別のプロトコル

IPv4とIPv6は全く別のプロトコルです。しかも、互いに直接的な互換性はありません。IPv4とIPv6を直接つなぎ合わせても互いに通信できないのです。

IPv6は、単純にIPアドレス長が32ビットから128ビットへと大きくなっただけではなく、新たに生み出された全く異なるプロトコルであると考えた方がいいです。

IPv4とIPv6では、ヘッダの大きさも構成要素も異なります。パケットを途中経路上で分割するかどうかなど、途中経路上でのパケットの扱い方も異なります。

リンク層プロトコルから見ると、上位層であるネットワーク層のプロトコルがIPv4(0x0800)であるかIPv6(0x86dd)であるかで、全く違うプロトコルとして扱っています。

ブロードキャストの有無、マルチキャストの役割、IPv4のICMPとIPv6のICMPv6の役割の違い、プライベートIPアドレスの有無、NATの扱い、自動IPアドレス設定方法の違い、その他色々と違いはあります。

ユーザへのIPアドレス割当方法も違います。特別な契約でない限り、ISPから一般的な顧客に対して割り当てられるIPv4アドレスはひとつだけです。IPv6では、ネットワークプレフィックスが割り当てられるので、ユーザは64ビット分で表現可能な空間を各自で使えます。

とにかく色々違うのです。互いに直接通信できず、プロトコルごとにネットワーク同士の接続形態も異なるため、「IPv4インターネット」と「IPv6インターネット」のふたつのインターネットが別々に運用されているような状態なのです。

2. 名前空間は共有している

その一方で、「インターネットはひとつである」という考え方もあるために、「名前」に関してはIPv4とIPv6をあえて混ぜた状態で設計されています。このように、ふたつなのだけどひとつであり、別物であると同時に同じものであるという非常にややこしくもあります。

そういった「ふたつであるがひとつである」部分を仮想的に実現しているのがDNSです。たとえば、www.example.comという名前に対してIPv4とIPv6の両方を登録することができます。

Webでの通信を例として考えると、http://www.example.com/ というURLとの通信を行うときに、IPv4で通信をしているのか、それともIPv6で通信をしているのかに関わらず、ユーザが見たいのはwww.example.comのWebページなのです。

IPv4とIPv6で名前空間が全く異なるものであった場合、IPv4ではexample.comというドメイン名の登録を行っている組織と、IPv6でexample.comというドメイン名の登録を行っている組織が違うものになる可能性もあるのです。 そうなってしまうと、流石に意味不明になるので、インターネットの名前空間はIPv4とIPv6でひとつになっています。

IPv4インターネットとIPv6インターネットが全く異なるネットワークであるのは、あくまで通信プロトコル上の話であり、名前空間を含めた、いわゆる「インターネット」としては「ひとつ」なのです。

3. IPv4とIPv6のどちらを使うのか判断するのはユーザ側

IPv4とIPv6が名前空間を共有しているということは、たとえば、IPv4とIPv6の両方で運用されているwww.example.comという名前のサーバに対してクライアントが通信を行うときに、IPv4で通信を行うのか、それともIPv6で行うのかを判断するのは誰でしょうか?

実は、ユーザ側がその判断をしているのです!

サーバ側は、IPv4とIPv6の両方で接続されるのを待っていたとしても、ユーザ側がIPv6での接続を行ってくれなければ、サーバ側がIPv6での通信をユーザと行うことはできません。

では、IPv4とIPv6の両方が使えるユーザは、どちらを使うべきなのでしょうか?もしくは、あなたはどちらの通信を実際には使っているのでしょうか?

そういった判断は個々のアプリケーションごとに行われています。IPv4を使うのか、それともIPv6を使うのかを判断しているのは個々のアプリケーションであるということは、同じ環境であったとしても、アプリケーションごとにIPv4とIPv6のどちらを使うのかに関する判断が異なる可能性があります。

逆にいうと、アプリケーションプログラマは、IPv4を使うのか、それともIPv6を使うのかを個々のアプリケーションごとに判断するコードを書く必要があるのです。

いま、この記事を書いている時点では、それに対する統一された手法は存在しません。いまはまだ「こうやったらいいんじゃないか?」という案があったり、「うちのOSでは、こういう方法を採用したよ」という話があったりで、試行錯誤中なのです(たとえば、RFC 6555参照。)。

まだまだ試行錯誤中

IPv6に関しては、様々なことがいまだに試行錯誤中です。IPv6に関連する各種プロトコルの構築がいまも続いていますし、運用ノウハウが世界中で溜まるには、まだまだ時間がかかりそうです。

とはいえ、IPv4アドレス在庫は既に枯渇していることもあり、IPv6を利用した通信は急激に増えています。ネットワークエンジニアやインフラエンジニアにとって、IPv4だけではなくIPv6に関する知識も求められるようになるのかも知れません。

ここで紹介している3つのポイントが、IPv6を勉強するための入り口として少しでもお役に立てれば幸いです。

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