我正在尝试从头开始实现我自己的 DNS 服务器。但是,我很难理解RFC 1035如何建议执行截断。
第 6.2 节说:
当响应太长以至于需要截断时,截断应该从响应的末尾开始,并在数据报中向前推进。因此,如果权威部分有任何数据,则保证答案部分是唯一的。
我真的无法理解这意味着什么。我认为“前进”意味着远离标题。但这与权限部分有什么关系?它说“响应结束”,我认为这意味着答案部分的结束?如果整个答案部分不适合消息怎么办?
有人可以更好地解释这个算法吗?
仅当需要 RRSet 作为响应的一部分但不能全部包含在内时,才应在响应中设置 TC 位。不应仅仅因为可能包含一些额外信息而设置 TC 位,但没有足够的空间。这包括附加部分处理的结果。在这种情况下,不适合响应的整个 RRSet 应该被忽略,并且按原样发送响应,同时清除 TC 位。如果回复的接收者需要省略的数据,它可以为该数据构造一个查询并单独发送。
在设置了 TC 的情况下,不完全适合的部分 RRSet 可能会留在响应中。当 DNS 客户端收到带有 TC 设置的回复时,它应该忽略该响应,并使用允许更大回复的机制(例如 TCP 连接)再次查询。
TL;博士
如果
TC
设置了,则答案中的记录选择(如果有)并不重要,因为客户端应该只是丢弃消息并通过 TCP 重试,无论如何。首先,我只想指出,如果这个实现是为了学习目的,那么这当然是一种深入理解的好方法。我会推荐Hello DNS作为补充阅读。
如果它用于生产用途,我强烈建议考虑使用一些现有的 DNS 实现作为解决方案的框架,以帮助提供正确的行为;当您开始研究现代 DNS 服务器的期望时,会有很多事情要做。
关于您关于 RFC1035 中非常简短的截断注释的问题(请注意本文档的年龄,它在清晰的语言方面并没有真正成立),我还发现他们对 TC 的解释相当奇怪。
但是,我确实相信这里提到的本质上是 DNS 消息中各部分的顺序与数据的“重要性”一致。
常规查询/响应消息具有以下部分(来自第 4.1 节):
我相信他们所说的本质上只是你应该从头开始丢弃东西(更喜欢从额外的东西,然后是权威......)。然后,这种方法使他们注意到我认为应该说的是,如果在例如权威部分中有任何内容,您就知道答案部分是完整的。
综上所述,我真的认为 RFC2181 中的相关部分更有帮助(而且更清晰,这正是 RFC2181 的目的)。
如那里所述(释义):
如果有任何您正在考虑添加到响应中的可选数据(除了最低限度回答问题所严格要求的数据,即通常与问题匹配的完整 RRSet),那么该可选数据可以简单地删除而无需设置
TC
.如果您必须删除对
TC
必须设置的答案至关重要的内容,并且如果TC
设置了客户端必须丢弃响应并通过 TCP 重试(这在很大程度上使得 RFC1035 中有些复杂的推理与行为良好的客户端无关,他们不会对任何事情都使用截断的答案)。