多级 DNS 名称压缩

多级 DNS 名称压缩

我正在努力实现一点DNS 存根服务器,我无法解释部分内容DNS RFC 1035

The compression scheme allows a domain name in a message to be
represented as either:

   - a sequence of labels ending in a zero octet

   - a pointer

   - a sequence of labels ending with a pointer

DNS 名称跟随多个指针是否有效?即,以指针结尾的标签序列指向以指针结尾的标签序列,可能出现多次。或者,在使用压缩时,只有以指针结尾的标签序列指向以零八位字节结尾的标签序列才是有效的?谢谢。

答案1

DNS 名称遵循多个指针是否有效?

是也不是。

假设您有以下名称(不写出每个名称的末尾点):

  • example.com
  • a.example.com
  • b.a.example.com
  • c.example.com.example.net

如果按此顺序,它们可以编码为:

  1. example++ com\02 个标签 + 零个八位字节)
  2. a+ 指向前一个项目的指针
  3. 任何一个:
    1. b+ 指向前一个项目的指针(应优先考虑,压缩性更强)
    2. b++a指向第一个项目的指针
  4. c+ example+ com+ example+ net+\0

在最后一种情况下,您不能执行c+ 指向第一个的指针example.com,因为如果这样做,那么example.com您将进入最后一个\0,因此您就完成了,您只编码了c.example.com而不是c.example.com.example.net

基本上,你可以将压缩视为压缩后缀。而不是对名称中的任何位置进行任意压缩。

但是第三种情况变体 1 表明您可以跟踪多个指针:b+ 指向的指针(a+ 指向的指针(example+ com+ \0))

RFC 1035 的第 4.1.4 节有一个完整的示例:

For example, a datagram might need to use the domain names F.ISI.ARPA,
FOO.F.ISI.ARPA, ARPA, and the root.  Ignoring the other fields of the
message, these domain names might be represented as:

       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    20 |           1           |           F           |
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    22 |           3           |           I           |
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    24 |           S           |           I           |
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    26 |           4           |           A           |
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    28 |           R           |           P           |
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    30 |           A           |           0           |
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    40 |           3           |           F           |
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    42 |           O           |           O           |
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    44 | 1  1|                20                       |
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    64 | 1  1|                26                       |
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    92 |           0           |                       |
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

The domain name for F.ISI.ARPA is shown at offset 20.  The domain name
FOO.F.ISI.ARPA is shown at offset 40; this definition uses a pointer to
concatenate a label for FOO to the previously defined F.ISI.ARPA.  The
domain name ARPA is defined at offset 64 using a pointer to the ARPA
component of the name F.ISI.ARPA at 20; note that this pointer relies on
ARPA being the last label in the string at 20.  The root domain name is
defined by a single octet of zeros at 92; the root domain name has no
labels.

相关内容