DNS
HTTP のリクエストも実際は、サーバとの TCP 接続の確立が必要になる。
そのためには、ホストを DNS で名前解決しないといけない。
この DNS もチューニングが進んでいくと気になる存在になる。
特にクライアントが DNS を設定している場合は、それ自体を速くするみたいなことはしにくい。みんなが 8.8.8.8 にしているとも限らないし、Web アプリというレイヤで見ると手を入れにくい部分だった。
DNS Prefetch
最近のブラウザは、例えばページにリンクが埋め込まれていれば、そのリンクのドメインを先に解決しておいてくれる。つまり、リンクをクリックした時点では、すでに名前解決が行われている状態にできる訳だ。
ドメインの解決は、パケットが飛ぶ訳だけどそのペイロードは Web の中で言えば結構小さい部類だし、結果は TTL の間はキャッシュされるのですぐ次のページで使われなかったとしても、そこまでデメリットにはならない。
これはデフォルトで行われているので、その恩恵に授かるわけだけど、一応 opt-out もできる。
クライアント側からすればブラウザのオプションなどでオフにする。
コンテンツ側からなら、ヘッダに x-dns-prefetch-control
を送る。
もしくは、 meta タグに書く。
<meta http-equiv="x-dns-prefetch-control" content="off">
ちなみにデフォルトでは HTTPS のページでは DNS-Prefetch されない。
DNS Prefetch Control
しかし、これはページに埋め込まれたものに対してしか行われない。
例えばログイン画面の次はメインページに遷移することが多いだろう。
そこでログイン画面にいる間に、ログイン画面では使わないがメインページで使うコンテンツのドメインなどを先に解決しておけると、次のページでのコンテンツ取得にも活かせる。
よく使う CDN などのドメインを投機的に解決しておくには、Link タグの API を使う。
Firefox と Chrome は少なくとも対応している模様。
<link rel="dns-prefetch" href="http://example.com/">
DNS の解決が遅いことがボトルネックになるレベルまでチューニングできているなら、考えてみると良いと思う。
link
see also
- prebrowsing