如何处理对DNS服务器的数百万次查询?
我想知道,由于txnid字段是uint16类型,现代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字段类型的原因,
让我解释一下。有一个中间服务器,从一方客户端向其发送DNS请求,从另一方服务器本身向上层DNS服务器发送请求(例如8.8.8.8)。所以问题是,根据DNS协议,DNS报头中有字段txnid,在请求和响应期间应该保持不变。显然,具有多个客户端的中间DNS服务器将此值替换为其自己的txnid值(这是一个计数器),然后将请求发送到外部DNS服务器,并在解析后将此值替换回客户端的值。由于uint16字段类型的原因,所有这些都适用于65535个同时请求。但是,如果我们有数亿个类似谷歌DNS服务器的服务器呢?从您的谷歌DNS服务器示例来看:
2e7*0.4*(1-0.9)
)我们在任何时候都有约100万笔交易处于活动状态。所以你必须在某处找到至少20位的状态。由于txnid
字段,16位免费提供。正如Steffen指出的,您还可以使用端口号,这可能会为您提供另一个~15位的状态。仅仅这两个来源就足以让你运行比谷歌DNS系统大几个数量级的东西
也就是说,您还可以将事务ID降级以防止任何缓存中毒攻击,即拒绝txnid与该问题的机上查询不匹配的任何答案。如果此检查通过,则将答案添加到缓存并恢复所有等待的客户端。从您的Google DNS服务器示例:
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)
(可能还包括更多状态的对等地址)的组合,或者查看数据包问题部分的实际数据(出于正确性/安全原因,您可能无论如何都想这样做),但您并不真正了解如何使用端口来获得额外的位。好的,对于来自客户端的传入连接,我们有源端口号。和用于传出连接