TCP/IP群 |
---|
アプリケーション層 |
|
トランスポート層 |
カテゴリ |
インターネット層 |
カテゴリ |
リンク層 |
カテゴリ |
Internet Protocol Version 6(インターネット プロトコル バージョン6)、IPv6(アイピーブイ6、アイピーバージョン6)は、Internet Protocolの一種で、OSI参照モデルにおいてネットワーク層に位置付けられる通信プロトコルである。
現在主流のIPv4では使用可能なIPアドレスが約 232(約43億 = 4.3×109)個であったが、IPv6では約 2128(約340澗 = 3.4×1038)個使用可能となっており、大きな特徴の一つである[1]。実際、ISPの一般向けIPv4接続サービスはアドレスをひとつだけ割り当てるものが主流だが、IPv6接続サービスでは/48〜/64の大きさのアドレスブロックが割り当てられることが多い。
IPv6が誕生した背景には、IPv4のIPアドレス枯渇問題がある[2]。
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アドレスを節約し有効活用する取り組みが行われた[3]。
一部には、IPv4アドレス枯渇には、既存の回避策で対応可能であるとIPv6の必要性を疑問視する声もあった。しかし、国際的なインターネットの爆発的な普及と、携帯電話やスマートフォンなどのインターネット利用機器が急速に増加したことにより、新たなIPアドレスの需要が、運用の改善や新たな回避策によるIPアドレスの供給を上回っており、限界に達しようとしている。また、回避策による弊害も顕著になってきており、インターネットの新たな利用形態の普及を阻害している。
現在は、IPv6は運用に目途が立って徐々に普及しつつあり、IPv4とIPv6を併用しつつIPv6へ移行することが課題になっている。
IPv6は、ゆっくりながらも普及が進んでいる。Googleの統計[6]によると、IPv6によるアクセス数は増加傾向にある。全体のアクセス数に対する割合として、2014年10月で5%程度、2016年10月で14%程度、2020年9月で30%程度(日本では35%程度、最も普及しているベルギーで52%程度)になっている。日本での普及率は2024年に50%となった[7]。
一般家庭でIPv6を利用するには、複数のレベルでIPv6対応がなされている必要があり、大きく分けると、ISPによりIPv6接続が提供されていること、利用するインターネット上のサービスがIPv6接続に対応していること、ルーターなどのインターネット接続に利用する機器がIPv6に対応していること、そして通信するホストがIPv6接続に対応していること、などとなる[8]。
このうちオペレーティングシステム (OS) やアプリケーションなどのソフトウェア[注 1]は、細かい差異こそあれ、既にIPv6への対応を終えているものが多い。
また、通信経路となるISPによるIPv6の対応は、NTTのフレッツ 光ネクストIPv6 IPoE接続サービスの登場や、移動体通信事業者によるモバイルインターネットサービスのIPv6化がなされたこと[9]により、普及が進んでいる。
インターネット上の各々のサービスサイト(ウェブサイトなど)はGoogleなど海外サービスを中心にIPv6対応が進みつつあるが、日本のサービスの多くは未だIPv6での接続に対応しておらず、提供が最も遅れている分野である。
ソフトウェアやインターネット上のサービスのIPv6対応は、IPv6と従来のIPv4の両方が利用可能という形で行われ、接続相手の利用可能なIPのバージョンにより、どちらを利用するか(自動的に)選択するようにするのが一般的である(IPv4との相互運用を参照)。
今後は、IP放送・IPテレビ電話・IP電話・IoTなどのエンドユーザサービスへのIPv6の採用が進むことが想定され(一部は展開されている)、そのようなIP上の専用サービスがIPv6の普及の牽引役となることも期待されている。一方で強力なキラーアプリケーションの不在も指摘されている。
日本国内では、一部のISP(接続業者、ホスティングサーバ業者)によって商用・実験サービスが開始されているほか、NTT東日本及びNTT西日本によって、一部のフレッツ網で利用されている。また、日本国内におけるISP各社の対応については、インターネットプロバイダー協会 (JAIPA)「ISPのIPv6対応について」でまとめられている。
オペレーティングシステム (OS) は、多くがIPv6に対応している。具体的には、Microsoft WindowsではWindows XPおよびWindows Server 2003以上[注 2]で利用可能であるほか、FreeBSD, NetBSD, OpenBSD, Linux, Solaris, AndroidなどのUnix系のOSやmacOS, iOSはIPv6に対応している。
一部には仕様に厳密には従っていない実装も見られる。例えば、Windows 8は30日毎にIPv6/IPv4の到達性を確認し、IPアドレスの優先度を変更するが、この動作は RFC 3484 非準拠である[11]。
なお、IPv6のプロトコルを有効にしているWindowsを使用しているユーザーは、ISPがIPv4のみを提供している場合でも、Microsoftが無償提供するTeredoサービスを利用する形で、通信速度に問題があるものの、既に基本設定でIPv6で通信可能な状態になっている場合がある(ただし、Teredoサービスを利用している場合には、DNSクライアントの仕様のため、事実上IPv6が使用できない[12])。
一般のユーザーが利用するアプリケーションは、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が利用可能である。
macOSでは、標準のネットワークライブラリがIPv6に対応しており、これを使用している多くのアプリケーションでIPv6が利用可能である。10.3まではSafariは独自のネットワークライブラリを利用しているため、IPv6の対応は不完全であったが、10.4以降は完全に動作している。
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と共存させる必要があることから、次のようなデメリットや課題が発生する。
IPv4とIPv6の最も大きな違いは、そのネットワークアドレスの長さにある。従来までのIPv4が32ビットであったのに対し、IPv6は128ビットである[20]。
IPv6のアドレスは、前半部(プレフィックス,ネットワークID)と後半部(インタフェースID)に分けられて管理される[21]。インタフェースIDは、一意性を得るためにMACアドレスなどから生成されるModified EUI-64フォーマットが使用されることが多いが、プライバシー上の懸念がある[注 5]ため、一意性およびプライバシーの双方を満たす仕様への変更が推奨されている(RFC 7217、RFC 7721、RFC 8064)。サーバでは手動で静的に設定されることも多い[要出典]。
アドレスの一意性は、最終的にはDuplicate Address Detection (DAD) という仕組みで保証される[22]。
従来のIPv4では、アドレスの値を8ビット単位でドット(.
)で区切り、十進法で表記する[23]。
[例] 192.0.2.1
IPv6では、128ビットを表記する際、IPv4と同様の表記では冗長になりすぎるため、アドレスの値を16ビット単位でコロン(:
)で区切り、十六進法で表記する[24]。
[例] 2001:0db8:bd05:01d2:288a:1fc0:0001:10ee
この方法でも、まだ冗長であるため、以下のルールが適用される場合がある[25]。
[例] 2001:0db8:0020:0003:1000:0100:0020:0003 = 2001:db8:20:3:1000:100:20:3
[例1] 2001:0db8:0000:0000:1234:0000:0000:9abc = 2001:db8::1234:0:0:9abc [例2] 2001:0db8:0000:0000:0000:0000:0000:9abc = 2001:db8::9abc
上記のルール (RFC 4291) では同じIPv6アドレスに複数の表記が許容されることになる。
アドレスの表記を唯一に統一し単純化するためのルール (RFC 5952) も存在し[28]、同RFCのセクション4に従うと、以下のようになる。
その他、アドレスの種類によっては、以下のような特殊な表記が用いられることがある。
[例] ::ffff:192.0.2.1
[例1] fe80::0123:4567:89ab:cdef%4 [例2] fe80::0123:4567:89ab:cdef%fxp0
また、サブネットマスクは2001:0db8:9abc::/48
のように表記される。この場合、先頭から48ビット (2001:0db8:9abc
) がネットワークアドレス部である。ただし、IPv4と異なり、グローバルアドレスのエンドユーザーへの割り当て単位が通常は /48 か /64 であることから、通常目にするサブネットマスクは /48 か /64 であり、あまり意識することはない。これより大きい単位(/32 や /16 など)のサブネットマスクは、IPv6のアドレス体系、ルーティングおよびISPに対する割り振りなどの議論の際に登場する。
Webブラウザのアドレスバーへの入力など、URLのホストパートをIPv6アドレスで指定するときは、例えば::1ならば[::1]
のように半角の角括弧でくくる。 (RFC 3986)
IPv6には、以下の3種類のアドレスがある。
さらに、パケットの到達範囲(スコープ)によって、上記のアドレスそれぞれに対しリンクローカルスコープとグローバルスコープのアドレスが存在する。
以前はサイトローカルスコープというものもあったが、ほとんど使われないまま廃止された。
IPv6ノードのネットワークインタフェースには、必ずリンクローカルアドレス(link‐local address)が付与される[31]。これは fe80:: というプレフィックスと、インタフェースIDとから生成されるのが通常であるが、そのリンク内で一意であれば手動で設定してもかまわない。
IPv6を利用していて通常目にするアドレスは、グローバルユニキャストアドレスかリンクローカルユニキャストアドレスである。IPv6のアドレス空間については、#IPv6アドレス空間参照。
長さ | 説明 |
---|---|
nビット | グローバルID(グローバル・ルーティング・プレフィックス) |
64-nビット | サブネットID |
64ビット | インターフェイスID |
アドレス | 説明 |
---|---|
2001::/32 | Teredo (RFC 4380) |
2001:2::/48 | BMWG (RFC 5180) ※ルータでは中継されない |
2001:10::/28 | ORCHID (RFC 4843) ※ルータでは中継されない |
2002::/16 | 6to4 (RFC 3056) ※Historical (RFC 7526) |
2001:db8::/32 | 文書作成用アドレス空間 (RFC 3849) ※ルータでは中継されない。マニュアルなどの文書中のみで利用するIPアドレス例示用で、実存のアドレスではない事が保証されている。なお、このアドレスを含むネットブロック2001:c00::/23はAPNICに割り当てられている。 |
長さ | 説明 |
---|---|
10ビット | プレフィックス (1111111010) |
54ビット | 0固定 |
64ビット | インターフェイスID |
長さ | 説明 |
---|---|
7ビット | プレフィックス (1111110) |
1ビット | L(1=局所的な割り当て、0は現在未定義) |
40ビット | グローバルID(乱数) |
16ビット | サブネットID |
64ビット | インターフェイスID |
アドレス | 割り当て | IPv4 の相当する割り当て | ||
---|---|---|---|---|
:: | (アドレス未定義を示す) | 0.0.0.0 | ||
::1 | ループバック | 127.0.0.0/8 | ||
::/96 | IPv4互換アドレス(廃止) | |||
::ffff:0:0/96 | IPv4射影アドレス | |||
64:ff9b::/96 | IPv6移行技術 (RFC 6052) | |||
64:ff9b:1::/48 | IPv6移行技術 (RFC 8215) | |||
100::/64 | Discard-Only Address Block (RFC 6666) | |||
2000::/3 | グローバルユニキャストアドレス | グローバルアドレス | ||
2001::/23 | Protocol Assignments (RFC 2928) | |||
2001::/32 | Teredo | |||
2001:1::1/128 | Port Control Protocol Anycast (RFC 7723) | |||
2001:1::2/128 | Traversal Using Relays | |||
2001:2::/48 | Benchmarking (RFC 5180) | |||
2001:3::/32 | Automatic Multicast Tunneling (RFC 7450) | |||
2001:4:112::/48 | AS112-v6 (RFC 7535) | |||
2001:5::/32 | EID Space for LISP (RFC 7954)[注 15] | |||
2001:10::/28 | ORCHID(廃止) | |||
2001:20::/28 | ORCHIDv2 (RFC 7343) | |||
2001:db8::/32 | 文書記述用アドレスプレフィックス | |||
2002::/16 | 6to4 ※Historical[36] | |||
2620:4f:8000::/48 | RFC 7534 | |||
3ffe::/16 | 6bone - IPv6 の実装実験用(廃止) | |||
fc00::/7 | ユニークローカルユニキャストアドレス | プライベートアドレス | ||
fc00::/8 | 集中管理 | |||
fd00::/8 | ローカル管理 | |||
fe80::/10 | リンクローカルユニキャストアドレス | 169.254.0.0/16 (APIPA) | ||
fec0::/10 | サイトローカルユニキャストアドレス(廃止) | プライベートアドレス | ||
ff00::/8 | マルチキャストアドレス | 224.0.0.0/4 | ||
ff01::/16 | ノードローカル | |||
ff01::1 | 全ノード | |||
ff01::2 | 全ルーター | |||
ff02::/16 | リンクローカル | |||
ff02::1 | 全ノード | |||
ff02::2 | 全ルーター | |||
ff02::4 | DVMRPルーター | |||
ff02::5 | OSPFIGP | |||
ff02::6 | OSPFIGP指定ルーター | |||
ff02::7 | STルーター | |||
ff02::8 | STホスト | |||
ff02::9 | RIPルーター | 224.0.0.9 (RIPv2) | ||
ff02::a | EIGRPルーター | |||
ff02::b | 移動エージェント | |||
ff02::c | SSDP | |||
ff02::d | 全PIMルーター | |||
ff02::e | RSVPカプセル化 | |||
ff02::1:1 | リンク名 | |||
ff02::1:2 | 全DHCPエージェント | |||
ff02::1:3 | LLMNR | 224.0.0.252 | ||
ff05::/16 | サイトローカル | |||
ff05::2 | 全ルーター | |||
ff05::1:3 | 全DHCPサーバー | |||
ff05::1:4 | 全DHCPリレー | |||
ff05::1:c | SSDP | 239.255.255.250 | ||
ff0e::/16 | グローバル | |||
ff0e::c | SSDP |
IPv6のヘッダはIPv4ではあまり使われなかったものが廃止されるなど簡略化されているが、アドレス長が長くなっているので、ヘッダ長はIPv4の20バイトから40バイトに増加している。
また、様々なオプションがエクステンションヘッダとして定義され、これは前のヘッダが次のヘッダのタイプを示すことで数珠つなぎにすることが可能となっている。 また使用する順番がほぼ固定されている。主に送信元や中継のルータが使用するオプションは前の方に、到着したルータやノードに対してのオプションは最後の方に定義される。
IPv6で定義されているエクステンションヘッダは次の通り。
IPv4 では通信相手の IPアドレス からその MACアドレスを取得するために ARP を用いていたが、IPv6 では近隣探索 (Neighbor Discovery) という方法が用いられる[39]。
これは、ICMP の IPv6 版である ICMPv6 の枠組み(NDP、Neighbor Discovery)を用いてアドレス解決する[39]。アドレス解決をしたいノードはペイロードに解決したいアドレスを格納して、マルチキャストアドレスに IPv4 の ARP request に相当する Neighbor Solicitation (NS) パケットを送信し、それに答えるべきノードは、Target linklayer address option に自ノードの MAC アドレスを格納した Neighbor Advertisement (NA) を送信してアドレス解決を行う。RFC 4861 で規定されている。
IPv6ではDHCPを用いなくてもルータさえあればアドレスの自動設定が可能となっている (RFC 4862)。これをステートレスアドレス自動設定 (Stateless Address Autoconfiguration、SLAAC)と言う。
ルータは自分の接続しているネットワークに対し、定期的にあるいは要請に基づいて、そのネットワークに関する情報を送信している[40]。これはルータ広告(Router advertisement; RA)と言い、近隣探索プロトコルの中で規定されている。ルータ広告に含まれるプレフィックス情報と一意のインタフェースIDを用いて、IPv6ホストはグローバルアドレスを生成する。同時に、そのIPv6ホストは受信したRAを送信したルータをデフォルト経路に設定することで、グローバルIPv6ネットワークへの接続性も確保できる。
しかし、この仕組みでは名前解決のためのDNSサーバのアドレスを取得することはできないため、それにはDHCPv6など別の仕組みが必要になる。
DHCPv6サーバから自動的にIPが割り当てられるものは、どのPCがどのIPアドレスかがDHCPサーバに記録されているので、ステートフルアドレス自動設定と呼ばれる。一方、この「ステートレスアドレス自動設定」はルータからIPが割り当てられるが、どのPCにどのIPが割り当てられたかをルータ自身は知らない。状況を知らないのでステートレスなのである。
概念的にはIPv4とIPv6はほぼ同等と言えるが、実際のパケットフォーマットは完全に異なる上、IPアドレス空間の大きさも違うため、1対1対応はできない。そのため、IPv6ノードとIPv4ノードが互いに直接通信することはできない[41]。そのため、IPv6とIPv4との通信用にいくつかの仕組み、プロトコルが提案されている。
また、IPv6/IPv4トランスレータと呼ばれる装置によって、プロトコル変換を行う方法がある[42]。例えば、Proxy方式では、OSI参照モデルで上位層であるアプリケーション層でプロトコル変換を行うことで、ネットワーク層であるIPプロトコルの違いを隠蔽している。これにより、利用者からみた場合、IPv4のプライベートアドレスが使用されているLAN内から、IPv4/IPv6に関係なくURLで、インターネット上のサイトにアクセスできるように見える。
IPv6のネイティブな接続を提供しているISPはまだ少ない。 そのため、IPv4パケット上にIPv6パケットをカプセル化して通すトンネリング技術を使い、既存のIPv4インフラを利用してIPv6を提供するISPもある。 トンネリングに用いられる技術には以下のようなものがある。
実際にIPv6ネットワークを新たに導入する場合は、既存のIPv4空間との通信と併存両立させるために、ISPとユーザー側の双方でIPv6対応設備機器の追加、更新が必要となる。なお、端末、サーバー、OS、アプリケーションなどの対応についてはIPv6への対応を参照。
エンドユーザ向けのルーターなどのCPEについては、既存のルーターが持っていることが多いIPv6ブリッジ機能[注 16]だけでは対応できない方式が多く、CPE機器の更新が必要になる場合も多い。
なお、IPv6とIPv4を共存させる方式として、以下のようなものがある。ただし、どの方式によるかは接続するプロバイダや通信環境などに依存する部分が多い。
NTT(東日本、西日本)のフレッツ網は、実運用されているIPv6のネットワークとしては2023年現在で約2363万 回線[43]を有する世界最大級のネットワークである。フレッツ網におけるIPv6の適用の詳細については、上記項目を参照。