我有一个具有3条TXT记录的DNS域:
$ORIGIN example.com.
@ IN TXT "thing one veryveryveryveryveryverylong"
@ IN TXT "thing two veryveryveryveryveryverylong"
@ IN TXT "thing three veryveryveryveryveryverylong"
当我执行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
a,b,c的值是多少?
(还是我走错了方向?)
发布于 2017-07-21 22:45:22
在实践中,您不应该在实现TXT记录之前预先计算它们的确切响应大小。有许多变量在发挥作用,其中有些你无法控制。大多数管理员根据他们从权威服务器观察到的现有TXT记录响应的大小进行概括,并将其称为一天。既然你的问题的重点是如何避免泛化,这个答案将集中在为什么它是很难使用精确的计算。
(不应将此答案视为支持或反对试图保持在512字节以内的声明,这是对用于此操作的方法的评论。)
sDNSHeader + sQuestion + sAnswer + sAuthority + sAdditional
你能写一个程序或脚本来完成所有这些计算吗?好的。对你想要解决的问题来说,这是一个很好的利用时间吗?可能不会。使用区域内现有的TXT记录作为粗略的大小调整指南,如果增长超过512字节,请确保您熟悉在相关标准中内置的任何"include“功能,利用TXT记录。(SPF等)
发布于 2017-07-22 02:56:35
历史上,DNS的有效负载为512辛特,其中10辛特是一个固定的头。您必须为将包含在答复中的问题部分的副本腾出空间。这大概是问题的名字加上四个八位数。每个TXT将使用一个指向问题名的压缩指针作为其所有者名称。那是两个八位数。然后是10位字节的固定开销(ttl、class、type和rdlen)。与多个离散的TXT RR相比,您将更多的文本放入一个真正长的TXT RR中。通常,您应该尝试在一个区域中输入一组不同的TXT,然后使用"dig“来获取每个区域,并查看"dig”表示的有效载荷是多长时间。
历史上的512个数字是为IPv4选择的,但对于IPv6则不是轻松的。在IPv4中,有效负载加上最坏的UDP和IP报头将产生一个568个八进制IP数据报,这是最低允许的最小重新组装缓冲区大小--如果IPv4终端站不能至少重新组装那么多,那么它是“不符合”的,因此,没有人允许假设您可以重新组装更多。
在现代DNS中,缓冲区大小将使用OPT ("EDNS0")协商,通常为4096。这反映了终端站实际上可以重新组装的大于-568个八位数的大小。显然,EDNS0缓冲区的大小大于您的以太网MTU (或者您发现的路径MTU )将导致IP碎片,这通常会导致损失,因为防火墙不允许它。当EDNS0 @4K失败时,它通常会在1460重新尝试(为IP和UDP报头留出空间,加上有效负载,并且仍然适合于以太网数据包),然后在512下重试,然后在没有EDNS0的情况下重试(也就是512)。如果您依赖于EDNS,您通常会发送TC=1 (“截断发生了”),在这种情况下,请求者可能会重新尝试使用TCP,或者完全失败。
这意味着,如果您依赖于512以上,那么您将大量使用TCP。因为您的问题是关于UDP的,这可能意味着您应该适应512。
发布于 2017-07-21 22:33:28
如果我读对了RFC1035,你有:
Header: 12 bytes
Question: querylen +1(null term)+4
Answer: N*(namelen+1+10+(S*(1+txtlen)))
因此,对于您的示例(其中每个TXT记录只有一个文本段S):
query = example.com
querylen = 11
name: I'm not sure if that would be blank or example.com in your example
but I think it would be example.com, so
namelen = 11
txtlen1 = 38
txtlen2 = 38
txtlen3 = 40
所以,我们有12+11+5=28 +答案
P1 = Answer1 = 11+11+1+38 = 61
P2 = Answer1 = 11+11+1+38 = 61
P3 = Answer1 = 11+11+1+40 = 63
28+61+61+63=213
https://serverfault.com/questions/863549
复制相似问题