计算机网络-DNS和HTTPDNS

使用 HTTPDNS 替代 DNS

Posted by liz on August 26, 2022

DNS 和 HTTPDNS

DNS

用户与互联网中的某台主机通信的时,必须知道对方的 IP 地址,然而用户很难记住长达 32 位的 IP 二进制主机地址,即使是点分十进制的 IP 地址也是不太容易记忆。为了方便记忆,引入了域名系统,用来便于人们使用的机器名字转换成 IP 地址。

域名和 IP 地址的映射关系就是记录在 DNS 服务器中的。

域名解析的过程

  • 主机向本地域名服务器的查询采⽤递归查询。如果本地域名服务器不能解析域名的 IP 地址,本地域名服务器就以 DNS 客户的身份,向根域名服务器发出查询请求报⽂;

  • 本地域名服务器向根域名服务器的查询采⽤迭代查询。当根域名服务器收到本地域名服务器的迭代查询请求报⽂时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“你下⼀步应当向哪⼀个域名服务器进⾏查询”。

tcp

这里首先来看几个重要的概念

根域名服务器

根域名服务器是最高层次,最重要的域名服务器。根域名服务器知道所有的顶级域名服务器的域名和 IP 地址。本地域名服务器要对互联⽹上任何⼀个域名进⾏解析,如果⾃⼰⽆法解析,⾸先求助根域名服务器。

顶级域名服务器

这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到 DNS 查询请求时,就给出相应的回答(可能是最后的结果,也可能是下一步应当查找的域名服务器的 IP 地址)

权限域名服务器

负责一个区的域名服务器,当一个权限域名服务器,还不能给出最后的查询回答时,就会告诉发出请求的 DNS 客户端,下一步应当找哪个权限域名服务器。

本地域名服务器

当一个主机发出 DNS 查询的时候,首先就是发送给本地域名服务器。每一个互联网提供者 ISP ,或者一个大学都可以有自己的本地域名服务器。

如果是通过DHCP配置,本地 DNS 由你的网络服务商(ISP),如电信、移动等自动分配,它通常就在你网络服务商的某个机房。

来看下查询的步骤

1、主机向本地域名服务器查询 www.tsinghua.edu.cn 的 IP 地址,这一步是递归查询;

2、本地域名服务器会在自己的服务器中查找对应的域名映射关系,如果找了直接返回 IP 地址,没有就会询问根域名服务器;

3、根域名服务器会告诉本地域名服务器,下一次查询的顶级域名服务器的 IP 地址;

4、本地服务器继续向顶级域名服务器发起查询请求;

5、顶级域名服务器找到了就返回结果,如果没找到就会告诉本地域名服务器,下一次查询的权限域名服务器的 IP 地址;

6、本地服务器继续向权限域名服务器发起查询请求;

7、权限域名服务器会告诉本地域名服务器,查询的主机 IP 地址,当一个权限域名服务器,还不能给出最后的查询回答时,就会告诉发出请求的 DNS 客户端,下一步应当找哪个权限域名服务器;

8、本地域名服务器最终把查询结果返回给主机,主机就能和目标建立连接了。

传统 DNS 存在的问题

1、域名缓存问题

会在本地做一个缓存,这样就不用每一个请求都去请求权威 DNS 服务器,当再次访问直接拿取本地的缓存即可。

既然是有缓存,就会存在缓存同步不及时的情况,这样一些请求就会发送到旧的页面。

再就是本地的缓存,往往使得全局负载均衡失败,因为上次进行缓存的时候,缓存中的地址不一定是这次访问离客户最近的地方,如果把这个地址返回给客户,那肯定就会绕远路。

2、域名转发问题

经过域名转发,域名查询可能会跨运营商。

栗如:

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

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

3、出口 NAT 问题

我们知道,网络出口的时候,很多机房都会配置NAT,也即网络地址转换,使得从这个网关出去的包,都换成新的IP地址。NAT不仅能解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。当然请求返回的时候,在这个网关,再将IP地址转换回去,所以对于访问来说是没有任何问题。

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

4、DNS 域名更新问题

本地DNS服务器是由不同地区、不同运营商独立部署的。对域名解析缓存的处理上,实现策略也有区别,有的会偷懒,忽略域名解析结果的TTL时间限制,在权威DNS服务器解析变更的时候,解析结果在全网生效的周期非常漫长。但是有的时候,在DNS的切换中,场景对生效时间要求比较高。

例如双机房部署的时候,跨机房的负载均衡和容灾多使用DNS来做。当一个机房出问题之后,需要修改权威DNS,将域名指向新的IP地址,但是如果更新太慢,那很多用户都会出现访问异常。

5、解析延迟问题

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

6、运营商劫持

本地运营商可能对某些域名进行劫持、屏蔽。

DNS劫持就是劫持 DNS 服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原 IP 地址转入到修改后的指定 IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。

HTTPDNS

因为传统的 DNS 存在上面的一些问题,所以这里引出了 HTTPDNS。

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

同时因为默认的域名解析都是走 DNS 的,使用 HTTPDNS 需要绕过默认的 DNS 路径,所以使用 HTTPDNS 的,大多数是手机应用,需要在手机端嵌入支持 HTTPDNS 的客户端 SDK。

HTTPDNS 的优点

1、跳过 LocalDNS,防止本地 DNS 劫持;

2、直接通过 IP 访问,平均访问延迟下降;

3、服务器算法筛选最佳节点 IP,提升请求成功率;

4、快速更换 IP(不受 TTL 的限制)。

HTTPDNS 的适用场景

1、App 防止恶意劫持;

2、对访问速度要求高的应用;

3、应用、视频加速服务,配合 CDN,通过 DNS 服务器返回最佳节点,提高访问效率;

4、提供更灵活的流量调度能力。

HTTPDNS 的工作模式

1、在客户端的 SDK 里动态请求服务端,获取 HTTPDNS 服务器的IP列表,缓存到本地。随着不断地解析域名,SDK 也会在本地缓存 DNS 域名解析的结果;

2、当手机应用要访问一个地址的时候,首先看是否有本地的缓存,如果有就直接返回,没有就请求 HTTPDNS 服务器;

2、请求 HTTPDNS 的服务器,HTTPDNS 的服务器都会提供 api 接口,选择对应的接口发出接口请求,会返回一个要访问的网站的 IP 列表;

3、客户端,收到返回的 IP 列表,就能选择 IP ,建立连接,发起正常访问操作;

4、若客户端向 HttpDNS 服务器请求失败,则启用备选,走正常 DNS 解析过程,向 Local DNS 发起请求;

5、LocalDNS 进行递归查询;

6、最终返回 DNS 结果;

7、客户端拿到最优 IP 后,建立连接,发起正常访问操作。

总结

1、传统的DNS有很多问题,例如解析慢、更新不及时。因为缓存、转发、NAT 问题导致客户端误会自己所在的位置和运营商,从而影响流量的调度。

2、HTTPDNS 通过客户端 SDK 和服务端,通过 HTTP 直接调用解析 DNS 的方式,绕过了传统 DNS 的这些缺点,实现了智能的调度。

参考

【极客时间-趣谈网络协议】https://time.geekbang.org/column/intro/100007101
【计算机网络第八版】https://www.bilibili.com/video/BV1WP4y1j7JU?p=1
【计算机网络学习笔记】https://github.com/boilingfrog/Go-POINT/tree/master/tcp
【全面理解DNS及HTTPDNS】https://juejin.cn/post/6844903987796246542