753
732

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

iOS9 以降で必要な IPv6 only Network への対応

Last updated at Posted at 2015-08-31

iOS (9.0 以降) では DNS64/NAT64 という技術で構築された IPv6 ベースのネットワークでアプリが動くようにする必要がある。

本記事は、末尾の参考文献に記載された内容の意訳をベースにしている。

概要

  • iPhone に対して IPv6 の通信環境しか提供しないキャリア(通信事業者)が今後登場する。
  • 既存の IPv4 のホストと通信しようとした場合、キャリアのゲートウェイで IPv6 ⇔ IPv4 の変換が行われる (DNS64/NAT64)。
  • (接続先がIPv4/v6のどちらであるかに関わらず) あなたのアプリが IPv6 環境で正しく動作するようにしなくてはならない。これは審査でチェックされる

影響範囲は

  • ネットワーク通信を実装したiOSアプリすべてで動作確認と、問題があれば改修を実施する必要がある。
  • (iOS外で動作する) サーバサイドについては原則として影響を受けない。

ネットワーク接続における変更点

今のところ iPhone は IPv4 と IPv6 の両方のプロトコルで接続されている。1

この場合、あなたがサービスを IPv4 で提供しているのであれば IPv4 のインタフェースで接続が確立される。

image
出典: WWDC15 - Your App and Next Generation Network

近い将来、iPhone の接続先を IPv6 に完全移行する計画がある。移行は各キャリアやAppleの方針で行われるため、日本での導入がいつになるかはわからないが、iOS9 がこの形態のネットワークをサポートし、将来の移行を計画していることは発表されている。

image
出典: WWDC15 - Your App and Next Generation Network

この形式に移行した場合、たとえサービスを IPv4 だけで提供している場合であっても、iPhone は IPv6 プロトコルでホストに接続しようとする。

キャリアのゲートウェイには DNS の IPv4 応答を IPv6 に変換する DNS64 と、IPv6 の接続要求を IPv4 に変換する NAT64 が設置されることにより、IPv4 のあなたのサーバに接続できるようになっているため、ネットワーク (L3) レベルでの対応は特にいらない。

image
出典: Supporting IPv6 DNS64/NAT64 Networks - DNS64/NAT64 Transitional Workflow

アプリへの影響

実は多くのアプリは、特に対策をしなくても NAT64 で問題なく動く。iOS が提供する高レベルの API のインタフェースは特に変わらないし、接続性についてもキャリア側が透過的に処理してくれるからだ。

image
出典: WWDC15 - Your App and Next Generation Network

しかし、以下のような実装があると、NAT64 (IPv6オンリー) に対応できなくなる。

image
出典: WWDC15 - Your App and Next Generation Network

  • IPv4 を前提とした変数/構造体 (uint32_t, in_addr, sockaddr_in)
  • IPv4 でしか使えない API (inet_aton, gethostbyname)
  • IPv4 でしか正しく動作しない API の呼出 (gethostbyname2(hostname, AF_INET))
  • IPv4に依存したネットワークの接続チェックプロセスが存在する場合
    • デバイスが IPv4 アドレスを持っているか
    • 0.0.0.0 に接続できるか

そのようなチェックを実装していると、NAT64 環境では「ネットワークに接続できない」旨のダイアログを出し、アプリの動作が止まってしまうだろう。

image
出典: WWDC15 - Your App and Next Generation Network

実際の対処方法

まず、NAT64 の環境を用意する。

macOS 10.112 以降では NAT64 の WiFi アクセスポイントを作成する機能がついている。

image
出典: WWDC15 - Your App and Next Generation Network

システム環境設定の "共有" ボタンを [option] キーを推しながらクリックし、続いて "インターネット共有" を有効にする際、NAT64 をオンにできる345

image
image
出典: WWDC15 - Your App and Next Generation Network

もしあなたのアプリが動かなくなった場合、以下の点に注意して実装を修正しよう。

image
出典: WWDC15 - Your App and Next Generation Network

  • アドレスファミリに依存しない実装
    • 接続確認を事前にするのではなく、接続の失敗をハンドリングするように
    • NSURLSessionCFNetwork レイヤーの API を使うようにする
  • RFC4038(IPv6移行期におけるアプリケーションの実装)を参考にする
  • サービス名で接続するAPIを使う

image
出典: WWDC15 - Your App and Next Generation Network

  • 高レイヤのフレームワークを使う
    • NSURLSessionCFNetwork レイヤーの API
  • クライアントは IPv4 のアドレスリテラルを使うようにする
    • OS では IPv6 アドレスと統合して扱われる

対応期限

image
出典: WWDC15 - Your App and Next Generation Network

今年の終盤 来年(2016年)初頭6 2016/6/17 から App Storeの審査でIPv6対応が要求されている。

参考文献

個人的な感想

  • 広告やアナリティクスなどのライブラリ、ゲームエンジンなど隠蔽されたAPIの内部実装によっても影響がでる話なので、もっと騒いだほうがいい。
  • IPv6しかり、ATSしかり「インターネット的にはやらないといけない8」「けど商業的なメリットがデベロッパーに見えない」修正をプラットフォームでごり押しするというのは、個人的にはよい気がする。無理矢理にでも誰かが音頭をとらないと、こういうのは話が進まない。

脚注

  1. 通信事業者(APN)によってはIPv4のみ提供している。日本のキャリアでは大多数(spモード,LTE NET,S!ベーシックパック)のAPNはIPv4のみを提供していて、IPv6を利用できるのは mopera U, LTE NET for DATA, IIJmio など一部に限られている。

  2. 執筆時点ではリリースされていないので、Apple Developer Program で入手するか、Public Beta版を用意する必要がある。 現在は Mac App Store より無償でアップグレードできる (El Capitan または Sierra)。

  3. Macをルータとしてテザリングさせているような構成になる。iPhoneを接続させるネットワーク(LAN側)でWiFiを用いるので、WAN側として有線LANやBluetooth PANなどを用意する必要がある。

  4. WAN側はIPv4だけでよい(ふつうのプロバイダで大丈夫)。

  5. システム環境設定を開き、 option ボタンを押しながら "共有" → "インターネット共有" と進むことで、 NAT64 のオプションが表示される。

  6. 対応期限が今年の終盤から2016年初頭に延期された。

  7. 2016年6月1日から審査時にIPv6のテストが行われるとアナウンスされた。

  8. IPv4 でインターネットを利用し続けることについて、現状では目立った問題が起きてはいないが、IPアドレスを複数人で共有するための装置(キャリアグレードNAT)の負荷からパフォーマンスへの影響も発生している。

753
732
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
753
732

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?