【搞基础系列】网络篇-DNS和HttpDns

image

写作原因


搞基础系列是以 自身的学习和工作经验为出发点做的一些知识点总结,力求构建自己的知识体系网络,不求面面俱到,只要重点突破。

什么是DNS


DNS,即域名系统。在现在的网络体系中,任何一个端系统都是通过一个ip地址进行标记
的,目前常用额ipv4地址默认是32位,一般情况下采用点分十进制进行表示192.168.0.1
问题来了,这么一个数字不好记忆,比如你打开浏览器,想访问百度,你就要记住百度的ip地址61.135.169.125,记住这一连串数字实际上是有些反人类的。所以我们用一个更加符合人类思维的方式去访问百度,直接在浏览器输入www.baidu.com,相比于数字,这一串单词更加容易被记忆,这就是主机名(这里主机名其实可以和域名划等号)。路由器喜欢定长的有层次结构的ip地址,而人类喜欢记忆主机名,那么域名系统就是为此提供了一个折中方案。域名系统主要提供了一种主机名到ip地址的转换的目录服务。

DNS提供的其他服务


DNS是一个客户端-服务器模式的应用层协议,通常采用UDP作为传输层协议,并且运行在53端口,主要提供了一种主机名到ip地址的转换的目录服务。除此之外,基于这个功能,还有一些其他服务。

1.为主机设置别名

一台主机可能有多个域名绑定到这个主机的ip地址,假设www.baidu.com和www.baidu1.com都可以访问到61.135.169.125,www.baidu.com是这个主机的规范主机名,那么www.baidu1.com就是这个主机的别名,有的别名相对于规范主机名更好记忆,DNS可以提供别名到规范主机名和ip地址的映射。

2.邮件服务器别名

原理同为主机设置别名差不多,就不多说了。

3.负载分配

一个站点(比如baidu.com)可能恩不在多台服务器上,每台服务器运行在不同的端系统上,每个都有着不同的ip地址。因此这个主机名关联了一个ip地址集合。当客户端发起域名解析请求时,DNS服务器返回相对应的ip地址集合响应,但是每个应答中循环这些地址次序,因为客户端通常总是将ip地址集合中最前面的那个服务器发送请求,所以这样DNS就实现了负载分配。

工作原理


组织形式

DNS没有采用单点式的存储方式,主要有一下这么几点

1.单点容易发生故障

2.通信容量受限,因为要处理所有DNS请求

3.远距离的集中式数据库,将导致超长延时

4.难以维护。

DNS采用的分布式多层次数据库

image

大致来说,总共有三种类型的DNS服务器:根DNS服务器,顶级域DNS服务器,权威域DNS服务器。比如你要查询www.baidu.com的ip地址,首先客户端(一般是本地DNS服务器)会向根DNS服务器发送请求,之后根DNS服务器会返回顶级域名com的顶级域DNS服务器的ip地址,然后客户端再向顶级域DNS服务器发送DNS请求,顶级域DNS服务器会根据baidu.com返回权威域DNS服务器的ip地址,客户端再向权威域DNS服务器发起请求,由权威域DNS服务器返回最终的ip地址。通过这个分析,可知

根DNS服务器:存储了顶级域DNS服务器的ip地址

顶级域DNS服务器:存储了权威域DNS服务器的ip地址

权威域DNS服务器:存储了DNS记录,即每个域名到ip地址的映射。

解析过程如下图

迭代查询
递归查询

图1是迭代查询,图2是递归查询,这两种情况都有可能发生。

本地DNS服务器

可以看到上面的两幅图中都有一个本地DNS服务器,这台服务器一般都是有网络运营商提供,我们的个人电脑请求域名解析的时候一般都是由它代理的,而且它还提供了DNS缓存的能力,可以缓存DNS应答中的所有信息,这样可以有效的缩短时延,提高性能。当然缓存不是永久的,过期后缓存信息将丢失,具体缓存策略由各自运营商提供的DNS服务器决定。

问题


传统的DNS解析方案是存在一些弊端的

image

前面说过,本地DNS服务器一般都是由运营商提供的,DNS采用的是UDP协议,因此很可能会出现以下几个问题

1.运营商DNS服务器故障

这个其实经常会出现,表现为就是某个区域的用户的网络请求全部失败,而其他区域的用户没有问题。

2.域名劫持

这里主要指的是LocalDNS劫持,攻击者可以通过修改运营商DNS缓存的内容或者直接攻击运营DNS服务器修改返回的响应内容,让域名恶意指向其他ip地址。

3.不准确

LocalDNS 调度,并不一定是就近原则,某些小运营商没有 DNS 服务器,直接调用其他运营商的 DNS 服务器,最终直接跨网传输。例如:用户侧是移动运营商,调度到了电信的 IP,造成访问慢,甚至访问受限等问题。

HttpDns


HTTPDNS使用HTTP协议进行域名解析,代替现有基于UDP的DNS协议,域名解析请求直接发送到HTTPDNS服务器,从而绕过运营商的Local DNS,能够避免Local DNS造成的域名劫持问题和调度不精准问题。

image

参考


《计算机网络自定向下方法》

Android 网络优化,使用 HTTPDNS 优化 DNS,从原理到 OkHttp

求关注


image

你可能感兴趣的:(【搞基础系列】网络篇-DNS和HttpDns)