「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 による通信が行われる。

  1. クライアントは UDP にてクエリをサーバへ送信する。
  2. (512 バイトを超える場合) サーバは UDP にて、ヘッダ部の TC ビットを 1 にセットした回答をクライアントへ送信する。
  3. クライアントは、TCP にてサーバへ接続し、クエリを送信する。
  4. サーバは、回答をクライアントへ送信する。

したがって、iptables などでパケットをフィルタリングしている場合、UDP/TCP ともに 53 番ポートを通す必要がある。

EDNS0

BIND 8.3 以降、BIND 9 以降は EDNS0 (Extension Mechanisms for DNS version 0) に対応している。 これは、512 バイトより大きな UDP パケットを利用し、TCP 通信によるコストを減らすためのプロトコルである。

EDNS0 を用いるには、クライアントとサーバが両方とも EDNS0 に対応している必要がある。

  • クライアントが対応していない場合
    • 上述の通常の通信が行われる。
  • クライアント・サーバともに対応しており、1 パケットで応答できる場合
    1. クライアントが UDP にて、EDNS0 クエリをサーバに送信する。MTU を考慮した最大ペイロード長が情報として含まれる。
    2. サーバが UDP にて、EDNS0 レスポンスをクライアントに送信する。
  • クライアント・サーバともに対応しており、1 パケットで応答できない場合
    1. クライアントが UDP にて、ENDS0 クエリをサーバに送信する。
    2. サーバが UDP にて、TC ビットを 1 に設定した EDNS0 レスポンスをクライアントに送信する。
    3. クライアントが TCP にて、サーバに接続する。
    4. サーバが TCP にて、レスポンスを送信する。
  • クライアントは対応しているが、サーバが対応していない場合
    1. クライアントが UDP にて、EDNS0 クエリをサーバに送信する。
    2. サーバが UDP にて、FORMERR/SERVFAIL/NOTIMPL ビットいずれかを 1 に設定したレスポンスをクライアントに送信する。
    3. クライアントが UDP にて、通常のクエリをサーバに送信する。
    4. 以降、通常の動作と同様。

脚注

  1. UDP にてデータ分割が行われないことが保証される最大サイズ。 UDP にてデータが分割されると、TCP と違ってデータの順序が保証されていないため、問題が生じる。 ただし、近年の現実のネットワークでは、もっと大きなパケットでも分割せずに送信されるため、後述の EDNS0 が提案された。