DNS解析是用户访问互联网的第一步,如果这一步产生了较大的网络延迟、故障甚至是数据错误,则会严重影响用户体验。如上文所述,DNS有很多优势,但是它也存在一些问题(见1.3.1节)。业界很多互联网公司都尝试去解决这些问题,比如腾讯、字节跳动、百度等公司已经给出了较为成熟的解决方案:HTTP DNS。
1.3.1 DNS存在的问题
这里介绍一下DNS存在哪些问题。
- 首先,域名解析需要进行递归查询,这势必会带来更高的访问延迟。在理想的情况下,DNS解析只需要几毫秒或者几十毫秒就完成了,但是在实际应用中常常有1s以上的情况出现。
- 其次,由于本地域名服务器是分地区、分运营商的,不同运营商实现的DNS解析策略不同。而且,由于权威域名服务器获取的是本地域名服务器的IP地址,而非客户端的IP地址,所以在定位客户端地理位置时不一定准确,最终域名解析得到的IP地址对于客户端而言可能不是距离最近、最优的访问节点。更有甚者,某些运营商为了节约资源,会直接将域名解析请求转发到其他运营商的本地域名服务器(即"域名转发"),这样做的后果就是用户得到了与其网络运营商不相符的IP地址,用户访问网络请求变慢。
- 最后,更重要的是DNS劫持问题。DNS劫持是一种互联网攻击方式,通过干预域名服务器把域名解析到错误的IP地址上,以达到用户无法访问目标网站或访问恶意网站的目的。很多知名的互联网公司备受DNS劫持的困扰,运营商可能基于本地域名服务器做DNS劫持,黑客可能篡改计算机Hosts文件做DNS劫持。
大家可能都有这样的经历:在浏览一个正常的网站时,左下角总会弹出各种与网站内容画风格格不入的垃圾广告,这很可能就是运营商DNS劫持的结果,尤其是那些一味追求广告收入的小运营商。运营商DNS劫持危害不大,至多是影响用户访问互联网的体验, 但如果是黑客做DNS劫持,那么用户很有可能会被引导到竞争对手的网站,甚至是危害用户安全的钓鱼网站。很多知名的互联网公司长期被DNS劫持攻击,比如腾讯公司在2014年的一个技术分享中透露,腾讯域名在全国各地的日解析异常量已经超过80万条,给腾讯公司的各业务带来巨大损失。
1.3.2 HTTP DNS的原理
HTTP DNS是基于HTTP,具有DNS解析能力的网络服务。HTTP DNS的原理非常简单:
- 客户端指定HTTP DNS服务器的IP地址(如
5.5.5.5
),使用HTTP调用域名解析接口/d,并传入待解析的域名和客户端的IP地址。HTTP DNS服务器负责向权威DNS服务器发起域名解析请求,并将最优IP地址返回。 - 客户端获取到域名IP地址后,直接向此IP地址发送业务协议请求。如果客户端 需要访问业务请求
http://go.friendy.com/feed
,则在HTTP header中指定Host字段为此IP地址即可。
图1-5展示了 HTTP DNS解析过程,并与域名解析过程做了简单的对比。

需要注意的是,HTTP DNS服务器不通过域名提供服务(否则又需要域名解析),只通过一个固定的IP地址提供服务。这里读者可能会有疑问:不同网络运营商的用户访问同一个HTTP DNS服务的IP地址,用户访问延迟问题如何解决?高可用性如何保证?
实际上,HTTP DNS服务提供商会采用如BGP (边界网关协议)等手段让这个IP地址在全国各地都做到就近访问。以腾讯云HTTP DNS产品为例:
- 它接入了BGP Anycast网络架构,与全国最主要的17个运营商建立了BGP互联,确保各个运营商的用户都能快速访问到HTTP DNS服务器;
- 同时,腾讯云在多个数据中心部署了多个HTTP DNS服务节点,任意节点发生故障均可无缝切换到备用节点,保证了HTTP DNS服务的高可用。
感兴趣的读者可以在腾讯云官网了解更多技术细节。
HTTP DNS只是将域名解析协议由DNS协议换成了HTTP,原理并不复杂。但是相较于DNS,这一微小的变化带来了如下好处。
- 降低域名解析延迟:通过直接访问HTTP DNS服务器,缩短了域名解析链路,不再需要递归查询。
- 防止域名劫持:将域名解析请求直接通过IP地址发送至HTTP DNS服务器,绕过运营商本地DNS服务器,避免了域名劫持问题。
- 调度精准性更高:HTTP DNS服务器获取的是真实客户端的IP地址,而不是本地DNS服务器的IP地址,即能够基于精确的客户端位置、运营商信息,将域名解析到更精准的、距离更近的IP地址,让客户端就近接入后台服务节点。
- 快速生效:当与域名关联的IP地址发生变更时,HTTP DNS服务不受传统DNS技术多级缓存的影响,域名更新能够更快地覆盖到全量客户端。
1.3.3 HTTP DNS实践
虽然HTTP DNS有诸多优势,但是我们并不能认为它可以完全取代DNS。鉴于域名解析的重要性,客户端网络SDK在实现接入机房的逻辑时应该设计足够强大的容灾策略,尽力保证域名解析的可用性。
- 客户端使用HTTP DNS尝试解析域名。
- 如果HTTP DNS服务器返回空数据或者网络错误,那么客户端继续向本地DNS服务器发起域名解析请求,即降级到使用DNS技术。
- 如果DNS解析也遭遇失败,那么客户端将直接使用预留的域名兜底IP地址作为域名解析结果。我们可以通过客户端约定写死或服务端下发配置的方式为业务核心域名设置对应的兜底IP地址。访问兜底IP地址意味着可能增加用户请求延迟,但是至少能保证用户不会被域名解析挡在门外。
另外,在HTTP DNS的实践中可以引入如下策略。
- 安全策略:HTTP DNS是基于标准的HTTP的,为了保证数据安全,可以更进一步使用HTTPS。
- IP地址选取策略:HTTP DNS服务可以将最优IP地址按照顺序多个下发,客户端默认选取第一个IP地址优先校验连通性,如果连通性不佳,则再选取下一个IP地址。
- 批量拉取策略:在客户端应用冷启动或网络切换(如将Wi-Fi切换到蜂窝网络)时,客户端自动批量拉取域名和IP地址列表的映射数据并缓存,以便在后续请求中使用,预期提升精准调度能力和域名解析性能。
总结
DNS的缺点?
- 首先,域名解析需要进行递归查询,这势必会带来更高的访问延迟。在理想的情况下,DNS解析只需要几毫秒或者几十毫秒就完成了,但是在实际应用中常常有1s以上的情况出现。
- 其次,由于本地域名服务器是分地区、分运营商的,不同运营商实现的DNS解析策略不同。而且,由于权威域名服务器获取的是本地域名服务器的IP地址,而非客户端的IP地址,所以在定位客户端地理位置时不一定准确,最终域名解析得到的IP地址对于客户端而言可能不是距离最近、最优的访问节点。更有甚者,某些运营商为了节约资源,会直接将域名解析请求转发到其他运营商的本地域名服务器(即"域名转发"),这样做的后果就是用户得到了与其网络运营商不相符的IP地址,用户访问网络请求变慢。
- 最后,更重要的是DNS劫持问题。DNS劫持是一种互联网攻击方式,通过干预域名服务器把域名解析到错误的IP地址上,以达到用户无法访问目标网站或访问恶意网站的目的。很多知名的互联网公司备受DNS劫持的困扰,运营商可能基于本地域名服务器做DNS劫持,黑客可能篡改计算机Hosts文件做DNS劫持。
什么是DNS劫持?
- DNS劫持是一种互联网攻击方式,通过干预域名服务器把域名解析到错误的IP地址上,以达到用户无法访问目标网站或访问恶意网站的目的。
HTTP DNS的原理?
- 客户端指定HTTP DNS服务器的IP地址(如
5.5.5.5
),使用HTTP调用域名解析接口/d,并传入待解析的域名和客户端的IP地址。HTTP DNS服务器负责向权威DNS服务器发起域名解析请求,并将最优IP地址返回。 - 客户端获取到域名IP地址后,直接向此IP地址发送业务协议请求。如果客户端 需要访问业务请求
http://go.friendy.com/feed
,则在HTTP header中指定Host字段为此IP地址即可。
HTTP DNS的优势?
- 降低域名解析延迟:通过直接访问HTTP DNS服务器,缩短了域名解析链路,不再需要递归查询。
- 防止域名劫持:将域名解析请求直接通过IP地址发送至HTTP DNS服务器,绕过运营商本地DNS服务器,避免了域名劫持问题。
- 调度精准性更高:HTTP DNS服务器获取的是真实客户端的IP地址,而不是本地DNS服务器的IP地址,即能够基于精确的客户端位置、运营商信息,将域名解析到更精准的、距离更近的IP地址,让客户端就近接入后台服务节点。
- 快速生效:当与域名关联的IP地址发生变更时,HTTP DNS服务不受传统DNS技术多级缓存的影响,域名更新能够更快地覆盖到全量客户端。
HTTP DNS实践经验?
- 客户端使用HTTP DNS尝试解析域名。
- 如果HTTP DNS服务器返回空数据或者网络错误,那么客户端继续向本地DNS服务器发起域名解析请求,即降级到使用DNS技术。
- 如果DNS解析也遭遇失败,那么客户端将直接使用预留的域名兜底IP地址作为域名解析结果。我们可以通过客户端约定写死或服务端下发配置的方式为业务核心域名设置对应的兜底IP地址。访问兜底IP地址意味着可能增加用户请求延迟,但是至少能保证用户不会被域名解析挡在门外。
在HTTP DNS的实践中可以加入哪些策略?
- 安全策略:HTTP DNS是基于标准的HTTP的,为了保证数据安全,可以更进一步使用HTTPS。
- IP地址选取策略:HTTP DNS服务可以将最优IP地址按照顺序多个下发,客户端默认选取第一个IP地址优先校验连通性,如果连通性不佳,则再选取下一个IP地址。
- 批量拉取策略:在客户端应用冷启动或网络切换(如将Wi-Fi切换到蜂窝网络)时,客户端自动批量拉取域名和IP地址列表的映射数据并缓存,以便在后续请求中使用,预期提升精准调度能力和域名解析性能。