TCP Fallback
まずは以下の図を。

クライアントが行うべきこととしては、左部の I. -> II. -> III. -> IV. の流れ。 詳細については、丸文字の ①〜⑥ となる。
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 となり、完了。
Last updated