你要么应用 Postel 法则(“在你所做的事情上保持保守,在你从他人那里接受的事情上保持自由”)——这通常被吹捧为 Internet 上许多不同事物的互操作性成功的原因/条件之一- 或者,如果您严格应用您认为无效的 RFC,您可以立即回复 FORMERR。
在第二种情况下,由于您将获得偏离的客户端(不一定针对您的特定情况,在 DNS 世界中,它们在各个方面都有很多不符合要求的实现),您需要定义是否创建特定规则(如 ACL)接受其中的一些,因为你认为它们是“重要的”。
请注意,在这个阶段,您的问题与编程无关(没有代码),所以这里有点离题。但答案还取决于您正在构建什么样的“数据包处理程序”。如果是用于某种 IDS/监控/等。您需要“尽可能多地”解析 DNS 流量以报告它。如果要模仿现实世界的 DNS 解析器并确保它的行为类似于解析器,那么您可能不需要处理每一个奇怪的偏差情况。
还要记住,所有这些都可以在传输过程中更改,所以如果您收到一些错误的东西,显然并不总是来自发件人的错误,这可能是因为一些中介,无论是否愿意。
最后,无法预测您将获得的一切,并且在任何足够广泛的实验中,您都会惊讶于您无法理解的流量数量以及它是如何存在的。因此,与其尝试在开始之前定义所有内容,不如迭代版本,清楚地了解您的目标(尽可能多地为某种监控系统解析,或者尽可能精简/简单/安全/接近现实世界的功能尽可能的 DNS 解析)。
至于“我怎么知道”。您可以研究各种现有解析器(bind、nsd、unbound 等)的来源,看看它们是如何反应的。或者只是启动它们并像您想象的那样向它们扔一些错误的数据包并查看它们的回复。有些案例可能以单元/回归测试的形式存在,并且像 ZoneMaster 这样的工具可能会被扩展(如果尚未进行这些特定测试)以涵盖您的案例。