Open1

curlでHTTPS RRを使って初回からHTTP/3接続させる

catatsuycatatsuy

curlのコンパイルオプションに以下のオプションを追加する。

--enable-httpsrr --enable-ares --enable-threaded-resolver

今だと以下の挙動になるので注意。

  • A/AAAAレコードの他にHTTPSレコードを必ず確認する(無効にする方法はない)
  • 複数のレコードの確認をc-aresという仕組みで同時に行い、早く解決が終わった値を利用する
    • 特にHTTPSレコードだとgetaddrinfo関数が利用できないのでOSの仕組みにうまく乗れない

これでHTTPSレコードを見てHTTP/3を優先的に使ってくれる…と言いたいが、そううまくは動かない。

初回はDNSキャッシュがないため、A/AAAAレコードとHTTPSレコードの解決コストは変わらない。そのためHTTPSレコードが読まれて、HTTP/3を使えることが多い。2回目以降はgetaddrinfo関数を使うA/AAAAレコードの方はOS側のDNSキャッシュの仕組みを使って一瞬で返せるが、HTTPSレコードの方はDNSキャッシュの仕組みをうまく使えないのでボトルネックがある。

なので例えばmacなら以下のコマンドでローカルキャッシュを削除すればうまく動くが、キャッシュを削除しないとHTTP/2が先に使われる。

$ sudo killall -HUP mDNSResponder

ブラウザだとHTTP/3を利用可能なドメインを記憶しておくのと、DNSのキャッシュもブラウザ側で持っているので問題ない。curlなら--alt-svcオプションでAlt-Svcの結果を保存しておけばブラウザに近い挙動になる。