DNS查询之前有多lessTXT数据不适合UDP数据包?

我有一个有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 
  • 查询本身显示在回复数据包的问题部分,并且必须考虑到。
  • 正如你猜测的,答案的数量和字节长度也必须考虑在内。
  • 如果授权服务器被configuration为列出授权部分中的名称服务器以及附加部分中的相应地址logging,那么也必须考虑这些。
  • 如果请求包含额外部分中的EDNS0伪部分,则兼容服务器将使用其自己的伪部分进行回复。 如果EDNS0 正在播放,查询可能要求消息大小超过512字节,但是这仍是一个考虑因素,特别是因为通信path中的networking硬件可能会错误地拒绝大于512字节的DNS数据包,并强制有效的消息限制回落到原来的约束。
  • RFC 1035消息压缩也是一个因素。

你能写一个程序或脚本来为你做所有这些计算吗? 当然。 对于你正在试图解决的问题,这是一个很好的时间吗? 可能不会。 使用该区域内现有的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。