digの応答に Warning: ID mismatch: expected ID 12345, got 9876

こんな応答見たことありますか?

;; Warning: ID mismatch: expected ID 12345, got 9876
;; Warning: ID mismatch: expected ID 12345, got 8765
;; Warning: ID mismatch: expected ID 12345, got 7654

日本語の情報は検索で出てこないっぽいので、第一号になりたい。
こういう応答が返ってくるのは以下のシナリオによる。
はじめに、とりあえず名前解決を試みてみる。

$ dig www.example.jp. a

; <<>> DiG 9.2.4 <<>> www.example.jp. a
;; global options:  printcmd
;; connection timed out; no servers could be reached

問い合わせる相手がいっぺぇいっぺぇになっていると、応答がタイムアウトしてしまうことがある。ここで、"no servers could be reached=どのサーバにも届かなかったよ"という内容が表示されるのがミソ。(後述するがこれは正確な記述でない)
さてさて、もっかい聞いてみようかな、と次のように叩いてみると

$ dig www.example.jp. a

;; Warning: ID mismatch: expected ID 12345, got 9876
;; Warning: ID mismatch: expected ID 12345, got 8765
;; Warning: ID mismatch: expected ID 12345, got 7654

冒頭のような応答が返ってくることがある。何だこれは。

一回目の問い合わせではタイムアウトになって、digコマンドは終了してしまった。こちら側のdigコマンドは終わってしまったけど、相手のサーバは仕事を終わってないつもりになっていることがある。つまり、ステートレスプロトコルであるDNS(UDPだからね)では、相手が諦めたかどうかを判断することは出来ず、こちらの想定をはるかに遅れて応答が返ってくる場合があるということ。

二度目のdigコマンドによる問い合わせ最中になってやっと一度目の応答が返ってきたために、応答時にくっつけたIDと違う変な応答を受信して、こんなエラーメッセージが出るのでした。

そういうわけで、"no servers could be reached"は正しい記述ではない。

しっかしまーDNSサーバって大変ですよ。特にリゾルバに指定されてるDNSキャッシュサーバ。応答が悪かったり設定が悪かったり、とにかく自分とこじゃない相手の不備や不足で迷惑を被るもんね。今はSPAMのせいでメールのほうが"何とかしなきゃ"感があるけど、そのうちDNSもそういう感じになっていく気がする。特にISPのリゾルバ用サーバをメンテしてるみなさん、お疲れさん。