iOSのIPv4/v6 DNSの挙動

iOS9からIPv6対応との事で、こんな事が起きるようで。

Apple、iOS 9とOS X 10.11 El Capitan BetaでIPv6を優先し使用するよう「Happy Eyeballs」のアルゴリズムを変更。
IPv4接続で遅延が発生?!

これが本当なのか実験してみた。環境は以下の通り。

closedなLAN宅内環境で、IPv6にはAU光で実際に利用できるGlobal IPv6が/64で降ってきてそれを利用する。Raspberry Pi2にはbind9とiPhoneからアクセス用のNginXを立てて、IPv4/IPv6の名前解決はワイルドカードで行っておく。そして適当に作ったiPhone用のアプリからNginXのサーバにアクセスする際の名前は…

# IPv4はサフィックスにipv4と入れる
10001.ipv4.test.niisato.net
10002.ipv4.test.niisato.net
10003.ipv4.test.niisato.net

# IPv6はサフィックスにipv6と入れる
60001.ipv6.test.niisato.net
60002.ipv6.test.niisato.net
60003.ipv6.test.niisato.net

といった感じでプレフィックスを適当な数字でインクリメントする事で、都度DNSにアクセスを行うようにして、IPv4/v6のアクセスで常に名前解決を行いNginXにアクセスするように出来る。こうする事で、[DNSへの問い合わせ->HTTPアクセス]のループを1000回シーケンシャルにかまして両者の違いが分かるはず…だった。

だった…というのは、実際に試すそれ以前にRaspberry Pi上でDNSのパケットをキャプチャしたらもうそれ以前の問題だった。以下はIPv4へのアクセス時で、tcpdumpの結果をWireSharkで見たもの。

そう…25msの誤差もへったくれもなく、AAAA(IPv6)レコードを常に有線して名前解決が走る。そもそもね…AAAA(IPv6)優先で名前解決をしている以上、25ms分IPv4へのアクセスを遅くするもヘッタクレもなくIPv6があればそっちが早くなるというのは当然の帰結というわけですな。closedなLAN環境だとあれだけど、ベストエフォートなインターネット環境だったら、ネットワーク時間も影響してIPv6の方が早くなるのも理解できる。

ちなみにこれはIPv6の場合、

まだIPv4/v6と名前解決のリクエストは関係ないから、当然こっちでもAAAAが優先して問い合わせが行われる。ぶっちゃけ、これで大きな時間的な差が生まれるとは考えにくい。というのは、こんなオモシロユニークな名前解決を連発するという事は通常は殆どない&キャッシュされるのと、最初の問い合わせで25msの遅延が挿入されると言っても…分からんべ(w)とは思うし。さらに国内のiPhoneでIPv6使ってるぜヒャッハーな人とかって…一般ユースだと無いもん(キャリア対応してないし)。ただ、AAAAが優先されて一発送られているというのは気に止めておいた方が良いと思われ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください