我一直在 Wireshark 中查看 DNS 响应数据包,但无法理解答案和权威部分的十六进制编码。
考虑 DNS 查询:mail.abcd.com
答案部分包含名称字段,其十六进制编码因以下而异:
0xc00c
0xc012
它们都导致在字段中填充整个名称。
权威部分还包含名称字段,但其十六进制编码通常为:
0xc010
这导致 abcd.com 被填充到该字段中。
谁能说出填充这些字段所遵循的约定是什么,因为它非常令人困惑。
谢谢
我一直在 Wireshark 中查看 DNS 响应数据包,但无法理解答案和权威部分的十六进制编码。
考虑 DNS 查询:mail.abcd.com
答案部分包含名称字段,其十六进制编码因以下而异:
0xc00c
0xc012
它们都导致在字段中填充整个名称。
权威部分还包含名称字段,但其十六进制编码通常为:
0xc010
这导致 abcd.com 被填充到该字段中。
谁能说出填充这些字段所遵循的约定是什么,因为它非常令人困惑。
谢谢
DNS 标签使用<length><data ...>
.
一个标签最多可以有 63 个字节长,因此该<length>
字段还剩下两位。这些用于对标签类型进行编码。
如果前两位是,0b11
则其余六位将与以下字节组合形成压缩指针,该压缩指针是 DNS 有效负载内到另一个标签的先前实例的偏移量。
由于 DNS 协议标头长 12 个字节,因此最短的合法偏移量是 12 个字节,给出您在上面看到的0xc00c
.
[从技术上讲,人们可能会构造一个指向标头的压缩指针,但它并不严格符合协议]。
我强烈建议不要尝试从电报包中对规范进行逆向工程——你将不可避免地错过一些东西。只需阅读RFC 1035 - 所有核心内容都在其中。
阅读规范中的名称压缩。0xc、0x12 和 0x10 是指向数据包中名称“mail.abcd.com”和“abcd.com”的早期副本的指针。