1

ラウンドロビン構成からの応答であっても、DNSライブラリが常にDNSレコードの順序付きリストで機能するように、並べ替えアルゴリズムを実装しようとしています。

次の2つの応答を見てみましょう。

初め。

$ dig google.com A

; <<>> DiG 9.6.0-APPLE-P2 <<>> google.com A
;; ...

;; ANSWER SECTION:
google.com.  201 IN A 74.125.39.106
google.com.  201 IN A 74.125.39.105
google.com.  201 IN A 74.125.39.147
google.com.  201 IN A 74.125.39.104
google.com.  201 IN A 74.125.39.103
google.com.  201 IN A 74.125.39.99

;; ...

2番。

$ dig google.com A

; <<>> DiG 9.6.0-APPLE-P2 <<>> google.com A
;; ...

;; ANSWER SECTION:
google.com.  119 IN A 74.125.39.147
google.com.  119 IN A 74.125.39.104
google.com.  119 IN A 74.125.39.103
google.com.  119 IN A 74.125.39.99
google.com.  119 IN A 74.125.39.106
google.com.  119 IN A 74.125.39.105

;; ...

ANSWERセクションに異なる順序でDNSレコードが含まれているという事実を除いて、これらは同じです。回答セクションを正規化するために並べ替えアルゴリズムを適用する必要があります。

アルゴリズムの初期バージョンはすでに理解していますが、テストを追加すればするほど、発見されたケースが見つかります。たとえば、次の応答では、最初のレコードの順序を変更しないでおく必要があります。

$ dig www.google.com A

; <<>> DiG 9.6.0-APPLE-P2 <<>> www.google.com A
;; ...

;; ANSWER SECTION:
www.google.com.  603039 IN CNAME www.l.google.com.
www.l.google.com. 78 IN A 74.125.39.105
www.l.google.com. 78 IN A 74.125.39.104
www.l.google.com. 78 IN A 74.125.39.147
www.l.google.com. 78 IN A 74.125.39.106
www.l.google.com. 78 IN A 74.125.39.99
www.l.google.com. 78 IN A 74.125.39.103

;; ...

適切なアルゴリズムを抽出するために読み取ることができる既存の実装/リファレンスはありますか?

更新:私の元の質問に対するいくつかの説明。DNSレコードを取得するためにライブラリは必要ありません、私はそれを持っています。応答の回答セクションを並べ替える効率的なアルゴリズムを見つける必要があります。

また、質問はAの質問に限定されないことに注意してください。元のDNSクエリは、NSクエリ、CNAMEクエリ、または任意のものである可能性があります。

私はRubyを使用していますが、これは質問自体には関係ありません。

4

4 に答える 4

2

使用している言語によっては、タイプ/アドレスに応じたリーフの配列を使用して、すべての回答をハッシュ/辞書に入れる方がおそらく簡単です。

perlを使用する場合は、tie :: sorted :: array::lazyをお勧めします。

于 2010-01-10T19:34:03.767 に答える
0

なぜ並べ替える必要があるのか​​説明していただけますか?

通常、パケットの各セクション内のDNSレコードの順序は関係ありません。また、2つの連続するクエリが可能なレコードの同じサブセットを返すことも保証されていません。

于 2010-01-11T10:48:05.047 に答える
0

特定のホスト名のIPアドレスのリストを取得するために、ほとんどのプログラミング言語で使用できるライブラリが必要です。これはgethostbynameのようなものになり、標準の配列と同じように並べ替えることができるIPアドレスの配列を返します。PHPではgethostbynamel、RubyではSocket::gethostbynameです。

DNSレコードを自分で取得するプロセスを実行する必要はありませんが、本当に必要な場合は、DNSルールは非常に単純です。ホスト名はCNAMEまたはAレコードのいずれかを返します(IPv4を扱っていると仮定します)。AレコードはIPアドレスを返します。CNAMEを取得する場合は、再帰を使用してCNAME結果のAレコードを取得する必要があります。

于 2010-01-10T23:31:10.357 に答える
0
  1. IPアドレスのリストを取得します。
  2. IPアドレスを整数表現に変換します。
  3. IPアドレスを整数表現で並べ替えます。
  4. 利益。
于 2010-01-10T23:52:05.727 に答える