🔀

Happy Eyeballs Version 3

#tech#network

2024-3-9

IPv4とIPv6のデュアルスタック環境においては,どちらを通信に使用すればより良い結果を得られるのかは自明ではない.こういった場合にどのような通信を採用するかを決定する仕組みとして,Happy Eyeballsと呼ばれるものがある.これには現在のところ,Happy Eyeballs Version 2というものが用いられているが,このVersion 3が提案されている.

Happy Eyeballs Version 2

現状では,Happy EyeballsにおいてはVersion 2が使用されており,これはAAAAレコードとAレコードの名前解決を行い,より早くコネクションを確立できた方を採用するものになっている.

一方,Happy Eyeballs Version 3ではこれらに加えてDNSのHTTPレコードも考慮対象として採用する接続を決定するものになっている.

v3の処理フロー

大別すると次のようになっている.

  1. 非同期DNSクエリの開始
  2. 名前解決に成功した宛て先アドレスのソート
  3. 非同期接続試行開始
  4. コネクションを確立できた接続以外を全てキャンセル

これらについて順に述べる.

非同期DNSクエリの開始

まず,次の順番でレコードを送信する.

  • HTTPS
  • AAAA
  • A

いずれかのDNSレスポンスを受け取った場合,"HTTPSとAAAAの両方についてレスポンスを受け取る"か"ipv6hintを保持するようなHTTPSのレスポンスを受け取る"まで待機する.

名前解決に成功した宛て先アドレスのソート

draftにおいては,次のステップにおいて接続を試行する順番として,HTTPレコードから得られるECHやQUICのサポート情報を優先してソートされるべきという風になっている.これに従って,次のステップで試行を開始する順番を決定する.

非同期接続試行の開始

前ステップで作成されたリストの順番に従って,接続を試行する.この際,コネクションが確立できたというのは,ハンドシェイクの完了によって判断される.

コネクションを確立できた接続以外を全てキャンセル

前ステップで最も早くコネクションが確立できたような接続を採用し,他の接続については全てキャンセルする.以降は採用された接続を用いて通信を行う.