gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:23:44 25 4
gpt4 key购买 nike

我正在使用 C 实现 DNS 查询,并且有兴趣在单个查询数据包中同时请求 A 和 AAAA(IPv4 和 IPv6)记录,但是当我将这两个记录放在一起时,我没有从名称服务器获得任何响应像这样在一个数据包中一起查询。我试过将查询发送到几个不同的名称服务器(本地和 8.8.8.8),但没有成功。这是不起作用的东西,还是我的查询数据包格式不正确?

我附加 AAAA 查询(到现有 A 请求数据包)的基本算法是增加数据包 header 中的 QDCOUNT 字段,然后附加一个 RR 查询,其中 TYPE 设置为 AAAA,NAME 作为指向主机名的指针现有 A 查询(字节 0xC0 0x0C 为距数据包开头的 12 个字节的偏移量)。这听起来正确吗?

仅供引用,数据包中的 A 查询一切正常。

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

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

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

我看不出有什么问题。

最佳答案

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

在这样的查询中可能存在歧义,因为每个数据包的标志(例如 AA)可能仅适用于其中一个问题。如果您问两个问题,而服务器只对其中一个域具有权威性,那么服务器是否应该设置标志?我怀疑诸如此类的问题让实现者望而却步。

已经有许多提案来解决您正在谈论的问题(例如 this 提议引入结合 A 和 AAAA 的 QTYPE,以及 Paul Vixie 的 repeated attempts 引入 EDNS 形式多个问题),但目前支持 IPv4 和 6 的程序倾向于执行两个单独的查询,或者 AAAA 后跟(超时后)A,或者两者同时执行。

我想还有“全部”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;
}

编辑:同样来自 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);
}

关于c - 在单个 DNS 查询中请求 A 和 AAAA 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4082081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com