DNS 入门
# 10.DNS入门
DNS 是很常用的互联网协议,很有必要了解一下。
# 什么是 DNS
DNS,全称 Domain Name System,它的作用只有一个:根据域名查出对应 IP 地址。
那它内部是怎么实现的呢?它其实就是一个分布式的数据库,数据库里存储了域名和 IP 的对应关系。当有请求要查询时,就从数据库里查询,然后返回;当有数据要更新时,就更新数据库。就这么简单。
具体说来,DNS 保存了一个个资源记录(Resource Record,简称 RR),每个记录有 4 个字段,格式为:(Name, Value, Type, TTL)。
根据使用场景,"记录"可以分成不同的类型(type),例如:
A:地址记录(Address),返回域名的 IP 地址
NS:域名服务器记录(Name Server),可以理解为该域名由哪个域名解析服务器来解析。
MX:邮件记录(Mail eXchange),返回电子邮件的服务器地址
CNMAE:规范名称记录(也叫别名记录),返回另一个域名。例如 ping 本博客的时候,可以发现实际 ping 的域名是
www.peterjxl.com.w.cdngslb.com
(这个是 CDN 的域名,用来加速网站的),实现这个的原理就是 CNAME 记录,用户访问www.peterjxl.com
的时候,实际上访问的是www.peterjxl.com.w.cdngslb.com
:C:\WINDOWS\system32> ping www.peterjxl.com Pinging www.peterjxl.com.w.cdngslb.com [119.147.148.176] with 32 bytes of data: Reply from 119.147.148.176: bytes=32 time=8ms TTL=56 Reply from 119.147.148.176: bytes=32 time=8ms TTL=56 Reply from 119.147.148.176: bytes=32 time=8ms TTL=56 Reply from 119.147.148.176: bytes=32 time=8ms TTL=56 Ping statistics for 119.147.148.176: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 8ms, Maximum = 8ms, Average = 8ms
1
2
3
4
5
6
7
8
9
10
11
12
# A 记录举例
举个实际的例子:搭建一个博客并绑定域名(具体可以参考 从零开始搭建博客系列)
我在云服务器厂商上买了一个域名,买了一个服务器;然后在服务器上搭建了一个网站:
但是这 IP 不好记,我们可以给它加个域名,以后用户就可以用域名来访问了:
那怎么绑定呢?加个解析记录,例如我给 peterjxl.com 加了个记录,这样用户访问 peterjxl.com 的时候,会返回一个 IP 地址(下图的记录值),然后 HTTP 协议就可以用运输层协议来建立 TCP/UDP 连接了(因为已经知道了 IP),然后就可以访问网站了。
并且在 ping 的时候,也可以看到主机的 IP(已脱敏):
$ ping peterjxl.com
Pinging peterjxl.com [1xx.xx.xx.xx] with 32 bytes of data:
Reply from 1xx.xx.xx.xx: bytes=32 time=26ms TTL=52
Reply from 1xx.xx.xx.xx: bytes=32 time=26ms TTL=52
Reply from 1xx.xx.xx.xx: bytes=32 time=26ms TTL=52
Reply from 1xx.xx.xx.xx: bytes=32 time=26ms TTL=52
Ping statistics for 1xx.xx.xx.xx::
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 26ms, Maximum = 26ms, Average = 26ms
2
3
4
5
6
7
8
9
10
11
12
上述配置里,主机记录为 @ 表示是主域名,也就是我们可以直接通过主域名访问网站:
我们也可购买和配置子域名,例如 www.peterjxl.com:
或者只配置子域名的解析记录,不配置主域名的解析记录,也是可以的
# NS 记录举例
NS 记录,可以理解为该域名由哪个域名解析服务器来解析。我们在注册域名的时候,总会有一个默认的 DNS 服务器:
该 DNS 服务器会负责 peterjxl.com 的解析。我们在添加各类解析记录的时候,也是会将记录发送给这些服务器,等访客要访问的时候,DNS 协议就会向该 DNS 服务器发送请求,获取实际的 IP 地址,然后建立 TCP/UDP 连接。
当然,我们也是可以修改默认 DNS 服务器的,例如修改为一些高防的 DNS,这里不展开:
不过这样之前添加的解析记录,就得自己迁移到新的 DNS 服务器了。
# CNAME 记录举例
这里以阿里云的产品:CDN 的文档 (opens new window)来说明。
CDN 全称 Content Delivery Network,内容分发网络;用处是加速网站,可以理解为使用 CDN 后,访问网站的速度会变快。
那么原理是什么呢?
首先,将源站的内容(例如 HTML,CSS,JS 等)放到阿里云的服务器上(在 CDN 里叫做节点),而阿里云在全球都有很多的服务器;当访客访问网站的时候,会就近选择节点上的资源,然后返回内容给用户。
举个生活中的例子:在广州的小明想要吃 KFC,那么当他打开地图软件搜索 KFC 时,地图软件会就近搜索附近的 KFC 餐厅,然后返回结果给到小明;而在其他城市的人也是一样,搜索的时候会就近搜索。
以下内容摘自阿里云 CDN 文档 (opens new window):
假设您的加速域名为
www.aliyundoc.com
,接入 CDN 开始加速服务后,当终端用户在北京发起 HTTP 请求时,处理流程如下图所示。
- 当终端用户向
www.aliyundoc.com
下的指定资源发起请求时,首先向 Local DNS(本地 DNS)发起请求域名www.aliyundoc.com
对应的 IP。- Local DNS 检查缓存中是否有
www.aliyundoc.com
的 IP 地址记录。如果有,则直接返回给终端用户;如果没有,则向网站授权 DNS 请求域名www.aliyundoc.com
的解析记录。- 当网站授权 DNS 解析
www.aliyundoc.com
后,返回域名的 CNAMEwww.aliyundoc.com.example.com
。- Local DNS 向阿里云 CDN 的 DNS 调度系统请求域名
www.aliyundoc.com.example.com
的解析记录,阿里云 CDN 的 DNS 调度系统将为其分配最佳节点 IP 地址。- Local DNS 获取阿里云 CDN 的 DNS 调度系统返回的最佳节点 IP 地址。
- Local DNS 将最佳节点 IP 地址返回给用户,用户获取到最佳节点 IP 地址。
- 用户向最佳节点 IP 地址发起对该资源的访问请求。
例如,我的 CNAME 记录是这样添加的:
# MX 记录举例
MX 记录主要是自己搭建邮件服务器时用到的,不过国内管得比较严,基本上不允许自行搭建邮件服务器,这里不展开。
# DNS 的查询过程
DNS 的查询过程比较复杂,建议阅读阮一峰老师的博客:DNS 查询原理详解 - 阮一峰的网络日志 (opens new window)。读完后会对 DNS 有基本的认知。
# 推荐阅读
DNS 原理入门 - 阮一峰的网络日志 (opens new window)
DNS 查询原理详解 - 阮一峰的网络日志 (opens new window)
抓包理解 DNS 流程和 CDN 原理 - 知乎 (opens new window)
一文搞懂 DNS 基础知识,收藏起来有备无患~ (opens new window)
美国能让中国从网络上消失? (opens new window)