DNS(Domain Name System):全称域名系统,它是 TCP/IP 模型中应用层协议,可以把它看做域名和 IP 地址相互映射的分布式数据库,通过它实现主机名(域名)到具体 IP 地址间的映射,方便用户访问互联网
DNS 采用分布式设计方案,其域名空间采用如下图所示树状结构:
- 根域名服务器:最顶层服务器,在因特网上有13个,大部分位于北美洲
- 顶级域名服务器:第二层服务器,这些服务器主要负责记录顶级域名和国家级域名
- 权威域名服务器:第三层服务器,主要记录因特网上公共可访问主机所在组织机构提供的 DNS 记录
除上述三类服务器外,用户想要访问因特网还离不开本地 DNS 服务器:每个网络服务提供商都包含一台本地服务器,当主机接入网络服务商后,网络服务商提供该主机 IP 地址。之后当主机发起 DNS 请求后,该请求会被发送到本地 DNS 服务器,本地 DNS 服务器起到代理的功能,通过它将请求转发到 DNS 分布式服务器架构
下面我通过一次 DNS 全过程介绍具体处理逻辑:
- 用户通过浏览器访问 ip 地址:www.abc.com
- 用户主机向本地域名服务器发送 DNS 查询报文
- 本地域名服务器首先在自身数据库查询,绝大多数域名对应 ip 在这里查到,查不到时将请求转发至 根域名服务器
- 根域名服务器根据后缀 .com 将负责 .com 的顶级域名服务器 IP 地址返回本地域名服务器
- 本地域名服务器再向顶级域名服务器发送 DNS 查询报文
- 顶级域名服务器根据 abc 将对应的权威域名服务器 IP 地址返回本地域名服务器
- 本地域名服务器向权威域名服务器发送请求报文,至此得到 www.abc.com 的实际 IP 地址
- 浏览器根据实际 IP 发送 HTTP 报文,拿到响应结果,刷新页面
通常情况下 顶级域名服务器 并不知道所有 权威域名服务器 的 IP 地址,只知道中间某个服务器地址,此处可能经过多次访问后才能拿到具体 权威域名服务器 地址
整个过程中,对于用户主机来说,只需和 本地 DNS 服务器打交道即可,本地 DNS 服务器分别和 DNS 分布式域名体系中的各个服务器交互,最终将实际 IP 拿回,并将结果保存在本地 DNS 服务器,方便快速响应用户下次访问
DNS 协议在传输层分别用到 TCP 和 UDP,两者使用的场景分别如下:
- TCP:当进行区域传输,主域名服务器同步数据给辅助域名服务器时采用 TCP,因为此时需要交互的数据量大,TCP 允许的报文长度更高,更安全
- UDP:平常查询域名对应 IP 采用 UDP,此时报文小,UDP 不需要三次握手,响应速度更快,但需要域名服务器自身处理超时重传保证可靠
辅助域名服务器:类似集群,每个区域的域名服务器一般不只一台,因为一旦它挂了区域内所有主机都无法正常访问网页。采用主从的方式同步数据,一旦主机挂机或相应慢可以更换机器,保证用户体验
总得来说具体使用哪种协议还是根据数据报大小以及效率考虑,域名解析一旦打到根域名服务器就有点像大海捞针,采用 TCP 不知道要经过多少次三次握手,这种情况下效率简直不敢估算
最后我简单介绍下 DNS 劫持:攻击者冒充原域名所属机构,通过电子邮件等方式恶意修改域名信息,并将新的域名信息保存在指定区域的 DNS 服务器,从而使一定范围内用户无法正常访问目的地址,转而访问黑客设计的木马网站
一般情况下黑客只能修改某一片区域内的域名服务器,使域名指向其它 ip 地址,对于用户来说可以通过 IP 直连的方式或通过网络设置让 DNS 指向正常的域名服务器的方式解决问题