计算机网络-DNS
Tao. Lv2

1.概念

DNS(Domain Name System,域名系统),将域名与IP的映射相互映射的一个分布式数据库,能够使人方便的访问互联网

2.如何工作

DNS 协议提供的是一种主机名到 IP 地址的转换服务,就是我们常说的域名系统。是应用层协议,通常该协议运行在UDP协议之上,使用的是53端口号。

查询过程:

img

那么问题来了,dns是怎么通过域名来查出ip的呢?我们以浏览器输入www.example.com为例,

  1. 检查浏览器缓存
  2. 检查操作系统缓存,常见的如hosts文件
  3. 检查路由器缓存
  4. 如果前几步都没没找到,会向ISP(网络服务提供商)的LDNS服务器查询
  5. 如果LDNS服务器没找到,会向跟域名服务器(Root Server)请求解析,分为以下几步:
    1. 跟服务器返回顶级域名(TLD)服务器如.com,.cn,.org等的地址,全球只有13台,该例子中会返回.com的地址
    2. 接着向TLD发送请求,然后会返回次级域名(SLD)服务器的地址,本例子会返回.example的地址
    3. 接着向SLD域名服务器通过域名查询目标IP,本例子会返回www.example.com的地址
    4. Local DNS Server会缓存结果,并返回给用户,缓存在系统中。

查看浏览器缓存可以用工具Chrome cache View

本地 DNS 服务器向其他域名服务器请求的过程是迭代查询的过程👇

DNS查询递归查询和迭代查询

  • 递归查询指的是查询请求发出后,域名服务器代为向下一级域名服务器发出请求,最后向用户返回查询的最终结果。使用递归查询,用户只需要发出一次查询请求。
  • 迭代查询指的是查询请求后,域名服务器返回单次查询的结果。下一级的查询由用户自己请求。使用迭代查询,用户需要发出多次查询请求。

所以一般而言,「本地服务器查询是递归查询」,而「本地 DNS 服务器向其他域名服务器请求的过程是迭代查询的过程」

DNS缓存

缓存也很好理解,在一个请求中,当某个DNS服务器收到一个DNS回答后,它能够回答中的信息缓存在本地存储器中。「返回的资源记录中的 TTL 代表了该条记录的缓存的时间。」

DNS实现负载平衡

它是如何实现负载均衡的呢?首先我们得清楚DNS 是可以用于在冗余的服务器上实现负载平衡。

原因:这是因为一般的大型网站使用多台服务器提供服务,因此一个域名可能会对应 多个服务器地址。

举个例子来说👇

  • 当用户发起网站域名的 DNS 请求的时候,DNS 服务器返回这个域名所对应的服务器 IP 地址的集合
  • 在每个回答中,会循环这些 IP 地址的顺序,用户一般会选择排在前面的地址发送请求。
  • 以此将用户的请求均衡的分配到各个不同的服务器上,这样来实现负载均衡。

总结

  • DNS域名系统,是应用层协议,运行UDP协议之上,使用端口53。
  • 查询过程,本地查询是递归查询,依次通过浏览器缓存 —>> 本地hosts文件 —>> 本地DNS解析器 —>>本地DNS服务器 —>> 其他域名服务器请求。 接下来的过程就是迭代过程。
  • 递归查询一般而言,发送一次请求就够,迭代过程需要用户发送多次请求。

DNS 为什么使用 UDP 协议作为传输层协议?

「DNS 使用 UDP 协议作为传输层协议的主要原因是为了避免使用 TCP 协议时造成的连接时延。」

  • 为了得到一个域名的 IP 地址,往往会向多个域名服务器查询,如果使用 TCP 协议,那么每次请求都会存在连接时延,这样使 DNS 服务变得很慢。
  • 大多数的地址查询请求,都是浏览器请求页面时发出的,这样会造成网页的等待时间过长。

3.DNS优化

1.DNS Prefetching

用户在请求某个链接之前,浏览器先尝试解析该链接的域名再将其进行缓存。这样真正请求的时候就不需要进行DNS解析。
可以在服务器中响应设置X-DNS-Prefetch-Control的值为on启动预解析

或者在HTML中这样配置

1
<meta http-equiv="x-dns-prefetch-control" content="on">

对特定域名预解析

1
<link rel=”dns-prefetch” href=”//fonts.googleapis.com”>

2.域名收敛

建议将静态资源只放在一个域名下面,可以有效减少dns的请求

3.httpdns

基于Http协议向HTTPDNS服务器发送域名解析请求,替代了基于DNS协议向运营商Local DNS发起解析请求的传统方式,可以避免运营商的域名劫持和进行精准调度。
这过程分为两步

  1. 客户端直接访问HttpDNS接口,获取业务在域名配置管理系统上配置的访问延迟最优的IP。(基于容灾考虑,还是保留次选使用运营商LocalDNS解析域名的方式)
  2. 客户端向获取到的IP后就向直接往此IP发送业务协议请求。以Http请求为例,通过在header中指定host字段,向HttpDNS返回的IP发送标准的Http请求即可。

4.DNS安全问题

  1. DNS反射/放大攻击

    向大量开放DNS服务器发送大范围域名查询的DNS请求,并将该DNS请求的源IP地址伪造成想要攻击的目标IP地址。由于请求数据比相应数据小得多,攻击者可以利用该技术放大掌握的带宽资源和攻击流量。

  2. DDOS攻击可能造成域名解析瘫痪

  3. DNS/域名劫持
    在劫持的网络范围内拦截域名解析的请求,分析请求的域名,返回假的IP地址或者使请求失去响应。DNS劫持通过篡改DNS服务器上的数据返回给用户一个错误的查询结果来实现的。

  4. DNS污染
    DNS污染是一种让一般用户由于得到虚假目标主机IP而不能与其通信的方法,指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器伪装成DNS服务器向用户发回错误的地址的行为。
    dns污染与dns劫持的区别在于,dns劫持修改了dns的解析结果,dns污染是不经过dns服务器,返回错误信息

  5. DNS信息黑客被修改

参考

「查缺补漏」巩固你的HTTP知识体系:https://juejin.cn/post/6857287743966281736#heading-21

CDN与DNS知识汇总:https://juejin.cn/post/6844903590662766599

总结

DNS(Domain Name System)域名系统是域名系统,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。提供的是一种主机名到 IP 地址的转换服务。

是应用层协议,通常运行在UDP协议之上,使用53端口。

查询过程:浏览器–>操作系统–>路由器–>ISP –>本地DNS服务器–>域名服务器