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 [120.27.217.147] 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有基本的认知。