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

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

起初就让他们抓包,把超时的申请的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比拟大,导致它被抉择的概率是比拟小的,也就导致了友商呈现申请超时的次数并不是特地多