循环DNS配置中的响应排序算法

循环DNS配置中的响应排序算法,dns,dig,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.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

;; ...
为了提取合适的算法,我是否可以阅读任何类型的现有实现/参考


更新:对我原来的问题做了一些澄清。我不需要库来获取DNS记录。 我需要找到一种有效的算法来对响应的答案部分进行排序

此外,请记住,问题并不局限于一个问题。原始DNS查询可能是NS查询、CNAME查询或任何您想要的查询


我使用的是Ruby,但这与问题本身无关。

根据您使用的语言,将所有答案放入一个哈希/字典中,并根据类型/地址为leaf设置一个数组,可能会更简单


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

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

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

  • 获取IP地址列表
  • 将IP地址转换为整数表示形式
  • 按整数表示对IP地址进行排序
  • 利润
  • 你能解释一下为什么需要对它们进行分类吗


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

    ruby标记是否没有给出语言提示?这正是我所理解的规则。这似乎是最合理的解决方案。我需要对它们进行排序,因为排序列表在以后需要比较数千条记录时更有效。只需将它们写入数据库,并在需要比较时对它们进行排序。这正是我所做的。问题是另一个:是否有任何类型的参考来排序答案部分。正如我在问题中所解释的,我不能简单地按IP排序答案,因为根据原始查询,某些记录具有更高的优先级。这不起作用,因为正如我在回答中所解释的,存在一些例外。您不能简单地对响应中的所有记录进行排序,因为CNAME记录无法与a记录进行比较等等。我不需要库来获取DNS记录。我需要找出一个有效的算法来对响应进行排序。
    $ 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
    
    ;; ...
    
    $ 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
    
    ;; ...