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)
Aln*_*tak 14
虽然数据包格式在技术上支持在问题部分中有多个记录(参见RFC 1035的 §4.1.2 ),但实际上它并不起作用,正如您所发现的那样.
特别是没有人设法定义正确的语义,如果这两个问题导致两个不同的RCODE,该怎么做.
我试图在IETF定义那些语义,但到目前为止还没有达到目标.
在我自己的DNS数据包解析代码中,我总是拒绝任何此类数据包.
归档时间: |
|
查看次数: |
11682 次 |
最近记录: |