DNS「いつからUDPしか使わないと錯覚していた?」
BINDでいろいろ遊んでたら、DNSで通常のUDPではなくTCPを使うこともあるということがわかったので書いておきます
通信のキャプチャファイルは以下のような感じ↓
環境
まずDNS応答のサイズを大きくするために、架空のゾーン(.kmb)からサブドメイン(sonya.kmb)を委任しそのサブドメインのネームサーバ(ns0.sonya.kmb,ns1.sonya.kmb ...)がたくさんあるという設定の環境をつくりました。そして.kmbのネームサーバに長い架空のドメイン名(すごく長い.sonya.kmb)をdigで問い合わせたのが上のキャプチャです。つまり回答のauthority sectionとadditional sectionにsonya.kmbのネームサーバがたくさん並びDNS応答のサイズが大きくなるという仕組みです。
キャプチャの説明
上のキャプチャのまず①を見ると、②でもわかるようにUDPでDNSの通信をしています。ここまでは普通のDNS通信と一切変わらなく見えます。その後なぜか問い合わせる側(10.0.4.4)がおもむろに3way handshakeを始めます(③)その後④でTCPでDNS応答がなされています。(mtuを小さくしていたのでフラグメントされている)
一瞬なんでいきなり3way handshakeはじめたんだ??と思いましたが、冷静に考えるとその直前のDNS応答に「UDPムリだからTCPにして!」という情報が含まれているはずなので、探したらありました。
DNSヘッダーのTruncatedが1になってる!
ここまでやってから、いろいろとググってみましたがどうやらDNSメッセージが512オクテットを超えるとUDPではなくTCPが使われるそうです。(参考:http://www.7key.jp/nw/technology/protocol/resolver.html)
終わりに
教科書とかを読んでて「へー」って思ってそれを試してみることはよくあるけど、それとは反対に別なことやってて「ん?」ってなって自分でいろいろ試してから調べて「へー」ってなるのはなかなかない気がするので楽しかったです。