HttpDNS 服务详解

本贴最后更新于 2252 天前,其中的信息可能已经时异事殊

首先,需要明确一个概念,什么叫做 HttpDNS 以及为什么要用 HttpDNS。

HttpDNS 是使用 HTTP 协议向 DNS 服务器的 80 端口进行请求,代替传统的 DNS 协议向 DNS 服务器的 53 端口进行请求。也就是使用 Http 协议去进行 dns 解析请求,将服务器返回的解析结果,也就是域名对应的服务器 ip 获得,直接向该 ip 发起对应的 api 服务请求,代替使用域名。

那么为什么要使用 HttpDNS 呢?主要原因有三点

1、LocalDNS 劫持
2、平均访问延迟下降
3、用户连接失败率下降

LocalDNS 劫持: 由于 HttpDNS 是通过 ip 直接请求 http 获取服务器 A 记录地址,不存在向本地运营商询问 domain 解析过程,所以从根本避免了劫持问题。 (对于 http 内容 tcp/ip 层劫持,可以使用验证因子或者数据加密等方式来保证传输数据的可信度)
平均访问延迟下降: 由于是 ip 直接访问省掉了一次 domain 解析过程,(即使系统有缓存速度也会稍快一些‘毫秒级’)通过智能算法排序后找到最快节点进行访问。
用户连接失败率下降: 通过算法降低以往失败率过高的服务器排序,通过时间近期访问过的数据提高服务器排序,通过历史访问成功记录提高服务器排序。如果 ip(a)访问错误,在下一次返回 ip(b)或者 ip(c) 排序后的记录。(LocalDNS 很可能在一个 ttl 时间内(或多个 ttl)都是返回记录

至于 HttpDNS 更加详细的内容,可以参考下面这篇文章

【鹅厂网事】全局精确流量调度新思路-HttpDNS 服务详解

那么,在客户端该如何实现 httpDNS 呢?目前,国内有一部分厂商已经提供了这个解析服务,我们可以使用它们的服务,也可以使用自建服务器进行中转,至于自建服务器上如何实现,是调第三方呢还是自己去解析呢这个属于服务器的事,对于客户端来说是完全透明的。这篇文章主要是为了学习,为了方便起见,我们直接使用第三方服务。目前,提供 httpdns 解析服务的有:

阿里云 HttpDNS

DNSPod D+

无论是哪个 api,都是直接调用它们暴露的 restful api 获得解析结果,只不过收费问题不一样,当然也有免费的,免费的是有限制的。
阿里云的 HttpDNS 服务的 api 比较标准,直接发一个 Get 请求,带上请求参数,返回结果以 json 返回。

比如
http://203.107.1.1/d?host=www.taobao.com&ip=42.120.74.196
请求成功时,返回结果如下

[html] view plain copy

  1. {
  2.  "host": "www.taobao.com",  
    
  3.  "ips": [  
    
  4.  "115.238.23.241",  
    
  5.  "115.238.23.251"  
    
  6.  ],  
    
  7.  "ttl": 57  
    
  8. }

而 DNSPod 的 API 基本上和阿里云的没什么差别,只不过返回结果不是以 json 返回,而是直接返回 ip 地址。举个例子:
http://119.29.29.29/d?dn=www.dnspod.cn&ip=1.1.1.1&ttl=1

请求成功则返回 ip 地址,但不是 json 格式,如果存在 ttl=1,则以逗号分隔

59.37.116.101,60
但凡使用域名来给用户提供服务的互联网企业,都或多或少地无法避免在有中国特色的互联网环境中遭遇到各种域名被缓存、用户跨网访问缓慢等问题。那么对于腾讯这样的域名数量在 10 万级别的互联网公司来讲,域名解析异常的情况到底有多严重呢?每天腾讯的分布式域名解析监测系统在不停地对全国所有的重点 LocalDNS 进行探测,腾讯域名在全国各地的日解析异常量是已经超过了 80 万条。这给腾讯的业务带来了巨大的损失。为此腾讯建立了专业的团队与各个运营商进行了深度沟通,但是由于各种原因,处理效率及效果均不能达到腾讯各业务部门的需求。除了和运营商进行沟通,有没有一种技术上的方案,能从根源上解决域名解析异常及用户访问跨网的问题呢?

一、问题根源:

要解决问题,我们得先得了解下现在国内各 ISP 的 LocalDNS 的基本情况。国内运营商 LocalDNS 造成的用户访问异常可以归为下三类:

1、域名缓存:

域名缓存很好理解,就是 LocalDNS 缓存了腾讯的域名的解析结果,不向腾讯权威 DNS 发起递归,示意图如下:

为何 LocalDNS 要把域名解析结果进行缓存呢?原因有以下几个:

(1)保证用户访问流量在本网内消化:国内的各互联网接入运营商的带宽资源、网间结算费用、IDC 机房分布、网内 ICP 资源分布等存在较大差异。为了保证网内用户的访问质量,同时减少跨网结算,运营商在网内搭建了内容缓存服务器,通过把域名强行指向内容缓存服务器的 IP 地址,就实现了把本地本网流量完全留在了本地的目的。

(2)推送广告:有部分 LocalDNS 会把部分域名解析结果的所指向的内容缓存,并替换成第三方广告联盟的广告。

这种类型的行为就是我们常说的域名缓存,域名缓存会导致用户产生以下的访问异常:

A、仅对 80 端口的 http 服务做了缓存,如果域名是通过 https 协议或其它端口提供服务的,用户访问就会出现失败。比如支付服务、游戏通过指定端口连接 connect server 服务等。

B、缓存服务器的运维水平参差不齐,时有出现缓存服务器故障导致用户访问异常的问题。

2、解析转发:

除了域名缓存以外,运营商的 LocalDNS 还存在解析转发的现象。解析转发是指运营商自身不进行域名递归解析,而是把域名解析请求转发到其它运营商的递归 DNS 上的行为。正常的 LocalDNS 递归解析过程是这样的:

而部分小运营商为了节省资源,就直接将解析请求转发到了其它运营的递归 LocalDNS 上去了:

这样的直接后果就是腾讯权威 DNS 收到的域名解析请求的来源 IP 就成了其它运营商的 IP,最终导致用户流量被导向了错误的 IDC,用户访问变慢。

3、LocalDNS 递归出口 NAT:

LocalDNS 递归出口 NAT 指的是运营商的 LocalDNS 按照标准的 DNS 协议进行递归,但是因为在网络上存在多出口且配置了目标路由 NAT,结果导致 LocalDNS 最终进行递归解析的时候的出口 IP 就有概率不为本网的 IP 地址:

这样的直接后果就是 GSLB DNS 收到的域名解析请求的来源 IP 还是成了其它运营商的 IP,最终导致用户流量被导向了错误的 IDC,用户访问变慢。

二、现有的解决方案及存在的问题:

运营商的 LocalDNS 解析域名异常,给对用户访问腾讯业务的体验造成了非常大的损害。那么我们是如何处理这些域名解析异常的问题的呢?

1、实时监控 + 商务推动:

这种方案是目前腾讯的运营团队一直在使用的方案。这种方案就是周期比较长,毕竟通过行政手段来推动运营商来解决这个问题是比较耗时的。另外我们通过大数据分析,得出的结论是 Top 3 的问题用户均为移动互联网用户。对于这部分用户,我们有什么技术手段可以解决以上的问题呢?

2、绕过自动分配 DNS,使用 114dns 或 Google public DNS:

这个方案看上去很美好,114dns 是国内最大的中立缓存 DNS,而 Google 又是秉承不作恶理念的互联网工程帝国巨鳄,而且腾讯的权威 DNS 又支持 edns-client-subnet 功能,能直接识别使用 Google publicDNS 解析腾讯域名的用户的 IP 地址,不会出现流量调度失效。但是问题来了:

(1)如何在用户侧构造域名请求:对于 PC 端的客户端来说,构造一个标准的 DNS 请求包并不算什么难事。但在移动端要向一个指定的 LocalDNS 上发送标准的 DNS 请求包,而且要兼容各种 iOS 和 android 的版本的话,技术上是可行的,只是兼容的成本会很高。

(2)推动用户修改配置极高:如果要推动用户手动修改 PC 的 DNS 配置的话,在 PC 端和手机客户端的 WiFI 下面还算勉强可行。但是要用户修改在移动互联网环境下的 DNS 配置,其难度不言而喻。

3、完全抛弃域名,自建 connectcenter 进行流量调度:

如果要采用这种这种方案的话,首先你就得要拿到一份准确的 IP 地址库来判断用户的归属,然后再制定个协议搭个 connect center 来做调度,然后再对接入层做调度改造。这种方案和 2 种方案一样,不是不能做,只是成本会比较高,尤其对于腾讯这种业务规模如此庞大的公司而言。

三、利用 HttpDNS 解决用户域名解析异常:

既然上面的方案都存在那么多的问题,那有没有一种调度精准、成本低廉、配置方便的基于域名的流量调度系统呢?答案是肯定的。腾讯公司的 GSLB 团队推出了一种全新的域名解析调度系统:HttpDNS。HttpDNS 是为移动客户端量身定做的基于 Http 协议和域名解析的流量调度解决方案,专治 LocalDNS 解析异常以及流量调度不准。详细介绍如下:

(1)HttpDNS 基本原理:

HttpDNS 的原理非常简单,主要有两步:

A、客户端直接访问 HttpDNS 接口,获取业务在域名配置管理系统上配置的访问延迟最优的 IP。(基于容灾考虑,还是保留次选使用运营商 LocalDNS 解析域名的方式)

B、客户端向获取到的 IP 后就向直接往此 IP 发送业务协议请求。以 Http 请求为例,通过在 header 中指定 host 字段,向 HttpDNS 返回的 IP 发送标准的 Http 请求即可。

(2)HttpDNS 优势:

从原理上来讲,HttpDNS 只是将域名解析的协议由 DNS 协议换成了 Http 协议,并不复杂。但是这一微小的转换,却带来了无数的收益:

A、根治域名解析异常:由于绕过了运营商的 LocalDNS,用户解析域名的请求通过 Http 协议直接透传到了腾讯的 HttpDNS 服务器 IP 上,用户在客户端的域名解析请求将不会遭受到域名解析异常的困扰。

B、调度精准:HttpDNS 能直接获取到用户 IP,通过结合腾讯自有专利技术生成的 IP 地址库以及测速系统,可以保证将用户引导的访问最快的 IDC 节点上。

C、实现成本低廉:接入 HttpDNS 的业务仅需要对客户端接入层做少量改造,无需用户手机进行 root 或越狱;而且由于 Http 协议请求构造非常简单,兼容各版本的移动操作系统更不成问题;另外 HttpDNS 的后端配置完全复用现有权威 DNS 配置,管理成本也非常低。总而言之,就是以最小的改造成本,解决了业务遭受域名解析异常的问题,并满足业务精确流量调度的需求。

D、扩展性强:HttpDNS 提供可靠的域名解析服务,业务可将自有调度逻辑与 HttpDNS 返回结果结合,实现更精细化的流量调度。比如指定版本的客户端连接请求的 IP 地址,指定网络类型的用户连接指定的 IP 地址等。

当然各位可能会问:用户将首选的域名解析方式切换到了 HttpDNS,那么 HttpDNS 的高可用又是如何保证的呢?另外不同运营商的用户访问到同一个 HttpDNS 的服务 IP,用户的访问延迟如何保证?

为了保证高可用及提升用户体验,HttpDNS 通过接入了腾讯公网交换平台的 BGP Anycast 网络,与全国多个主流运营商建立了 BGP 互联,保证了这些运营商的用户能够快速地访问到 HttpDNS 服务;另外 HttpDNS 在多个数据中心进行了部署,任意一个节点发生故障时均能无缝切换到备份节点,保证用户解析正常。

四、接入效果及未来展望:

当前 HttpDNS 已在腾讯内部接入了多个业务,覆盖数亿用户,并已持续稳定运行超过一年时间。而接入了 HttpDNS 的业务在用户访问体验方面都有了非常大的提升。以某个接入 HttpDNS 的业务为例,该业务仅通过接入 HttpDNS,在未做任何其它优化的情况下,用户平均访问延迟下降超过 10%,访问失败率下降了超过五分之一,用户访问体验的效果提升非常显著。另外腾讯的 HttpDNS 服务除了在腾讯内部被广泛使用以外,也受到了业务同行的肯定。国内最大的 publicDNS 服务商 114dns 在受到腾讯 DNS 的启发下,也推出了 HttpDNS 服务。

在未来的日子里,腾讯 GSLB 团队将会在腾讯内部进一步推广 HttpDNS 服务,并将在实际业务的需求下对 HttpDNS 服务进行升级,如提供更为通用、安全、简单的接入协议,进一步提升接入用户的网络访问体验等等。希望 HttpDNS 能为各位在解决域名解析异常及全局流量调度失效方面提供一个简单、可行的思路,也欢迎各位业界同行与腾讯一起,就如何进行更精准的全局流量调度方面进行更为深入的讨论!

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...