[趣谈网络协议学习] 19 HTTPDNS:网络世界的地址簿也会指错路

传统 DNS 存在哪些问题?

1. 域名缓存问题

  • 实际数据与缓存数据不同,导致访问到错误数据
  • 数据没问题但是距离不是最近的,访问时绕远路,使得全局负载均衡失败

2. 域名转发问题

A 运营商的客户,访问自己运营商的 DNS 服务器,如果 A 运营商去权威 DNS 服务器查询的话,权威 DNS 服务器知道你是 A 运营商的,就返回给一个部署在 A 运营商的网站地址,这样针对相同运营商的访问,速度就会快很多。

但是如果A 运营商偷懒,将解析的请求转发给 B 运营商,B 运营商去权威 DNS 服务器查询的话,权威服务器会误认为,你是 B 运营商的,那就返回给你一个在 B 运营商的网站地址,结果客户的每次访问都要跨运营商,速度就会很慢

3. 出口 NAT 问题

做了网络地址的转换,权威的 DNS 服务器,就没办法通过这个地址,来判断客户到底是来自哪个运营商,而且极有可能因为转换过后的地址,误判运营商,导致跨运营商的访问。

4. 域名更新问题

本地 DNS 服务器,对域名解析缓存的处理上,实现策略有区别,有的会偷懒,忽略域名解析结果的 TTL 时间限制,权威 DNS 服务器解析变更的时候,解析结果在全网生效的周期非常漫长,就会导致访问异常(可能还是访问到变更前的权威 DNS 服务器解析)

5. 解析延迟问题

DNS 的查询过程需要递归遍历多个 DNS 服务器,才能获得最终的解析结果,这会带来一定的时延,甚至会解析超时。

HTTPDNS 的工作模式

HTTPNDS 其实就是,不走传统的 DNS 解析,而是自己搭建基于 HTTP 协议的 DNS 服务器集群,分布在多个地点和多个运营商。当客户端需要 DNS 解析的时候,直接通过 HTTP 协议进行请求这个服务器集群,得到就近的地址。

相当于每家基于 HTTP 协议,自己实现自己的域名解析,自己做一个自己的地址簿,而不使用统一的地址簿。

使用 HTTPDNS 需要绕过默认的 DNS 路径,就不能使用默认的客户端,需要在手机端嵌入支持 HTTPDNS 的客户端 SDK。通过自己的 HTTPDNS 服务器和自己的 SDK,自己实现自己的域名解析。

HTTPDNS 的工作模式:

  1. 在客户端的 SDK 里动态请求服务端,获取 HTTPDNS 服务器的 IP 列表,缓存到本地。SDK 也会在本地缓存 DNS 域名解析的结果。
  2. 当手机应用要访问一个地址的时候,首先看是否有本地的缓存。
  3. 如果有就直接返回。这个缓存是手机应用自己做的,而非整个运营商统一做的,如何更新、何时更新,手机应用的客户端可以和服务器协调来做。
  4. 如果本地没有,就需要请求 HTTPDNS 的服务器,在本地 HTTPDNS 服务器的 IP 列表中,选择一个发出 HTTP 的请求,会返回一个要访问的网站的 IP 列表。

手机客户端知道手机在哪个运营商、哪个地址。由于是直接的 HTTP 通信,HTTPDNS 服务器能够准确知道这些信息,因而可以做精准的全局负载均衡。

HTTPDNS 的工作模式
当所有这些都不工作的时候,可以切换到传统的 LocalDNS 来解析,慢也比访问不到好。

HTTPDNS 是如何解决上面传统 DNS 存在的问题呢?

其实归结起来就是两大问题。一是解析速度和更新速度的平衡问题,二是智能调度的问题,对应的解决方案是 HTTPDNS 的缓存设计和调度设计。

HTTPDNS 的缓存设计

解析 DNS 过程复杂,通信次数多,对解析速度造成很大影响。为了加快解析,因而有了缓存,但是这又会产生缓存更新速度不及时的问题。并且解析和缓存都掌握在别人手中,也即本地 DNS 服务器手中,它不会为你定制。

HTTPDNS 就是将解析速度和更新速度全部掌控在自己手中。

  1. 一方面,解析的过程,不需要本地 DNS 服务递归地调用一大圈,而是通过HTTP 的请求直接搞定。
  2. 另一方面,为了提高解析速度,本地也有缓存,缓存是在客户端 SDK 维护的,过期时间、更新时间,都可以自己控制。

HTTPDNS 的缓存设计策略也是咱们做应用架构中常用的缓存设计模式,也即分为客户端、缓存、数据源三层。

  • 对于应用架构来讲,就是应用、缓存、数据库。常见的是 Tomcat、Redis、MySQL。
  • 对于 HTTPDNS 来讲,就是手机客户端、DNS 缓存、HTTPDNS 服务器。

HTTPDNS 的缓存设计
只要是缓存模式,就存在缓存的过期、更新、不一致的问题,可以采用同步更新和异步更新解决。

  • 同步更新也就是直接调用 HTTPDNS 的接口,返回最新的记录,更新缓存
  • 异步更新添加一个解析任务到后台,由后台任务调用 HTTPDNS 的接口

HTTPDNS 的调度设计

由于客户端嵌入了 SDK,因而就不会因为本地 DNS 的各种缓存、转发、NAT,让权威 DNS 服务器误会客户端所在的位置和运营商,而可以拿到第一手资料。

  • 客户端嵌入了 SDK,可知道手机的地理位置、运营商。
  • 客户端的 SDK 会收集手机网络请求数据,如错误率、请求时间等,发送到统计后台,查看不同 IP 的服务质量。
  • 在服务端,应用可通过调用 HTTPDNS 的管理接口,配置不同服务质量的优先级、权重。

HTTPDNS 的调度设计

参考资料:

趣谈网络协议(极客时间)链接:
http://gk.link/a/106nW


GitHub链接:
https://github.com/lichangke/LeetCode
知乎个人首页:
https://www.zhihu.com/people/lichangke/
CSDN首页:
https://me.csdn.net/leacock1991
欢迎大家来一起交流学习

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值