如何处理对DNS服务器的数百万次查询?

如何处理对DNS服务器的数百万次查询?,dns,udp,client-server,Dns,Udp,Client Server,我想知道,由于txnid字段是uint16类型,现代DNS服务器如何每秒处理数百万次查询 让我解释一下。有一个中间服务器,从一方客户端向其发送DNS请求,从另一方服务器本身向上层DNS服务器发送请求(例如8.8.8.8)。所以问题是,根据DNS协议,DNS报头中有字段txnid,在请求和响应期间应该保持不变。显然,具有多个客户端的中间DNS服务器将此值替换为其自己的txnid值(这是一个计数器),然后将请求发送到外部DNS服务器,并在解析后将此值替换回客户端的值。由于uint16字段类型的原因,

我想知道,由于txnid字段是uint16类型,现代DNS服务器如何每秒处理数百万次查询


让我解释一下。有一个中间服务器,从一方客户端向其发送DNS请求,从另一方服务器本身向上层DNS服务器发送请求(例如8.8.8.8)。所以问题是,根据DNS协议,DNS报头中有字段txnid,在请求和响应期间应该保持不变。显然,具有多个客户端的中间DNS服务器将此值替换为其自己的txnid值(这是一个计数器),然后将请求发送到外部DNS服务器,并在解析后将此值替换回客户端的值。由于uint16字段类型的原因,所有这些都适用于65535个同时请求。但是,如果我们有数亿个类似谷歌DNS服务器的服务器呢?

从您的谷歌DNS服务器示例来看:

  • 2018年年中,他们的服务器正在处理,根据这一增长推断,他们的服务目前每秒处理约2000万个查询
  • 他们说,成功地解决了一个问题,但考虑到超时,平均时间将达到约400毫秒
  • 我找不到任何关于缓存命中率的数字,但我假设它超过90%。据推测,它会随着他们服务的普及而增加
  • 综合以上各项(
    2e7*0.4*(1-0.9)
    )我们在任何时候都有约100万笔交易处于活动状态。所以你必须在某处找到至少20位的状态。由于
    txnid
    字段,16位免费提供。正如Steffen指出的,您还可以使用端口号,这可能会为您提供另一个~15位的状态。仅仅这两个来源就足以让你运行比谷歌DNS系统大几个数量级的东西


    也就是说,您还可以将事务ID降级以防止任何缓存中毒攻击,即拒绝txnid与该问题的机上查询不匹配的任何答案。如果此检查通过,则将答案添加到缓存并恢复所有等待的客户端。

    从您的Google DNS服务器示例:

  • 2018年年中,他们的服务器正在处理,根据这一增长推断,他们的服务目前每秒处理约2000万个查询
  • 他们说,成功地解决了一个问题,但考虑到超时,平均时间将达到约400毫秒
  • 我找不到任何关于缓存命中率的数字,但我假设它超过90%。据推测,它会随着他们服务的普及而增加
  • 综合以上各项(
    2e7*0.4*(1-0.9)
    )我们在任何时候都有约100万笔交易处于活动状态。所以你必须在某处找到至少20位的状态。由于
    txnid
    字段,16位免费提供。正如Steffen指出的,您还可以使用端口号,这可能会为您提供另一个~15位的状态。仅仅这两个来源就足以让你运行比谷歌DNS系统大几个数量级的东西


    也就是说,您还可以将事务ID降级以防止任何缓存中毒攻击,即拒绝txnid与该问题的机上查询不匹配的任何答案。如果此检查通过,则将答案添加到缓存并恢复所有等待的客户端。

    还有源端口。如果使用TCP,则存在相关的TCP连接,该连接不仅是源端口,而且是TCP序列号。另外,原始问题也包含在回答中。@SteffenUllrich,我真的不明白如何使用端口来获得额外的位。好的,对于来自客户端的传入连接,我们有源端口号。对于谷歌服务器的传出连接,我们只有一个端口。那么如何识别从外部DNS服务器到客户端的解析请求呢?“对于到google服务器的传出连接,我们只有一个端口。”-不。目标端口是固定的,但源端口是中间服务器系统上的某个随机源端口。还有源端口。如果使用TCP,则存在相关的TCP连接,该连接不仅是源端口,而且是TCP序列号。另外,原始问题也包含在回答中。@SteffenUllrich,我真的不明白如何使用端口来获得额外的位。好的,对于来自客户端的传入连接,我们有源端口号。对于谷歌服务器的传出连接,我们只有一个端口。那么,如何识别从外部DNS服务器到客户端的已解析请求呢?“对于到google服务器的传出连接,我们只有一个端口。”-不。目标端口是固定的,但源端口是中间服务器系统上的某个随机源端口。我真的不明白如何使用端口来获得额外的位。好的,对于来自客户端的传入连接,我们有源端口号。对于谷歌服务器的传出连接,我们只有一个端口。那么如何识别从外部DNS服务器到客户端的已解析请求呢?@AlekDepler您可以打开许多端口(即本地套接字)与上游服务器通信,每个端口都为您提供
    txnid
    状态位。有2^16个UDP端口(有些端口已经被使用了,因此我在上面说15位),所以即使您只与一个上游服务器通信,也会得到约31位的状态。您可以只使用
    (txnid,sockfd)
    (可能还包括更多状态的对等地址)的组合,或者查看数据包问题部分的实际数据(出于正确性/安全原因,您可能无论如何都想这样做),但您并不真正了解如何使用端口来获得额外的位。好的,对于来自客户端的传入连接,我们有源端口号。和用于传出连接