httpdns是什么
httpdns是面向无线端的域名解析服务,与传统走UDP协议的DNS不同,httpdns基于HTTP协议。
PC端的服务一般通过浏览器访问,对于域名解析,浏览器只会走标准DNS,我们没法干预。无线端的可操作空间比较大,APP自己构造并发送HTTP请求,能够做精细化的控制,其中就包括域名解析。
使用httpdns解析域名的基本流程如下:
- 客户端向httpdns服务端发送普通的HTTP请求,请求中携带需要解析的域名。
- httpdns服务端解析出域名对应的ip地址,将解析结果封装为JSON格式,返回给客户端。
和传统DNS一样,httpdns的解析结果中包含TTL,客户端可以根据TTL将结果缓存一段时间。
httpdns服务包括服务端和客户端SDK,SDK有Android版和iOS版。当前接入httpdns服务的主要是集团内的APP,包括手机淘宝、天猫魔盒、支付宝、云OS、虾米音乐、阿里师生和淘伴等。
httpdns的优势
相比于传统DNS,httpdns的优势主要有下面几点:
- 防止域名劫持
传统DNS由Local DNS解析域名,不同运营商的Local DNS有不同的策略,某些Local DNS可能会劫持特定的域名。采用httpdns能够绕过Local DNS,避免被劫持;另外,httpdns的解析结果包含HMAC校验,也能够防止解析结果被中间网络设备窜改。 - 更精准的调度
对域名解析而言,尤其是CDN域名,解析得到的IP应该更靠近客户端的地区和运营商,这样才能有更快的网络访问速度。然而,由于运营商策略的多样性,其推送的Local DNS可能和客户端不在同一个地区,这时得到的解析结果可能不是最优的。httpdns能够得到客户端的出口网关IP,从而能够更准确地判断客户端的地区和运营商,得到更精准的解析结果。 - 更小的解析延迟和波动
在2G/3G这种移动网络下,DNS解析的延迟和波动都比较大。就单次解析请求而言,httpdns不会比传统的DNS更快,但通过httpdns客户端SDK的配合,总体而言,能够显著降低解析延迟和波动。httpdns客户端SDK有几个特性:预解析、多域名解析、TTL缓存和异步请求。 - 额外的域名相关信息
传统DNS的解析结果只有ip,httpdns的解析结果采用JSON格式,除了ip外,还支持其它域名相关的信息,比如端口、spdy协议等。利用这些额外的信息,APP可以启用或停止某个功能,甚至利用httpdns来做灰度发布,通过httpdns控制灰度的比例。
httpdns如何解析一个域名
httpdns服务端并没有“域名和IP对应关系”的数据库,它做了一次协议转换,从HTTP转换为DNS,将域名解析请求转发给后端DNS。
为了得到更精准的解析结果,后端DNS需要拿到客户端的来源IP,而不是httpdns服务器的IP。如何将客户端IP透传给后端DNS呢?httpdns使用了Google提出的DNS扩展选项edns-client-subnet,通过该选项,可以将客户端IP放在DNS报文中传给后端DNS,只要后端DNS支持该选项,它就会从DNS报文中提取客户端IP。httpdns对接的后端DNS都支持edns-client-sub选项。
httpdns服务端部署在cm3和cm10的两个集群上,总体架构图如上。
具体而言,httpdns服务端的处理过程如下:
- 接收客户端发来的HTTP请求,请求中携带域名列表。
- 解析请求的内容,检查安全校验值,执行白名单过滤,得到待解析的域名列表。
- 针对域名列表中的每一个域名,构造DNS请求报文,发往对应的后端DNS。
- 等待并收集DNS响应报文,解析报文得到IP地址,最后,每个域名都有了解析结果或已经超时。
- 对每个域名,将解析得到的IP,以及在httpdns上配置的其它信息,添加到JSON报文中。
- 根据JSON报文计算HMAC校验值,将校验值和JSON报文发送给客户端。
对于不同类型的域名,httpdns会转给不同的后端DNS。目前,httpdns共有下面3个后端DNS:
- Pharos:权威DNS,对应淘宝CDN域名,例如
gw.alicdn.com
- 。
- ADNS:权威DNS,对应CNAME到
*.gds.taobao.com
- 的淘宝主站域名,例如
api.m.taobao.com
- 。
- AliDNS:递归DNS,阿里公共DNS,对应所有其它的域名,例如
mcgw.alipay.com
- 、
www.baidu.com
- 。