「BIND」の版間の差分
提供: Wikinote
(→動作・仕様) |
(→EDNS0) |
||
行18: | 行18: | ||
==== EDNS0 ==== | ==== EDNS0 ==== | ||
BIND 8.3 以降、BIND 9 以降は [http://www.nic.ad.jp/ja/translation/rfc/2671.html EDNS0] (Extension Mechanisms for DNS version 0) に対応している。 | BIND 8.3 以降、BIND 9 以降は [http://www.nic.ad.jp/ja/translation/rfc/2671.html EDNS0] (Extension Mechanisms for DNS version 0) に対応している。 | ||
+ | これは、512 バイトより大きな UDP パケットを利用し、TCP 通信によるコストを減らすためのプロトコルである。 | ||
+ | |||
+ | EDNS0 を用いるには、クライアントとサーバが両方とも EDNS0 に対応している必要がある。 | ||
+ | |||
+ | * クライアントが対応していない場合 | ||
+ | ** 上述の通常の通信が行われる。 | ||
+ | * クライアント・サーバともに対応しており、1 パケットで応答できる場合 | ||
+ | *# クライアントが UDP にて、EDNS0 クエリをサーバに送信する。MTU を考慮した最大ペイロード長が情報として含まれる。 | ||
+ | *# サーバが UDP にて、EDNS0 レスポンスをクライアントに送信する。 | ||
+ | * クライアント・サーバともに対応しており、1 パケットで応答できない場合 | ||
+ | *# クライアントが UDP にて、ENDS0 クエリをサーバに送信する。 | ||
+ | *# サーバが UDP にて、TC ビットを 1 に設定した EDNS0 レスポンスをクライアントに送信する。 | ||
+ | *# クライアントが TCP にて、サーバに接続する。 | ||
+ | *# サーバが TCP にて、レスポンスを送信する。 | ||
+ | * クライアントは対応しているが、サーバが対応していない場合 | ||
+ | *# クライアントが UDP にて、EDNS0 クエリをサーバに送信する。 | ||
+ | *# サーバが UDP にて、FORMERR/SERVFAIL/NOTIMPL ビットいずれかを 1 に設定したレスポンスをクライアントに送信する。 | ||
+ | *# クライアントが UDP にて、通常のクエリをサーバに送信する。 | ||
+ | *# 以降、通常の動作と同様。 | ||
== 脚注 == | == 脚注 == | ||
<references /> | <references /> |
2009年5月10日 (日) 15:52時点における版
動作・仕様
UDP と TCP
DNS の通信には、通常 UDP が用いられる。 ただし、UDP パケットが 512 バイト [1] を超えるような通信 (応答) が必要となった場合、TCP による通信が行われる。
- クライアントは UDP にてクエリをサーバへ送信する。
- (512 バイトを超える場合) サーバは UDP にて、ヘッダ部の TC ビットを 1 にセットした回答をクライアントへ送信する。
- クライアントは、TCP にてサーバへ接続し、クエリを送信する。
- サーバは、回答をクライアントへ送信する。
したがって、iptables などでパケットをフィルタリングしている場合、UDP/TCP ともに 53 番ポートを通す必要がある。
EDNS0
BIND 8.3 以降、BIND 9 以降は EDNS0 (Extension Mechanisms for DNS version 0) に対応している。 これは、512 バイトより大きな UDP パケットを利用し、TCP 通信によるコストを減らすためのプロトコルである。
EDNS0 を用いるには、クライアントとサーバが両方とも EDNS0 に対応している必要がある。
- クライアントが対応していない場合
- 上述の通常の通信が行われる。
- クライアント・サーバともに対応しており、1 パケットで応答できる場合
- クライアントが UDP にて、EDNS0 クエリをサーバに送信する。MTU を考慮した最大ペイロード長が情報として含まれる。
- サーバが UDP にて、EDNS0 レスポンスをクライアントに送信する。
- クライアント・サーバともに対応しており、1 パケットで応答できない場合
- クライアントが UDP にて、ENDS0 クエリをサーバに送信する。
- サーバが UDP にて、TC ビットを 1 に設定した EDNS0 レスポンスをクライアントに送信する。
- クライアントが TCP にて、サーバに接続する。
- サーバが TCP にて、レスポンスを送信する。
- クライアントは対応しているが、サーバが対応していない場合
- クライアントが UDP にて、EDNS0 クエリをサーバに送信する。
- サーバが UDP にて、FORMERR/SERVFAIL/NOTIMPL ビットいずれかを 1 に設定したレスポンスをクライアントに送信する。
- クライアントが UDP にて、通常のクエリをサーバに送信する。
- 以降、通常の動作と同様。
脚注
- ↑ UDP にてデータ分割が行われないことが保証される最大サイズ。 UDP にてデータが分割されると、TCP と違ってデータの順序が保証されていないため、問題が生じる。 ただし、近年の現実のネットワークでは、もっと大きなパケットでも分割せずに送信されるため、後述の EDNS0 が提案された。