ホスト名、それに対応するIPアドレス。それがどのようにホスト上にキャッシュされるのかについて見てみます。なお、ここではNETBIOS名に関しては言及しません。ホスト名限定の話です。
キャッシュする様子を見てみる
まずは単純にホストに対してpingを実行する、というケースに対し、このときの動きをキャッシュを含めてみてみましょう。
まず、キャッシュを確認してみます。コマンドは「ipconfig /displaydns」です。
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, “Courier New”, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } キャッシュ上にはlocalhostとローカルループバックの逆引きのレコードしか登録されていません。
ここで「ping www.google.com」を実行してみます。
さて、この状態でもう一度キャッシュを覗いてみます。
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, “Courier New”, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
www.google.comのレコードがキャッシュに追加されていることが確認できます。www.google.comというのはwww.l.google.comのCNAMEレコードであることが確認できますね。
ここで面白いのは「www.google.comはキャッシュに入っているけれどもwww.l.google.comの値はキャッシュに入っていない」ということです。
ためしに「ping www.l.google.com」を実行してみます。
その後、再度キャッシュを表示してみます。
すると、今度はwww.l.google.comのレコードのキャッシュも確認できましたね。このことから「対象がCNAMEレコードの場合関連するAレコードのキャッシュはローカルには保持しない」ということがわかります。
この記事はWindows XP SP3で動きを確認しながら書いているのですが、Windows 2000でも動きを確認したところWindows 2000の場合には関連するAレコードも一緒にキャッシュされていました。OSによっても動きが異なるようです。また、Windows 2000の場合には以下のような問題もあったようです。
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, “Courier New”, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
キャッシュの保持期間
キャッシュという観点からすると、一番重要なのはTime To Live(TTL)です。これはキャッシュが有効である時間を秒で表しています。一番上の例でいくとwww.google.comのCNAMEレコードの保持期間は確認時点で残り67秒だったわけです。この時間は誰がどのようにコントロールしているのでしょうか?
キャッシュの保持期間をコントロールしているのはDNSサーバーです。DNSサーバーの管理者がレコードのTTLを明示的に指定しています。
ただし、ここには注意点があって、DNSはその構造上DNSサーバーに保持、キャッシュされているレコードもあるし、そこからさらにクライアントにキャッシュされるレコードもあるし、さらにタイミングも様々なので、完全にはコントロールはできないものです。
IPアドレスの変更が予定されているときにすべきこと
色々な理由により、サーバーの移設があり、IPアドレスが変更されることはよくあります。その際にDNS上のレコードも変更になります。そのときに一番重要なのはこのキャッシュの仕組みを理解したうえできちんと準備しておくことです。具体的には作業後にスムーズに切り替えが行われるように事前にTTLを短くしておくことが重要です。
TTLが仮に24時間に設定してあったとすると、実際に世界中のDNSサーバーや、それを利用しているクライアントのキャッシュ含めてすべて切り替わるのには丸2日程度はかかってしまいます。
旧IPアドレスと新IPアドレスの両方で通信が可能にできるシステムならゆっくり切り替えても問題ありませんが、そうでないばあいには「しばらく繋がらないけど、そのうち繋がりますので我慢してください。」というような目も当てられない状態になってしまいますので、気をつけましょう。
キャッシュを強制的に消去するには?
クライアント上のキャッシュは「ipconfig /flushdns」コマンドで強制的に消去できます。OSの再起動をしないといけないと思っている人がいますが、OSの再起動はかなり時間がかかってしまいますので、再起動せずに実行することができることは再起動せずに済ませましょう。
キャッシュの変更はサーバー自体でも、クライアントでも、必要ですのでIPアドレス変更作業を行う際には忘れずに行いましょう。
※ちょっとうまくかけなかった・・・。書き直し予定・・・。