代码之家  ›  专栏  ›  技术社区  ›  Simone Carletti

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

  •  1
  • Simone Carletti  · 技术社区  · 14 年前

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

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

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

    4 回复  |  直到 14 年前
        1
  •  2
  •   user247600    14 年前

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

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

        2
  •  0
  •   WheresAlice    14 年前

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

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

        3
  •  0
  •   David Mackintosh    14 年前
    1. 获取IP地址列表。
    2. 将IP地址转换为整数表示。
    3. 按整数表示对IP地址排序。
    4. 利润。
        4
  •  0
  •   Alnitak    14 年前

    你能解释一下吗 为什么 你需要分类吗?

    一般来说,包的每个部分内的DNS记录顺序是不相关的。也不能保证两个连续的查询将返回相同的可能记录子集。