Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

网络系列 - 再聊DNS工作原理及其应用、优化 #19

Open
HXWfromDJTU opened this issue Jul 21, 2020 · 0 comments
Open

网络系列 - 再聊DNS工作原理及其应用、优化 #19

HXWfromDJTU opened this issue Jul 21, 2020 · 0 comments

Comments

@HXWfromDJTU
Copy link
Owner

HXWfromDJTU commented Jul 21, 2020

DNS工作原理

前言

DNS (Domain Name System 的缩写)的作用非常简单,就是根据域名查出IP地址。你可以把它想象成一本巨大的电话本,电话黄页。 使用的是UDP协议进行传输。

dig

host

nslookup命令

whois命令

域名分级查找

域名分级 解析服务器 解析器地址存储位置 举例
根域名 根域名服务器 本地DNS服务器 .root
顶级域名 顶级域名服务器 根域名服务器中 .com .net .cn .edu
权威域名 各家公司自己的服务器 顶级域名服务器中 .taobao .baidu .alibaba
子域名 各公司的web服务 map.baidu image.baidu
先查找根域名服务器 ===>  再是顶级域名服务器  ====>      再是权威域名服务器      ====>        自身服务器子域名服务
(.root)              (.com /.cn /.net)       (.baidu.com /abc.cn/hupu.net)       (music.baidu.com/map.baidu.com)

1、查找本地缓存

每一次DNS的查找结果,OS都会进行一定时间的缓存。

本地 DNS 服务器地址从哪里来

UNIX系统中,在/etc/resolve.conf文件中查看cDNS服务器的IP地址。Mac 使用偏好设置一样可以看到对应设置

$ cat cat /etc/resolv.conf

2、向本地DNS服务器查找

每一次连接网络的时候,DNS服务器都是可以通过DHCP协议动态获取的,常用的DNS服务器一般是你接入的ISP提供的服DNS服务器。

UDP DNS

客户端(系统)向本地DNS服务器查找ip,这个过程OS通过UDP请求向本地DNS服务器询问这个www.baidu.com对应的ip是多少。

为什么是UDP呢? 因为这时候只需要查询一个www.baidu.comip地址,数据量极少,不可能超过512字节,所以为了速度。

TCP DNS

首先我们要知道两个概念,DNS主服务器DNS辅助服务器

  1. 主服务器托管控制区域文件,该文件包含域的所有权威信息(这意味着它是重要信息的可信源,例如域的IP地址)

  2. 辅助服务器包含区域文件的只读副本,它们通过称为区域传输的通信从主服务器获取其信息。每个区域只能有一个主DNS服务器,但它可以有任意数量的辅助DNS服务器。

  3. 一台DNS服务器可以是一个区域的主要服务器,也可以是另一个区域的辅助服务器。

其实这里是要补充说明一下,DNS中也有一个地方用到了TCP协议,那就是辅助DNS服务器区主DNS服务器中,读取该区域的DNS数据信息的时候,称之为区域传送。这个过程因为数据量比较大、而且需要保证正确性,所以这里使用到了可靠传输TCP

3、根域名服务器

所有根域名服务器都是以同一份根域文件(Root Zone file,文件名为root.zone)返回顶级域名权威服务器(包括通用顶级域和国家顶级域),文件只有2MB[31]大小。截至2017年10月9日,一共记录了1542个顶级域。对于没被收录的顶级域,是没法通过根域名服务器查出相应的权威服务器。而其他递归DNS服务器则只需要配置Root Hits文件,只包含根域名服务器的地址。

来自维基百科的词条,不多解释

4、顶级域名服务器

说到顶级域名的制定的管理,就不得不提ICANN这个组织,他是原来美国商务部的一个机构,现在独立为一个非盈利机构,专职管理域名。👆上面根域名服务器返回的2MB文件,就是这些顶级域名与其对应服务器地址。

当然,这些服务器ICANN不会都自己进行管理,而是交给不同的服务商。

5、子域名服务

子域名服务一般由开发者自身的服务器中的web服务器来充当,比如我们熟悉的nginx

流程总结

图2 来源与 《趣谈网络协议》 - 18 讲

DNS与前端优化

DNS的查询时间也包括在我们访问网站的响应时间内,一般为20-120毫秒的时间,所以减少DNS查询时间,是能够有效减少响应时间的方法。 MDN原文 👉

The X-DNS-Prefetch-Control HTTP response header controls DNS prefetching, a feature by which browsers proactively perform domain name resolution on both links that the user may choose to follow as well as URLs for items referenced by the document, including images, CSS, JavaScript, and so forth.

This prefetching is performed in the background, so that the DNS is likely to have been resolved by the time the referenced items are needed. This reduces latency(延迟) when the user clicks a link.

兼容性


感动得流泪...IE6-8竟然都支持...

使用

我们来看看淘宝网是怎么用prefetch

<!-- 告诉浏览器开启预请求 -->
<meta http-equiv="x-dns-prefetch-control" content="on" />
<!-- 禁用浏览器的预请求 -->
<meta http-equiv="x-dns-prefetch-control" content="off">

<!-- 进行 DNS 预请求 -->
<link rel="dns-prefetch" href="http://www.next-resource.com/">  

观察 DNS-prefetch 的工具

使用Chrome浏览器,打开chrome://histograms/DNS.PrefetchQueue这个页面,就能查看到

项目中使用 dns-prefetch

Manual Prefetch 这是使用dns-prefetch之前必须要先知道的知识。文档中提到

其他资源的 pre-fetch

  • 不需要对<a> <style>等带有href的标签手动pre-fetch
  • 代码中使用js跳转站外的,需要手动进行pre-fetch
  • scriptimgfont等静态资源进行pre-fetch
  • 上文提到的含有重定向的背后域名需要进行pre-fetch
<link rel="prefetch" href="login-modal-chunk.js">

参考文章

[1] 阮一峰 - DNS入门
[2] 前端优化与DNS
[3] 主DNS服务器与辅助DNS服务器的区别
[4] 讲讲DNS的原理?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant