用于在循环DNS配置中对响应进行排序的算法

时间:2010-01-10 18:03:54

标签: dns dig

我正在尝试实施排序算法,以确保我的DNS库始终使用有序的DNS记录列表,即使响应来自循环配置。

我们采取以下两种回应。

首先

$ 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

;; ...

第二

$ 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记录I've got it。 我需要找到一种有效的算法来对响应的答案部分进行排序。

另外,请记住,问题不仅限于A问题。原始DNS查询可能是NS查询,CNAME查询或任何您想要的。

我正在使用Ruby,但这与问题本身无关。

4 个答案:

答案 0 :(得分:2)

根据您使用的语言,根据类型/地址将所有答案放入带有叶子数组的哈希/字典中,可能会更简单。

如果你使用perl,我建议使用tie :: sorted :: array :: lazy。

答案 1 :(得分:0)

大多数编程语言都应该有一个库可以获取给定主机名的ip地址列表。它将类似于gethostbyname,它将返回一个IP地址数组,您可以像任何标准数组一样对其进行排序。在PHP中它是gethostbynamel,在Ruby中它是Socket :: gethostbyname。

没有必要自己完成获取DNS记录的过程,但如果您真的想要,则DNS规则非常简单。主机名将返回CNAME或A记录(假设我们只是处理IPv4); A记录将返回IP地址,如果您获得CNAME,则需要使用递归来获取CNAME结果的A记录。

答案 2 :(得分:0)

  1. 获取IP地址列表。
  2. 将IP地址转换为整数表示。
  3. 按整数表示法对IP地址进行排序。
  4. 利润。

答案 3 :(得分:0)

您能解释为什么需要对它们进行排序吗?

通常,数据包每个部分中的DNS记录顺序无关紧要。也不保证两个连续的查询将返回相同的可能记录子集。