TCP フォールバック
TCP フォールバック時の動作
まずは以下の図を。

クライアントが行うべきこととしては、左部の I. -> II. -> III. -> IV. の流れ。
詳細については、丸文字の 1. ~ 6. となる。
1. Initiation by UDP
クライアントがリゾルバにクエリを投げる。
2. Recursive Queries
リゾルバは名前解決を行う。
このとき、応答が UDP データグラムのサイズを超えると、フラグメントされて処理される。
ここでは TCP に切り替えない。 ( unbound-1.8.1 で検証したのでほかは分からないが…)
3. Answer with TC bit
リゾルバはクライアントに応答を返す。
TC, RD, RA bit が立ち、 Answer Section や Authority Section に値は入らない。
(これは実装依存かも。1.1.1.1 は値を入れてくるし、8.8.8.8 は入れてこないように見える。)
TC bit がにより、クライアントに対して TCP が必要な旨を伝える。
4. 3 way handshake
クライアントからリゾルバに TCP 3 way handshake が initiate される。
5. TCP Retry
クライアントは 1. と同じクエリを TCP で投げる。
このときの Transaction ID は、 1. のものとは異なる。
(矢印は書いてないが、クエリに対する ACK をリゾルバは返す)
リゾルバは、キャッシュでデータを持ってるのでそのデータを返す。
6. TCP FIN
クライアントから FIN を initiate する。
TCP が close となり、完了。
