IPv6

背景と推移

IPv6が誕生した背景には、IPv4のIPアドレス枯渇問題がある。
1980年代までは、米国内を中心に、Class A (/8)、Class B (/16)、Class C (/24) などの単位で各組織にIPアドレスを割り振っていた。1990年代に入り、インターネットの国際化と、参加組織の増大によって、Class BのIPv4アドレスが不足する恐れが出てきた。IPアドレスの数が有限である以上、根本的な解決策が必要となることは自明であり、その解決策として検討された最終成果がIPv6である。
しかし、新しいプロトコルであるIPv6を開発し普及させるには時間がかかるため、短期的な対策であるIPv4の延命として、1994年のプライベートアドレス (RFC 1918) の導入と前後して、CIDR (RFC 4632)・NAT (RFC 2663) ・Proxy(プロキシ)など、プライベートアドレスを使用するLANとグローバルアドレスを使用するWANとを使い分けることでIPv4アドレスを節約し有効活用する取り組みが行われた。
一部には、IPv4アドレス枯渇には、既存の回避策で対応可能であるとIPv6の必要性を疑問視する声もあった。しかし、国際的なインターネットの爆発的な普及と、携帯電話やスマートフォンなどのインターネット利用機器が急速に増加したことにより、新たなIPアドレスの需要が、運用の改善や新たな回避策によるIPアドレスの供給を上回っており、限界に達しようとしている。また、回避策による弊害も顕著になってきており、インターネットの新たな利用形態の普及を阻害している。
現在は、IPv6は運用に目途が立って徐々に普及しつつあり、IPv4とIPv6を併用しつつIPv6へ移行することが課題になっている。

現状と展望

IPv6は、ゆっくりながらも普及が進んでいる。Googleの統計によると、IPv6によるアクセス数は増加傾向にある。全体のアクセス数に対する割合として、2014年10月で5％程度、2016年10月で14％程度（日本国内では14%程度、最も普及しているベルギーで48%程度）になっている。
一般家庭でIPv6を利用するには、複数のレベルでIPv6対応がなされている必要があり、大きく分けると、ISPによりIPv6接続が提供されていること、利用するインターネット上のサービスがIPv6接続に対応していること、ルーターなどのインターネット接続に利用する機器がIPv6に対応していること、そして通信するホストがIPv6接続に対応していること、などとなる。
このうちオペレーティングシステム (OS) やアプリケーションなどのソフトウェアは、細かい差異こそあれ、既にIPv6への対応を終えているものが多くある。
また、インターネット上の各々のサービスサイト（ウェブサイトなど）でも、Googleなど大手中心にIPv6対応が進みつつあるが、OS等ほどには進んでおらず、サイトの更改に対応しきれてないサイトもある。
通信経路となるISPによるIPv6の対応は、提供が最も遅れている分野であり、それによりIPv6の現実での利用は未だ限定的なものとなっている。
ソフトウェアやインターネット上のサービスのIPv6対応は、IPv6と従来のIPv4の両方が利用可能という形で行われ、接続相手の利用可能なIPのバージョンによりどちらを利用するか（自動的に）選択するようにするのが一般的である（IPv4との相互運用を参照）。
今後は、IP放送、IPテレビ電話、IP電話、IoT等のエンドユーザサービスへのIPv6の採用が進むことが想定され（一部は展開されている）、そのようなIP上の専用サービス等がIPv6の普及の牽引役となることも期待され続けている。一方で強力なキラーアプリケーションの不在も指摘されている。
アメリカ合衆国では、国防総省によるIPv6化宣言により、IPv6化が進むことが期待されている。

ISPのIPv6対応

日本国内では、一部のISP（接続業者、ホスティングサーバ業者）によって商用・実験サービスが開始されているほか、NTT東日本及びNTT西日本によって、一部のフレッツ網で利用されている。また、日本国内におけるISP各社の対応については、インターネットプロバイダー協会 (JAIPA)「ISPのIPv6対応について」でまとめられている。

OSのIPv6対応

オペレーティングシステム (OS) は、多くがIPv6に対応している。具体的には、Microsoft WindowsではWindows XPおよびWindows Server 2003以上で利用可能であるほか、FreeBSD, NetBSD, OpenBSD, Linux, Solaris, AndroidなどのUnix系のOSやmacOS, iOSはIPv6に対応している。
一部には仕様に厳密には従っていない実装も見られる。例えば、Windows 8は30日毎にIPv6/IPv4の到達性を確認し、IPアドレスの優先度を変更するが、この動作は RFC 3484 非準拠である。
なお、IPv6のプロトコルを有効にしているWindowsを使用しているユーザーは、ISPがIPv4のみを提供している場合でも、Microsoftが無償提供するTeredoサービスを利用する形で、通信速度に問題があるものの、既に基本設定でIPv6で通信可能な状態になっている場合がある（ただし、Teredoサービスを利用している場合には、DNSクライアントの仕様のため、事実上IPv6が使用できない）。

アプリケーションのIPv6対応

一般のユーザーが利用するアプリケーションは、IPv6への対応を終えているものが多い。
Windowsでの例を挙げると、OS付属のアプリケーションではMicrosoft Edge, Internet Explorer, Microsoft 管理コンソール, Windows Media Player, Windows PowerShell, リモートデスクトップ接続など、また、telnet, ftpなどのコマンドラインアプリケーションで、サードパーティ製品では、Mozilla FirefoxやOperaのほか、Apache HTTP Server、Meadow、Tera Term、PuTTY、FFFTP、NextFTPなどでIPv6が利用可能である。詳しくはIPv6 related worksを参照。
macOSでは、標準のネットワークライブラリがIPv6に対応しており、これを使用している多くのアプリケーションでIPv6が利用可能である。10.3まではSafariは独自のネットワークライブラリを利用しているため、IPv6の対応は不完全であったが、10.4以降は完全に動作している。

プログラムによるIPv6サポート

IPv6をアプリケーションで利用するためのプログラムは、IPv4でのプログラムと比べて大きな違いがあるものではない。
ネットワークを利用するプログラムではソケットを利用することが多く、通常のIPv4プログラミングでsocketを作成するときには
s = socket(AF_INET, SOCK_STREAM, 0);
のように、アドレスファミリ部をIPv4固定で指定することが多いが、一つのサイトがIPv4とIPv6の両プロトコルに対応している場合や、どちらに対応しているのか事前にはわからないことを考慮すると、DNSで一つの名前を検索した後、列挙された複数のプロトコルのアドレスに対して順番にconnectを試みる必要がある。
アドレスを検索する際は、IPv4のみを前提としている"gethostbyname()" や、socket同様にアドレスファミリ固定である"gethostbyname2()" などではなく、"getaddrinfo()" を利用する。
以上をまとめると、典型的なソケットを作成するCのコードは以下のようになる。
struct addrinfo hints, *res, *res0;int error, s;memset(&hints, 0, sizeof(hints));hints.ai_family = PF_UNSPEC;hints.ai_socktype = SOCK_STREAM;/* TCPの場合 */if ((error = getaddrinfo("ホスト名", "サービス名", &hints, &res0)) != 0)
return -1;s = -1;for (res = res0; res != NULL; res = res->ai_next) {
if ((s = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1)
continue;
if (connect(s, res->ai_addr, res->ai_addrlen) == 0)
break;
close(s);
s = -1;}freeaddrinfo(res0);if (s == -1) {
/* Could not connect */} else {
/* Success */}
この手法はIPv6のみならず、別のIPプロトコルが登場した場合にも有効な手法で、プロトコル独立プログラミングなどと呼ばれる。
なお、ここで示した方法は、getaddrinfo() によって返されるアドレスファミリの順に接続を試みるので、AAAAレコードより先にAレコードを返すようなgetaddrinfo() では、IPv6による通信が行われない可能性もある。

IPv6 のアドレス構造

IPv4とIPv6の最も大きな違いは、そのネットワークアドレスの長さにある。従来までのIPv4が32ビットであったのに対し、IPv6は128ビットである。
IPv6のアドレスは、前半部（プレフィックス,ネットワークID）と後半部（インタフェースID）に分けられて管理される。インタフェースIDは、一意性を得るためにMACアドレス等から生成されるModified EUI-64フォーマットが使用されることが多いが、プライバシー上の懸念があるため、一意性およびプライバシーの双方を満たす仕様への変更が推奨されている（RFC 7217、RFC 7721）。サーバでは手動で静的に設定されることも多い。
アドレスの一意性は最終的にはDuplicate Address Detection (DAD) という仕組みで保証される。

近隣探索 (Neighbor Discovery)

IPv4 では通信相手の IPアドレス からその MACアドレスを取得するために ARP を用いていたが、IPv6 では近隣探索 (Neighbor Discovery) という方法が用いられる。
これは、ICMP の IPv6 版である ICMPv6 の枠組み（NDP、Neighbor Discovery）を用いてアドレス解決する。アドレス解決をしたいノードはペイロードに解決したいアドレスを格納して、全ノード宛マルチキャストアドレスに IPv4 の ARP request に相当する Neighbor Solicitation (NS) パケットを送信し、それに答えるべきノードは、Target linklayer address option に自ノードの MAC アドレスを格納した Neighbor Advertisement (NA) を送信してアドレス解決を行う。
RFC 4861 で規定されている。

アドレス自動設定

IPv6ではDHCPを用いなくてもルータさえあればアドレスの自動設定が可能となっている (RFC 4862)。
IPv6ノードのネットワークインタフェースには、必ず linklocal address というそのリンクだけに到達性のあるアドレスがつく。これは fe80:: というプレフィックスと、MACアドレスから生成されたインタフェースIDとから生成されるのが通常であるが、そのリンク内で一意であれば手動で設定してもかまわない。最終的にはアドレスの一意性はDADに基づいて解決される。
また、ルータは自分の接続しているネットワークに対し、定期的にあるいは要請に基づいて、そのネットワークに関する情報（Router advertisement; RA）を送信している。この情報に含まれるプレフィックス情報と一意のインタフェースIDを用いて、IPv6ホストはグローバルアドレスを生成する。同時に、そのIPv6ホストは受信したRAを送信したルータをデフォルト経路に設定することで、グローバルIPv6ネットワークへの接続性も確保できる。
しかし、この仕組みでは名前解決のためのDNSサーバのアドレスを取得することはできないため、それにはDHCPv6など別の仕組みが必要になる。

日本のNTTのフレッツ網におけるIPv6

NTT（東日本、西日本）のフレッツ網は、実運用されているIPv6のネットワークとしては2011年現在で約1390万回線を有する世界最大級のネットワークである。フレッツ網におけるIPv6の適用の詳細については、上記項目を参照。