【问题标题】:How DNS message compression avoids collision of labels and pointers?DNS消息压缩如何避免标签和指针的冲突?
【发布时间】:2020-08-27 17:35:27
【问题描述】:

在阅读 RFC 1035(又名域名 - 实施和规范)时,我发现了以下内容:

4.1.4。消息压缩

为了减小消息的大小,域系统使用了一个 消除域名重复的压缩方案 信息。在此方案中,整个域名或标签列表位于 域名的结尾被替换为指向先前出现的指针 同名。

指针采用两个八位字节序列的形式:

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| 1  1|                OFFSET                   |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

前两位是 1。这允许区分指针 来自标签,因为标签必须以两个零位开始,因为 标签限制为 63 个八位字节或更少。 (10 和 01 组合 保留以供将来使用。)OFFSET 字段指定从 消息的开始(即,ID 字段的第一个八位字节) 域标头)。零偏移量指定 ID 字段的第一个字节, 等等

为什么对标签的“63 个八位字节或更少”限制可以保证以两个一 (1) 位开头的指针可以与标签区分开来?

【问题讨论】:

  • 第一位是 2^7 又名 128,接下来是 64。因此,如果现在切换它,则值是 64 或更大,因此如果长度为 63 或更少,则相反为 0,另一个为 128,因此它不能是偏移量。

标签: dns binary hex


【解决方案1】:

解释在同一个RFC 1035

每个标签都表示为一个八位字节长度字段,后跟该字段 字节数。

所以最左边(第一个)八位字节包含标签字段长度,其最大值可以是630011111 二进制,并且在两个最高位中至少存在一个1 可以将标签与其他内容区分开来。

【讨论】:

  • 你的解释完全有道理,因为你说标签的最左边的八位字节(实际上是1个八位字节)只能是63十进制或0011111二进制。然而,这并不是我提到的文本所说的,它说的是 63 个 octets 或更少。我错过了什么吗?
  • 最左边的八位字节是的第一位。我编辑了答案以使其变得清晰。
  • 好的,现在很清楚了。总结一下:因为长度(最左边/第一个八位字节)只能保存 63 十进制或 0011111 二进制的值,这也意味着标签最多可以有 63 个八位字节代表它,因此在问题。感谢您的宝贵时间。
猜你喜欢
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多