要約

  • DNSのAレコードとAAAAレコードは接続先候補を示すが、そのクライアントから現在到達できることまでは証明しない。
  • RFC 6555はIPv6優先を有限の先行権に変え、RFC 8305は非同期名前解決、RFC 6724による並べ替え、プロトコル族の交互配置、時間差を置いた接続試行へと仕組みを精密化した。
  • 最初に確立した接続が選ばれるのは、その一回だけである。利用者には強い回復性を与える一方、負け続ける経路の故障を運用者から隠すことがある。

正しい住所が、通れる道を意味しなかった

RFC 1671 は1994年、すでにデュアルスタックの選択問題を記していた。DNSがIPv4とIPv6の両方を返しても、途中にIPv6を捨てる装置があるか、トンネルや接続が止まっているか、宛先サービスがその瞬間に応答するかは分からない。

順番に一つずつ試すプログラムでは、この不足が待ち時間になる。IPv6を先に選び、SYNの再送を待ち、ようやくIPv4へ移る。IPv4しか持たない端末はすぐにつながるのに、機能の多い端末ほど遅く感じられる。利用者がIPv6を無効にすれば症状は消える。移行の不具合が、移行を止める動機を生んでいた。

IPv6専用の別名を作れば、人が共有する一つの名前が二つに割れる。静的な許可表では、クライアントごと、時刻ごとに変わる障害を追えない。足りない事実は接続開始時に確かめるしかなかった。

優先は先行権であって独占権ではない

RFC 6555 は2012年、Happy Eyeballsを標準化した。IPv4とIPv6を無差別に同時発進させる規則ではない。ホストのアドレス選択方針は残り、通常はIPv6が先頭に立つ。しかし一定時間で接続できなければ、最初の試行を生かしたまま別のプロトコル族も走り出す。

方針は最初の機会を決める。実際の接続結果は今回の利用先を決める。この役割分担によって、長期的な移行目標と局所的な故障回避を同時に扱える。

競争には費用がある。余分な試行はサーバーの状態、ファイアウォール、NATのポート、回線を使う。そのため接続試行には間隔を設け、勝者が決まれば敗者を閉じる。単に最速だけを選び続ければ共有IPv4設備の負荷が残り、IPv6を絶対視すれば利用者が障害費用を負う。標準はその中間を時間で区切った。

過去の失敗を覚える場合にも期限がある。RFC 6555は、おおむね十分の間隔で優先側を試し直す考えを示し、新しいネットワークへ接続した時には学習状態を初期化するよう求める。ある空港の壊れたIPv6を、自宅の判断材料にしてはならない。

第二版はDNSの返答順も扱った

2017年の RFC 8305 は、実装と測定の蓄積を受けて初版を置き換えた。処理は、DNS問い合わせの非同期開始、宛先の並べ替え、接続試行の非同期開始、一つの接続確立と他の取り消し、という段階に分かれる。

AAAAとAはほぼ続けて問い合わせ、AAAAを先にする。Aの返答が先に来た時は、AAAAにわずかな猶予を与える。推奨される解決待ち時間は50ミリ秒である。IPv6の先行権を守りながら、遅いDNS応答が利用可能なIPv4を長く止めない。

得られた候補は RFC 6724 に従って並べる。利用可能な送信元、範囲、ラベル、端末の方針が順序に反映されるが、先頭は到達保証ではない。

次にプロトコル族を交互に配置する。IPv6が最初なら、最良のIPv4候補を通常は二番目へ上げる。IPv6アドレスが何個もある時、すべての失敗を順番に待ってから初めてIPv4を試す事態を避けるためである。

試行は一斉ではなく、間隔を置いて開始し、進行中の接続同士は重なる。RFC 8305は既定値として250ミリ秒を勧める。次の試行を10ミリ秒未満で開始してはならず、推奨最小値は100ミリ秒、推奨最大値は2秒である。これは観測から得た調整値で、永久の定数ではない。

過去の往復時間や以前使ったアドレスを順位に反映してもよい。ただし記憶を別のネットワークインターフェースへ持ち越さず、接続先ネットワークが変われば消す。最初の接続が確立した時点で、他の試行は取り消す。遅れて届いたDNS応答はキャッシュには役立っても、今回の勝敗は変えない。

接続確立は狭い証拠である

Happy Eyeballsが主に確かめるのは最初のトランスポート接続である。TLSの検証、HTTPの動作、あるいは大きなパケットの通過まで保証しない。RFC 8305は、経路MTUの問題がハンドシェイク後に現れ、選択段階では見えない場合を明記する。

勝ったIPアドレスが相手の身元を証明するわけでもない。DNSの結果は変わり、同じホスト名への次の接続が別のアドレスを使うこともある。身元確認は、その意味を知る上位の安全機構が担う。

そして自動回復は監視を弱める。IPv6が常に失敗しても、250ミリ秒後にIPv4が成功すれば利用者は気づきにくい。RFC 8305が各プロトコル族の外部監視を勧めるのは、接続成功とネットワーク修復が別物だからである。

情報源と限界

閉じた資料は RFC 1671、RFC 6555、RFC 6724、RFC 8305 である。現在の実装率、全ネットワークに最適な待ち時間、IPv4とIPv6の世界的な品質順位は示さない。