Firefox の名前解決キャッシュの動作が不可解だったので色々調べてみました。
「ISPのDNSキャッシュサーバはTTLを越えてキャッシュを保持するか?」の実験で用いている a.t.e-ontap.com は 5分毎に A レコードが切り替わるようになっています。
この http://a.t.e-ontap.com/ を Firefox 28.0 でリロードしながら観察するとおかしなことに気づきます。まず普通にリロードを行っても DNS 権威サーバ側で A レコードが切り替わっているのに、まるで HTTP の接続先が切り替わりません。さらにパケットダンプしてみると、DNSキャッシュサーバへ問合せを送り新しい A レコードを得ているのに HTTP は古い接続先から切り替わらないのです。
ここで、さらに奇妙なことがわかりました。Shift を押しながらリロードすると新しい接続先に繋がるようになる (この場合でも1分以内のリロードは DNS 問合せを出さない) のですが、次に Shift を押さずリロードするとなんと新しい DNS 検索結果を無視して古い方へ接続しに行ってしまうのです。実にしぶといキャッシュです。
こんなことは以前は起きていなかったと思いつつ、実験を重ねつつ、ソースや Mozilla コミュニティの情報など色々あたって調べてみた結果、およその動作と問題点が以下のように判明しました。
Firefox のソースを見ると、nsDNSService2.cpp に以下のパラメータがあります。
uint32_t maxCacheEntries = 400; uint32_t maxCacheLifetime = 2; // minutes uint32_t lifetimeGracePeriod = 1;
このうち固定で2分となっている maxCacheLifetime に lifetimeGracePeriod が足されたものが DNS キャッシュ時間になっています。ソース上では lifetimeGracePeriod のデフォルト値は 1分であり、キャッシュ時間は 2+1 = 3 分 ということです。
しかし、about:config から変更可能なパラメータに以下のデフォルト値が入っています。
network.dnsCacheExpirationGracePeriod;2592000
これを60で割った 2592000/60 = 43200 分が lifetimeGracePeriod を上書きしているのです。
つまり、43200分(=30日) + 2 分 の間 Firefox はキャッシュを保持するのです。ソースまで確認していませんがリスタートしても保持しているように見えます。
途中、Shift リロードを繰り返そうが、DNS prefetch が新しい値を得ようが、このキャッシュは更新されません。この network.dnsCacheExpirationGracePeriod を about:config から変更するとその値に従うこともわかりました。
どう考えても network.dnsCacheExpirationGracePeriod = 2592000 は長過ぎます。Mozilla 関係サイトを調べまわってもこの値がなぜこうなったかは不明ですが、以前は 60 (1分) だったこの値が Firefox 18 (2013/01/08) 以降に今の値になったようです。性能競争の成れの果てかもしれませんが、バグと言っても良いのではないでしょうか。元通り 60 に変更したほうがよいと思います。さもないと「浸透おそい」というハメになるでしょう。浸透いうな!
愚痴ですが私はブラウザの専門家ではありません。もっと詳しい人にちゃんと調べて欲しかった/欲しいと思います。皆「浸透おそい」と言うばかりで、調べてみた/みる人はいないのですかね。
Copyright by T.Suzuki
ありがとう。やってみます。
「Firefox 29」ベータ版公開、ユーザーインターフェイス刷新 http://internet.watch.impress.co.jp/docs/news/20140324_640924.html
次期ESRとなる31α版では既定値が60となっているのを確認しました
ありがとうございます