在单个DNS查询中请求A和AAAA记录

R..*_*R.. 27 c sockets dns networking network-protocols

我正在研究C中的DNS查询实现,并且有兴趣在单个查询数据包中请求A和AAAA(IPv4和IPv6)记录,但是当我将两个查询放在一起时,我没有从名称服务器获得任何响应像这样的一个数据包.我已经尝试将查询发送到几个不同的名称服务器(本地和8.8.8.8)没有运气.这是不起作用的,还是我的查询包可能格式错误?

我将AAAA查询附加到现有A请求数据包的基本算法是增加数据包头中的QDCOUNT字段,然后将TYPE设置为AAAA和NAME的RR查询作为指向现有A查询中主机名的指针追加(字节0xC0 0x0C表示从数据包开头起12字节的偏移量).这听起来不错吗?

仅供参考,一切都可以正常使用数据包中的A查询.

编辑:显然我的查询都有点格式错误(我不知道与答案不同的查询没有TTL和RDLENGTH/RDATA字段).修复此问题后,我将收到RCODE = 1格式错误回复,确认存在2个查询.这是否意味着不支持每个数据包的多个查询?

编辑2:这是一个查找的hexdump www.google.com:

d8 32 01 00 00 02 00 00 00 00 00 00 03 77 77 77 06 67 6f 6f 67 6c 65 03 63 6f 6d 00 00 01 00 01 c0 0c 00 1c 00 01

我没有看到它有什么问题.

Sim*_*onJ 34

我不知道在单个查询中支持多个问题的任何名称服务器.

这种查询可能存在歧义,因为每个数据包标志(例如AA)只能应用于其中一个问题.如果您提出两个问题并且服务器只对其中一个域具有权威性,那么服务器是否应该设置标志?我怀疑这些问题阻碍了实施者.

已经提出了许多建议来解决你所谈论的问题(比如这个提出了一个结合A和AAAA的QTYPE,以及Paul Vixie 一再 尝试引入EDNS形式的多个问题的提议),但是目前的程序支持IPv4和6往往执行两个单独的查询,AAAA跟随(超时后)或两者同时执行.

我想还有"全部"QTYPE,但它可以返回比你需要的更多的数据.

编辑:来自BIND源中的query.c:

   dns_message_currentname(message, DNS_SECTION_QUESTION,
         &client->query.qname);
   client->query.origqname = client->query.qname;
   result = dns_message_nextname(message, DNS_SECTION_QUESTION);
   if (result != ISC_R_NOMORE) {
     if (result == ISC_R_SUCCESS) {
       /*
        * There's more than one QNAME in the question
        * section.
        */
       query_error(client, DNS_R_FORMERR, __LINE__);
     } else
       query_error(client, result, __LINE__);
     return;
   }
Run Code Online (Sandbox Code Playgroud)

编辑:同样,来自BIND源中的resolver.c:

    /*
     * XXXRTH  Currently we support only one question.
     */
    if (message->counts[DNS_SECTION_QUESTION] != 1) {
            log_formerr(fctx, "too many questions");
            return (DNS_R_FORMERR);
    }
Run Code Online (Sandbox Code Playgroud)

  • @Nick另一个问题是`ANY`是当存根解析器向递归服务器发送一个`ANY`查询时,服务器只需要响应其当时缓存中的内容(尽管如果有的话,它会向上游发送查询)缓存中没有任何内容).如果`A`在缓存中,但`AAAA'不在缓存中,则只能得到`A`. (2认同)

Aln*_*tak 14

虽然数据包格式在技术上支持在问题部分中有多个记录(参见RFC 1035的 §4.1.2 ),但实际上它并不起作用,正如您所发现的那样.

特别是没有人设法定义正确的语义,如果这两个问题导致两个不同的RCODE,该怎么做.

试图在IETF定义那些语义,但到目前为止还没有达到目标.

在我自己的DNS数据包解析代码中,我总是拒绝任何此类数据包.