Open1
curlでHTTPS RRを使って初回からHTTP/3接続させる
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の結果を保存しておけばブラウザに近い挙動になる。