DNS 查询前有多少 TXT 数据不适合 UDP 数据包?

Tom*_*ime 5 domain-name-system

我有一个包含 3 个 TXT 记录的 DNS 域:

$ORIGIN example.com.
@   IN TXT "thing one veryveryveryveryveryverylong"
@   IN TXT "thing two veryveryveryveryveryverylong"
@   IN TXT "thing three veryveryveryveryveryverylong"
Run Code Online (Sandbox Code Playgroud)

当我执行 DNS 查询 ( dig example.com. txt) 时,回复适合 UDP 数据包,因为有效负载小于 512 字节(导致数据包小于 576 字节)。

但是我知道如果回复足够长,它将被截断并且 DNS 客户端将不得不使用 TCP 重复请求,TCP 具有更长的长度限制。

如何在不生成 DNS 记录和查询的情况下计算我是否超过了长度限制?

我假设这个公式是这样的:

N: the number of TXT records on that label.
P: the number of bytes in all the TXT records.
S: the total number of text segments (TXT records can have multiple text segments per record)

UDP is required if N*a + P*b + S*c is more than 512
Run Code Online (Sandbox Code Playgroud)

a、b 和 c 的值是什么?

(还是我走错方向了?)

And*_*w B 8

在实践中,您不应该在实现 TXT 记录之前尝试预先计算它们的确切响应大小。有许多变数在起作用,其中一些是您无法控制的。大多数管理员根据他们从权威服务器观察到的现有 TXT 记录响应的大小进行概括,并称之为一天。由于您的问题的重点是如何避免泛化,因此该答案将重点关注为什么难以使用精确计算。

(这个答案不应被视为支持或反对试图保持在 512 字节内的声明,它是对用于这样做的方法的评论。)

sDNSHeader + sQuestion + sAnswer + sAuthority + sAdditional
Run Code Online (Sandbox Code Playgroud)
  • 查询本身出现在回复包的问题部分,必须予以考虑。
  • 正如您猜测的那样,还必须考虑答案的数量及其字节长度。
  • 如果授权服务器被配置为在授权部分列出名称服务器并在附加部分列出相应的地址记录,那么这些也必须考虑在内。
  • 如果请求在附加部分中包含 EDNS0 伪部分,则兼容服务器将使用其自己的伪部分进行回复。如果 EDNS0正在运行,该查询可能请求大于 512 字节的消息大小,但这仍然是一个考虑因素,特别是因为通信路径中的网络硬件可能会错误地将大于 512 字节的 DNS 数据包拒绝为无效,并强制降低有效消息限制到原始约束。
  • RFC 1035消息压缩也是一个因素。

您能编写一个程序或脚本来为您完成所有这些计算吗?当然。对您要解决的问题是否很好地利用了时间?可能不是。使用区域内现有的 TXT 记录作为粗略的大小指南,如果增长超过 512 字节是一个问题,请确保您熟悉利用 TXT 记录的相关标准中内置的任何“包含”功能。(SPF等)


小智 -3

TXT 记录最多可容纳 255 字节的数据,UDP 数据包可以是任意大小。UDP 数据包将被分段以适合 IP 65,507。