我有一个有3个TXTlogging的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请求。
如何计算是否超出长度限制而不生成DNSlogging并执行查询?
我假设公式是这样的:
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的值是什么?
(还是我走错了方向?)
实际上,在实施之前,您不应该试图预先计算TXTlogging的确切响应大小。 有很多变数在起作用,其中有些变数是你无法控制的。 大多数pipe理员根据他们从权威服务器观察到的现有TXTlogging响应的大小进行归纳,并称之为一天。 由于你的问题的重点是如何避免泛化,这个答案将关注为什么难以使用精确的计算。
(这个回答不应该被看作是反对试图留在512字节内的声明,这是对用来做这件事的方法的一个评论。)
sDNSHeader + sQuestion + sAnswer + sAuthority + sAdditional
你能写一个程序或脚本来为你做所有这些计算吗? 当然。 对于你正在试图解决的问题,这是一个很好的时间吗? 可能不会。 使用该区域内现有的TXTlogging作为粗略的尺寸准则,如果长度超过512字节,请确保熟悉利用TXTlogging内置到相关标准中的任何“包含”function。 (SPF等)
历史上你会得到512个八比特组的DNS净荷,其中10个八位字节是一个固定的头。 您必须腾出空间填写回复中将包含的问题部分。 这大致是问题名称加四个八位字节。 每个TXT RR将使用压缩指针直到问题名称,作为其拥有者名称。 这是两个八位字节 然后是10个八位字节的固定开销(ttl,class,type和rdlen)。 您可以将更多的文本合并到一个真正长的TXT RR中,而不是分成多个不连续的TXT RR。 一般来说,你应该尝试input一堆不同的TXT RR到你的一个区域,然后用“挖”来获取每一个区域,看看有多less“挖”说有效载荷。
历史上的512位数字被选为IPv4,但对于IPv6却没有放松。 在IPv4中,有效载荷加上最差情况下的UDP和IP报头将产生568个八位字节的IP数据报,这是最小允许的最小重组缓冲器大小 – 如果IPv4端不能“重新组装”那么,没有人可以假设你可以重新组装。
在现代DNS中,缓冲区大小将使用OPT RR(“EDNS0”)进行协商,通常为4096.这反映了远远超过568个八位字节的大小,terminal实际上可以重新组合。 显然EDNS0缓冲区大小大于以太网MTU(或者如果你发现它的话,你的pathMTU)会导致IP碎片,并且这通常会导致丢失,因为防火墙不允许它。 当EDNS0 @ 4K发生故障时,它会经常在1460(为IP和UDP报头留出空间加上你的有效载荷,仍然适合以太网数据包),然后在512上重试,然后在没有EDNS0的情况下重试(这也是512 )。 如果你依赖于EDNS,你通常会发送TC = 1(“截断发生”),在这种情况下请求者可能会重试使用TCP,或者直接失败。
这意味着如果你依赖于512以上,你会使用TCP很多。 因为你的问题是关于UDP,这可能意味着你应该适应512。
如果我读了RFC1035的权利,你有:
Header: 12 bytes Question: querylen +1(null term)+4 Answer: N*(namelen+1+10+(S*(1+txtlen)))
那么,举个例子(每个TXTlogging只有一个文本段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
TXTlogging最多可容纳255个字节的数据,UDP数据包可以是任意大小。 UDP数据包将被分段以适应65,507的IP。