为什么使用谷歌的公共DNS 8.8.8.8 反而会让你网速变慢

有一个外部合作商,有次问我们,为什么我们的接口会概率性超时?但是这个接口是供很多外部合作商使用的,其他人都未反馈这个问题,只有他们反馈了,所以觉得很奇怪。

后面我就让他们给我提供请求的参数,根据这些参数也没有搜索到对应的请求记录,想想应该是请求并没有到达我们的业务机,可能在公共接入一层,甚至都没到公共接入这一层,这一下子问题就不好查了。

后来就让他们抓包,把超时的请求的TCP都抓取下来。我用wireshark打开之后,看到超时都是TCP Retransmission 超时重传引起的,然后发现这些请求都跑到了我们公司的香港机房去了,也难怪会超时,毕竟我们的香港机房并没有对国内用户做优化。

然后我自己用curl把请求指向这个香港的服务器,然后用wireshark抓包,确实会时不时出现超时重传的情况。至此可以确定引起超时的原因是因为请求到了香港机房。

于是就有两个疑惑了,为什么请求会到了香港机房?为什么会概率性出现而不是必现?

后来对方的运维根据这个线索,终于意识到是因为他们服务器使用的DNS中有谷歌的公共DNS,从而导致了请求到了我们的香港机房去了。

当时我就很疑惑,为什么配置了8.8.8.8会导致请求到了我们的香港机房?顺着这个疑惑,我去找了好多文章,总算是大概搞明白了一点了。

归结起来就是三个疑问:

  1. 为什么使用谷歌的DNS会导致请求到了我们的海外机房
  2. 是根据什么方式和策略让不同地区的人请求到不同的机房去的
  3. 概率性出现是因为DNS的选择策略,那DNS的选择策略是怎么样的?

在我们国内,由于多个网络运营商,还需要做到让电信的用户到电信机房,联通的用户到联通机房,移动的用户到移动机房,选择运营商又是怎么做到的呢?

最后搜索到了关于智能DNS的知识,大概如下:

为什么使用谷歌的公共DNS 8.8.8.8 反而会让你网速变慢_第1张图片

实际上就是智能DNS是根据来源请求的IP地址,来判断所属地区和运营商,然后分配到离用户最近,且运营商一致的机房去。也就是我司这边的域名解析配置了一个智能的DNS,它会根据用户请求的来源IP把用户分配到最佳的机房节点去。

从DNS请求中是获取不到用户的来源IP地址的,只能通过用户所使用的DNS的IP地址,来判断用户所属的地区和运营商,然后分配到最佳的节点去。

不过谷歌也开发了一种DNS的扩展协议,EDNS Client Subnet, 可以在DNS请求中携带上用户的真实IP。但是这个要求用户使用的DNS服务支持这个协议,也要求我司使用的DNS服务支持这个协议,才能从中得到用户的真实IP,所以这个运用并不广泛,国内绝大多少网站都是通过用户的DNS服务的IP来判断用户的地理位置和运营商的。

大多数人使用网络的时候,都默认使用运营商提供的DNS服务器,这些服务器一则与用户地理位置接近,二则运营商也一样。所以根据DNS服务器的IP来判断用户的地理位置和运营商是可行的。

所以使用谷歌的DNS的时候,由于谷歌的8.8.8.8并没有在国内部署,因此都被我司的智能DNS判定为海外用户,然后指向到海外的机房去了。

然后这里就涉及到另一个问题了,这些公共的DNS只有一个IP,难道全球就只部署了一台吗?那114.114.114.114这个电信的公共DNS,为什么其他运营商的网络用起来也没什么问题呢?

实际上公共DNS的部署采取的是任播(Anycast)技术,确切的说是BGP 任播技术,多个主机使用同一个IP地址(该地址即这一组主机的共享单播地址)的一种技术,当发送方发送报文给这个共享单播地址时,报文会根据路由协议路由到这一组主机中离发送方最近的一台。类似于下图:

为什么使用谷歌的公共DNS 8.8.8.8 反而会让你网速变慢_第2张图片

不同地区的用户访问这个公共DNS的时候,实际访问的服务器是不一样的。另外,作为任播的IP,是只能被动接收请求,而不能主动发起请求的,毕竟主动发起的话,接收方的回复是不知道返回给哪一台服务器好的。

新的问题就来了,比如114.114.114.114是电信的公共DNS,如果一个移动的用户使用这个DNS,智能DNS是如何分辨出这个用户是移动的而不是电信的呢?就如上面所说的,任播的IP是不能主动发起请求的,公共DNS的服务器为了能够主动发起请求,他们本身还必须配置另一个单播IP,主动发起的请求都使用这个IP。这样子的话,智能DNS就能够分辨运营商了。

另外,关于多个DNS服务器的选择策略,目前采取的是平滑往返时间,即SRTT策略。

第一次所有DNS服务器都会随机给一个初始值,然后取最小的那个发起查询请求,根据本次的请求时间,把当前这个DNS的SRTT做一个重算,然后其他的DNS也要有一定量的衰减。

第二次又选择最小SRTT发起请求,如此循环,大约半小时重置一次,重新随机分配一个初始值。

为什么使用谷歌的公共DNS 8.8.8.8 反而会让你网速变慢_第3张图片

所以谷歌的公共DNS因为SRTT比较大,导致它被选择的概率是比较小的,也就导致了友商出现请求超时的次数并不是特别多

你可能感兴趣的:(dns)