关于dns:为什么使用谷歌的公共DNS-8888-反而会让你网速变慢

95次阅读

共计 1943 个字符,预计需要花费 5 分钟才能阅读完成。

有一个内部单干商,有次问咱们,为什么咱们的接口会概率性超时?然而这个接口是供很多内部单干商应用的,其他人都未反馈这个问题,只有他们反馈了,所以感觉很奇怪。

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

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

而后我本人用 curl 把申请指向这个香港的服务器,而后用 wireshark 抓包,的确会时不时呈现超时重传的状况。至此能够确定引起超时的起因是因为申请到了香港机房。

于是就有两个纳闷了,为什么申请会到了香港机房?为什么会概率性呈现而不是必现?

起初对方的运维依据这个线索,终于意识到是因为他们服务器应用的 DNS 中有谷歌的公共 DNS,从而导致了申请到了咱们的香港机房去了。

过后我就很纳闷,为什么配置了 8.8.8.8 会导致申请到了咱们的香港机房?顺着这个纳闷,我去找了好多文章,总算是大略搞明确了一点了。

归纳起来就是三个疑难:

  1. 为什么应用谷歌的 DNS 会导致申请到了咱们的海内机房
  2. 是依据什么形式和策略让不同地区的人申请到不同的机房去的
  3. 概率性呈现是因为 DNS 的抉择策略,那 DNS 的抉择策略是怎么样的?

在咱们国内,因为多个网络运营商,还须要做到让电信的用户到电信机房,联通的用户到联通机房,挪动的用户到挪动机房,抉择运营商又是怎么做到的呢?

最初搜寻到了对于智能 DNS 的常识,大略如下:

实际上就是智能 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 的时候,理论拜访的服务器是不一样的。另外,作为任播的 IP,是只能被动接管申请,而不能被动发动申请的,毕竟被动发动的话,接管方的回复是不晓得返回给哪一台服务器好的。

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

另外,对于多个 DNS 服务器的抉择策略,目前采取的是平滑往返工夫,即 SRTT 策略。

第一次所有 DNS 服务器都会随机给一个初始值,而后取最小的那个发动查问申请,依据本次的申请工夫,把以后这个 DNS 的 SRTT 做一个重算,而后其余的 DNS 也要有一定量的衰减。

第二次又抉择最小 SRTT 发动申请,如此循环,大概半小时重置一次,从新随机调配一个初始值。

所以谷歌的公共 DNS 因为 SRTT 比拟大,导致它被抉择的概率是比拟小的,也就导致了友商呈现申请超时的次数并不是特地多

正文完
 0