我一直在关注Wireshark中的DNS响应数据包,并且无法理解答案和权威部分的十六进制编码。
考虑DNS查询:mail.abcd.com
答案部分包含名称字段,其十六进制编码因:
而异 0xc00c
0xc012
它们都会导致在该字段中填充整个名称。
权威部分还包含名称字段,但通常为:
的十六进制编码 0xc010
这导致abcd.com在该领域居住。
任何人都可以告诉填充这些字段的惯例是什么,因为它非常令人困惑。
由于
答案 0 :(得分:9)
DNS标签使用<length><data ...>
格式。
标签最长可达63个字节,因此<length>
字段剩余两个位。这些用于编码标签类型。
如果前两位是0b11
,那么剩余的六位将与后面的字节组合成一个压缩指针,它是DNS有效负载内的一个偏移量,用于之前另一个标签的实例。
由于DNS协议标头长度为12个字节,因此最短的合法偏移量为12个字节,从而得出您在0xc00c
之上看到的值。
[技术上,可能会构造一个指向标题的压缩指针,但它并不严格符合协议]。
我强烈建议反对尝试从有线数据包中反向设计规范 - 你将不可避免地错过任何东西。只需阅读RFC 1035 - 所有核心内容都在那里。
答案 1 :(得分:5)
阅读规范中的name compression。 0xc,0x12和0x10是指向数据包中名称“mail.abcd.com”和“abcd.com”的早期副本的指针。
答案 2 :(得分:0)