1

我正在尝试实现一种排序算法,以确保我的 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 记录,我有。我需要找到一种有效的算法来对响应的答案部分进行排序。

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

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

4

4 回答 4

2

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

如果你使用 perl,我会推荐 tie::sorted::array::lazy。

于 2010-01-10T19:34:03.767 回答
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 回答
0

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

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

于 2010-01-11T10:48:05.047 回答