「DNSの浸透」とアプリケーションのキャッシュ

   このエントリをはてなブックマークに登録    2011/10/27-3

さきほど「DNSの浸透」に関して書いたのですが、それに対して「でもTTLを無視するDNSキャッシュサーバがいるから仕方がない」というような反応が一定数登場しています。 「浸透」の話になると、そのような話がほぼ必ず登場するのですが、実際に「この製品がTTLを無視する」とか「このISPで運営されているDNSキャッシュサーバはDNSプロトコルに違反している」という具体例をいまのところ見た事がありません。 「そういう困ったDNSキャッシュサーバも居るんだよ」とか「でもTTLを越えたあとも旧IPアドレスにアクセスあるもん」という感じの主張が多いです。

そんなところにsumikawaさんから以下のようなTweetを頂きました。

確かに、DNSの世界におけるTTL情報はアプリケーションには届かないので、権威DNSサーバのTTLを事前に小さくしたとしても、アプリケーションが持っているキャッシュは制御ができません。

以下の図のように、TTL情報を得られる「壁」がDNSリゾルバとアプリケーションの間にあります。

アプリケーションの問題?

その後、このことに関して考えていたのですが、実は「TTLを無視するDNSキャッシュサーバがどこかにいる。しかもゴロゴロ居る」というのではなく「アプリケーションが保持するキャッシュが消えない」というのが「浸透問題」の本質なのかも知れないという考えが浮かびました(本当にそうであるかどうかは残念ながら知りません)。

もしかして、「浸透期間」と呼ばれていたのは、世界中でアプリケーションが終了したり、PCが再起動されることによってアプリケーションが保持するキャッシュが消えるのを待つ期間なのではないか?という考えです。

で、次にアプリケーションがTTLを越えてキャッシュを保持することがDNSプロトコル違反なのかを考えると、実は違反ではないと思います。 というのは、アプリケーションは名前解決された結果をアプリケーション内でキャッシュしているのであって、DNSプロトコルの世界の外でのキャッシュになります。

「TTLを無視する」という挙動をどの時点で行うとDNSプロトコル違反になるかを表にすると以下のような感じです。

DNSキャッシュサーバがTTLを無視 DNSプロトコル違反
DNSリゾルバがTTLを無視 DNSプロトコル違反
アプリケーションがTTLを無視 違反ではない。というかgethostbynameとかgetaddrinfoではTTLわからない

そもそも、gethostbynameで使うhostentや、getaddrinfoで使うaddrinfoにはTTL情報を示すフィールドがありません。 そうすると、普通のソケットプログラミングをしていると、DNSの世界でやり取りされているTTLに関する情報をアプリケーションは得られません。



struct  hostent {
  char    *h_name;   /* official name of host */
  char    **h_aliases;    /* alias list */
  inth_addrtype;/* host address type */
  inth_length;  /* length of address */
  char    **h_addr_list;  /* list of addresses from name server */
};

struct addrinfo {
  int ai_flags; /* input flags */
  int ai_family;/* protocol family for socket */
  int ai_socktype;   /* socket type */
  int ai_protocol;   /* protocol for socket */
  socklen_t ai_addrlen;   /* length of socket-address */
  struct sockaddr *ai_addr; /* socket-address for socket */
  char *ai_canonname;/* canonical name for service location */
  struct addrinfo *ai_next; /* pointer to next in list */
};


こんな感じのことを考えはじめているのですが、もし「このDNSキャッシュサーバはTTLを無視する」という情報をご存知の方がいらっしゃったら教えて頂ければと思います。

「TTL期間が過ぎても旧IPアドレスにアクセスがある」というのが、実はアプリケーションが保持するキャッシュであるというオチってありますかね?

追記

Chromeの"about:dns"を見るとわかりやすいというアドバイスを頂きました。 DNS prefetchしておきながら数時間後に、そのキャッシュを使うという事例もあるわけですね。。。

Operaもアプリケーション内でキャッシュを持っているということですかね。

   このエントリをはてなブックマークに登録