关于httpdns
关于httpdns
背景
在排查视频播放失败的案例中发现,DNS解析失败导致播放失败的占比较高,HTTPDNS可以解决这类问题,所以接入阿里的HTTPDNS。
DNS
https://help.aliyun.com/document_detail/102237.html
http://www.52im.net/thread-2121-1-1.html
https://www.cloudflare.com/zh-cn/learning/dns/dns-server-types/
一次网络请求的过程
- 对www.baidu.com这个网址进行DNS域名解析,得到对应的IP地址
- 根据这个IP,找到对应的服务器,发起TCP的三次握手
- 建立TCP连接后发起HTTP请求
- 服务器响应HTTP请求,浏览器得到html代码
- 浏览器解析html代码、资源文件,对页面进行渲染呈现给用户
- 服务器关闭关闭TCP连接
DNS简介
域名(Domain Name,Domain) 是一个在互联网上标识主机或主机组的名称,相当于 IP 地址的别名,相对于难记的 IP 地址,域名更显得易于记忆。
域名系统(Domain Name System,DNS) 则是将域名解析 IP 地址的一项互联网基础服务,提供该服务的服务器称为 域名服务器(Domain Name Server)。
DNS解析过程
本地域名服务器(Local Name Server,local DNS):local DNS 由互联网服务提供商(ISP,如联通、电信)提供;
根域名服务器(Root Name Server):当 local DNS 查询不到解析结果时,第一步会向它进行查询,并获取顶级域名服务器的IP地址。全球一共有 13 个根域名服务器(除了它们的镜像),它们并不直接用于域名解析,仅用于指出可查询的顶级域名服务器。
顶级域名服务器(Top-level Name Server):负责管理在该顶级域名服务器下注册的二级域名,例如:**.com 顶级域名服务器**,而 baidu.com
权威服务器是注册在 .com 的权威域名服务器;
权威域名服务器(Authoritative Name Server):最终决定域名解析结果的服务器,开发者可以在权威DNS上配置、变更、删除具体域名的对应解析结果信息。域名注册服务商(阿里、腾讯等等)
下面以查询www.baidu.com为例,阐述一次 DNS 解析过程:
- 0、客户端需要向 local DNS 发送查询请求报文
- 1、客户端向 local DNS 发送查询报文 query www.baidu.com,local DNS 首先检查自身缓存,如果存在记录则直接返回结果,查询结束;如果缓存老化或未命中,则:
- 2、local DNS 向根域名服务器发送查询报文 query www.baidu.com,返回 .com 顶级域名服务器的地址
- 3、local DNS 向 .com 顶级域名服务器发送查询报文 query www.baidu.com,返回baidu.com所在的权威域名服务器的地址
- 4、local DNS 向 baidu.com 权威域名服务器发送查询报文 query www.baidu.com,得到 ip 地址,存入自身缓存并返回给客户端
DNS存在的问题
查询延时
从上面可以看到一次完整的 DNS 查询过程需要查询很多次,访问多台 DNS 服务器才能得到最终的结果,这肯定会带来一定的延时
缓存一致性
一次完整的 DNS 查询过程需要访问多台 DNS 服务器才能得到最终的结果,这肯定会带来一定的时延。为了改善时延,DNS 服务并不是每次请求都要去访问 DNS 服务器,而是访问过一次后将 DNS 记录缓存在本地。具体来说,DNS 服务是一个多级的缓存:
浏览器缓存 -> 操作系统缓存 -> 路由器缓存 -> local DNS 缓存 -> DNS 查询
DNS 请求域名服务器时返回应答报文中有个 TTL(Time to Live)值,它决定了 DNS 记录在缓存中的有效时间。单位:秒
dns在线查询
DNS 缓存的存在虽然减少了时延,却是以牺牲一致性(consistency)为代价的。具体来说:Local DNS 是分地区、分运营商的,在域名解析缓存的处理上,实现策略就不统一了。有时候 Local DNS 的解析结果 可能不是最近、最优的节点,有的时候并不会遵从 TTL 的限制,而是设置一个固定时间。这就会导致域名指向新的 IP 地址后,一些客户端依然访问了缓存中 旧的 IP 地址****。
攻击者可以通过 DNS 劫持,利用 DNS 的缓存机制不对应答数据做检查的漏洞,诱骗 DNS 服务器缓存较大 TTL 的虚假 DNS 记录,从而长期欺骗客户端。
DNS劫持(中间人攻击)
你需要知道的“DNS劫持”–web安全篇(1) - 掘金 (juejin.cn)
https://help.aliyun.com/document_detail/62842.htm?spm=a2c4g.435323.0.0.255248d1YSSQxp
由于 DNS 缺乏 加密、认证、完整性保护的安全机制,容易引发网络完全问题。最常见的域名劫持攻击是针对 DNS 报文首部的 事务 ID 进行欺骗,由于事务 ID 在查询报文和应答报文中是匹配的,因此伪装 DNS 服务器可以提前将事务 ID 相同的伪造报文发送到客户端,以实现域名劫持,把目标网站域名解析到错误的 IP 地址。
DNS劫持或DNS污染是一种恶意的网络攻击,其目的是将用户的DNS请求重定向到第三方的站点,从而引导用户进入恶意站点或展示广告等。这种行为通常是由ISP等在网络环节中的中间人所进行,因此称之为中间人攻击。
需要注意的是,有些广告提供商可能会通过向DNS服务器发送虚假的DNS查询请求来模拟用户域名解析的行为,从而将广告注入到用户的DNS访问过程中。因此,在使用DNS服务时,建议使用安全可靠的DNS服务器,如8.8.8.8(Google DNS)、114.114.114.114(114DNS)等。
调度不精准
权威的 DNS 服务器可能会误判客户端所在的位置和运营商,从而导致解析出跨运营商访问的 IP 地址,用户的访问速度降低。
还有是一种是运营商的LocalDNS还存在解析转发的现象。解析转发是指运营商自身不进行域名递归解析,而是把域名解析请求转发到其它运营商的递归DNS上的行为。
正常的LocalDNS递归解析过程是这样的:
而部分小运营商为了节省资源,就直接将解析请求转发到了其它运营的递归LocalDNS上去了:
这样的直接后果就是腾讯权威DNS收到的域名解析请求的来源IP就成了其它运营商的IP,最终导致用户流量被导向了错误的地方,用户访问变慢。
HTTPDNS
https://help.aliyun.com/document_detail/435220.html?spm=a2c4g.435221.0.0.194c29ec4zFiKi
https://www.alibabacloud.com/help/zh/httpdns/latest/resolve-a-domain-name
为什么DNS使用UDP而不是TCP? - 知乎 (zhihu.com)
https://developer.aliyun.com/article/769831
HTTPDNS是面向多端应用(移动端APP,PC端应用)的域名解析服务,使用HTTP协议进行域名解析,代替现有基于UDP的DNS协议,域名解析请求直接发送到HTTPDNS服务端,从而绕过运营商的Local DNS,如下图所示:
优势
域名防劫持
使用HTTP(HTTPS)协议进行域名解析,域名解析请求直接发送至HTTPDNS服务器,绕过运营商Local DNS,避免域名劫持问题
降低时延
缩短了查询链路,不像 DNS 查询那样需要访问多台 DNS 服务器才能得到最终的结果
调度精准
由于 DNS 服务器端获取的是真实客户端 IP 而非 Local DNS 的 IP,能够精确基于客户端位置、运营商信息,获得最精准的解析结果,让客户端就近接入业务节点
快速生效
域名解析结果变更时,HTTPDNS 服务没有传统DNS 服务多级缓存的影响,域名更新能够更快地覆盖到全量客户端。
项目集成
配置
https://pre-bookadmin.xesvip.cn/platform/generalSettings/configSet?id=8
通过云控配置,自营域名支持httpdns解析,播放器暂不支持,大概2.9支持
1 |
|
降级容灾策略
- 接口失败:请求阿里云HTTPDNS更新IP,如果还是失败,清除缓存走系统dns
- 定时更新:打开APP更新、根据配置的ip_update_duration APP自动更新
- 更新云控:通过修改配置文件、关闭开关降级,使用系统 dns
总结
HTTPDNS 利用 HTTP 协议与 DNS 服务器交互,代替了传统的基于 UDP 协议的 DNS 交互,绕开了运营商的 Local DNS,有效防止了域名劫持,提高域名解析效率。另外也减少了平均访问的的延迟、降低了用户连接的失败率。后期观察效果好的话,可以推广所有域名使用。
扩展阅读
httpdns对比dns有什么优势,集成httpdns有什么意义 还做了本地缓存,就是0延时
httpdns到底快了多少 httpdns 1毫秒 dns 10毫秒 快了10倍
HTTPDNS服务通常是通过客户端的网络请求获取客户端IP地址的。当客户端发起网络请求时,HTTPDNS服务可以通过提取请求中的IP地址信息来获取客户端IP地址。
具体来说,当客户端向服务器发送网络请求时,请求中通常会包含客户端的IP地址信息。这个信息可能包含在请求头中的”X-Forwarded-For”字段或者”Remote Address”字段中。HTTPDNS服务可以通过解析这些字段来获取客户端IP地址,并根据客户端IP地址来进行精准的域名解析和调度。
需要注意的是,客户端IP地址可能会被代理服务器等中间设备篡改,因此HTTPDNS服务在获取客户端IP地址时需要对异常情况进行处理,以保证获取到的IP地址是正确的。