关于DNS,你应该知道这些
在互联网时代中,如果要问哪个应用层协议最重要的话,我想答案无疑是DNS.虽然我们每天都享受着DNS服务带来的便利,
却对它往往知之甚少.因此本文就来介绍一下DNS协议的工作流程,真正认识一下这个支撑着庞大互联网络的基础服务.
前言
DNS协议,全称为Domain Name System,即域名服务, 其功能描述起来很简单,就是将域名(网址)转换为IP地址.
可以想象为一个存储了全世界域名到IP的映射的服务器, 通过DNS请求查询获得IP地址. 然而事实上域名的
数量繁多,如果全部存放在一台服务器之上显然不合适. 因此对不同层级的域名往往需要在不同的域名服务器上查找,
直至找到最终的IP地址或者下一层级的域名服务器,是一个多次查找的过程.
域名的分级
我们日常上网所输入的网址,格式例子为http://www.pppan.net
,其中www.pppan.net
就可以看作是域名.
实际上,域名是从右到左分级的,格式如下所示:
主机名.次级域名.顶级域名.根域名
即:
host.sld.tld.root
以www.pppan.net
为例,其完整的域名应该是‵www.pppan.net.root‵,由于全球的根域名都是root
,因此根域名
部分常常忽略,因此可以写成www.pppan.net.
(注意最后的点),
根域名
根域名通过根服务器进行解析, 根服务器对于每个请求告知顶级域名服务器的地址. 目前全世界一共有十三台根服务器,
由于不同国家或机构管理维护,分别坐落在如下的地方:
可以看到其中没有一台是在中国境内的,不知道这是好事还是坏事呢? 呵呵.
顶级域名
顶级域名, 英文名为TLD(Top-Level Domains). 根据用途不同被分为两部分. 一部分称为通用顶级域名gTLD(generic TLD)
,
如.com, .net, .org, .biz, .info
等都是常见的通用顶级域名; 另一部分称为国别顶级域名ccTLD(country side TLD)
,
ccTLD对应的国家拥有对应域名进行任何限制的权力,有的国家只允许本国公民注册ccTLD域名,不过其他国家的机构可以通过"租"
的方式来获得对应国家的ccTLD域名, 常见的ccTLD类型域名有.cn, .us, .ru
等,还有些国家国别顶级域名因为有特殊的含义
而被批量租用的,如.tv, .ws, .tk
等.
次级域名
次级域名, 英文名为SLD(Sub-Level Domains), 通常又被称为二级域名. 这一级别的域名是用户可以向域名代理商进行注册的,
我们通常说的购买域名,就是买的次级域名.
主机名
主机名(hostname), 为用户在自己的域中为服务器所分配的不同的名称. 常见的www就是一个主机名.
域名查找
当我们知道一个用名称表示的资源时,为了访问这个资源,我们就需要知道其地址, 这个地址通常也称为记录(records).
这个根据资源名称(域名)来查找地址的过程, 就称为DNS, DNS查找通常会经过下面四步:
- 询问Resolver
- 询问根服务器
- 询问顶级域名服务器
- 询问次级域名服务器
Resolver
resolver
就是我们常说的DNS服务器, 其作用是为我们提供域名服务器的地址. resolver的地址一般在我们接入网络的时候,
通过DHCP获得, 也可以手动指定resolver地址. 在Linux系统中可以查看/etc/resolv.conf
文件查看resolver地址,
Windows则可以通过控制面板查看.
resolver通常有个root-hints
文件, 其中硬编码了十三个根域名服务器的地址. 当我们向resolver发起DNS请求时,
resolver会同时向所有根域名服务器发出查找请求,并以最快返回的响应为结果执行下一步的操作. 实际上,
resolver会根据响应速度获得一个优先查找的根服务器,并将随后的查找都只向此根服务器进行请求. 当然,
优先服务器也有自己的更新机制,不过这是题外话了.
resolver获得根服务器的地址之后,通常还需要进行下一步的查询. 如果我们要查找的域名为www.example.com
,
则还需要向根服务器查找com的顶级域名服务器,然后再查找次级域名服务器和主机名等.
询问根服务器
上面也说了,全球一共是三个根域名服务器,其中每一个都知道可以处理此次DNS请求的次级域名服务器的地址,
或者至少知道可以处理请求的下级的域名服务器地址.
一般来说,根服务器处理DNS请求,并且告诉resolver下一步应该去询问哪个顶级服务器. 不过如果根服务器识别出了
次级服务器的地址,就会把这个地址返回给resolver的.
询问顶级域名服务器
如果上一步根服务器没有识别出次级域名服务器的地址,那么就会给resolver返回顶级服务器的地址,从而resolver
需要再次向顶级域名服务器发起查询.
顶级域名服务器收到查询请求后,会将可以真正解析此请求的次级域名服务器地址返回给resolver.
询问次级域名服务器
上一步resolver请求顶级域名服务器后,会收到返回,内容是下一步要查询的域名服务器的地址,
也就是次级域名服务器的地址. 于是resolver向次级域名服务器发起DNS查询请求, 次级域名
服务器接收到请求后即返回对应次级域名的IP地址.
值得一提的是,次级域名还有如下的别名:
- 用户DNS名称服务器(User DNS name server)
- 权威名称服务器(Authoritative name server)
其中后者更广为人知一些,因为SLD是查询到对应域名IP地址的最后一步(如果有的话), 而且这个域名服务器也负责
对应资源的DNS设置,如添加不同主机地址的记录等.
resolver从次级域名服务器获得了域名的IP地址,并将其返回给用户,只此便完成了一次DNS查询.
域名查找实例
纸上得来终觉浅,绝知此事要躬行. 上面介绍了域名查找的一般流程之后, 我们就可以通过一次真实的DNS查找来
验证上述的过程. 在Linux环境下,有默认的dig
命令可以进行DNS的查找和调试, 这里以域名test.pppan.net
为例.
输入命令dig +trace test.pppan.net
可以看到详细的查找过程.
Step 1
首先, 向用户的DNS服务器(resolver,这里是10.0.20.166)查询根域名服务器的地址(std query A a-m.root-servers.net),
其中A表示查询ipv4地址记录,AAAA表示查询ipv6地址, 在下一节详细介绍. 返回结果如下:
. 318381 IN NS j.root-servers.net.
. 318381 IN NS k.root-servers.net.
. 318381 IN NS l.root-servers.net.
. 318381 IN NS m.root-servers.net.
. 318381 IN NS a.root-servers.net.
. 318381 IN NS b.root-servers.net.
. 318381 IN NS c.root-servers.net.
. 318381 IN NS d.root-servers.net.
. 318381 IN NS e.root-servers.net.
. 318381 IN NS f.root-servers.net.
. 318381 IN NS g.root-servers.net.
. 318381 IN NS h.root-servers.net.
. 318381 IN NS i.root-servers.net.
;; Received 811 bytes from 10.0.20.166#53(10.0.20.166) in 247 ms
可以看到,一共有13个根域名服务器,地址分别是a-m.root-servers.net.
, 其中响应最快的根域名服务器是
j.root-servers.net.
Step 2
然后, 向j-root-servers.net(192.58.128.30)发起查询请求(standard query A test.pppan.net),
得到的返回如下:
net. 172800 IN NS a.gtld-servers.net.
net. 172800 IN NS b.gtld-servers.net.
net. 172800 IN NS c.gtld-servers.net.
net. 172800 IN NS d.gtld-servers.net.
net. 172800 IN NS e.gtld-servers.net.
net. 172800 IN NS f.gtld-servers.net.
net. 172800 IN NS g.gtld-servers.net.
net. 172800 IN NS h.gtld-servers.net.
net. 172800 IN NS i.gtld-servers.net.
net. 172800 IN NS j.gtld-servers.net.
net. 172800 IN NS k.gtld-servers.net.
net. 172800 IN NS l.gtld-servers.net.
net. 172800 IN NS m.gtld-servers.net.
net. 86400 IN DS 35886 8 2 7862B27F5F516EBE19680444D4CE5E762981931842C465F00236401D 8BD973EE
net. 86400 IN RRSIG DS 8 1 86400 20170121050000 20170108040000 61045 . Y6+Td6BUfPw5RgC2aWX/pvC6OgEl8rVd3SCPtg+/qdwHxRa4TM8ppZWU +nTSRNTwgXX1VWxJ8D7MNu4q8gLZZWxO1U+3Viw8WNSRdIou+s2fVwon IQVF9y0GGpLaKt8mwlOaeHO3O1HiGGpR50GTlNhxyx6eGYHu5581ugFm NTjogYmrcTy5Es70WH6NhQ1z7+rO8rcuo5ES7fJoZWr4Bekd7YntSxXx +WCwOcpf3muLGPC9yshNprA/c9Fam3WDpJLYPjmCp2l96GyrJcv4o9z9 gov5IV69HWQnCD9IGRIj/XG/JZerp6YIRGH8cnrVe3F87Hy95SkNWnYR lC5fIg==
;; Received 863 bytes from 192.58.128.30#53(j.root-servers.net) in 524 ms
并没有返回IP,而是返回了可以解析该域名的顶级域名地址, 由于是.net因此属于gTLD,
可以看到返回了多个顶级域名服务器(a-m.gtld-servers.net.)的地址.
Step 3
接着, 我们应该向返回的地址再次发起查询(standard query A test.pppan.net),
这次返回了次级域名服务器的地址,如下:
pppan.net. 172800 IN NS ns01.freenom.com.
pppan.net. 172800 IN NS ns02.freenom.com.
pppan.net. 172800 IN NS ns03.freenom.com.
pppan.net. 172800 IN NS ns04.freenom.com.
A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN NSEC3 1 1 0 - A1RUUFFJKCT2Q54P78F8EJGJ8JBK7I8B NS SOA RRSIG DNSKEY NSEC3PARAM
A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN RRSIG NSEC3 8 2 86400 20170113060849 20170106045849 43880 net. WTfL5/hHBUsV2D5vusIP5KNSoiyfG4sG0GZQuBUqppWEY/WgZJ2wnnpk jjjfN5BlIExTuDyHclY2bXbiIqebcd1aVGp1ELUI7E5t3z7iCZmajPsT TLuLohKJmLC7b/OVdxoAuFoaIqj+GDsp2yDkXsem1IrfSOCbQlvJE9Ya xbQ=
OKR8BNVHVTI8CTK5KIDNJN546MJM5M16.net. 86400 IN NSEC3 1 1 0 - OKSF929IG7A7E1KLTJD5CF495DR06C54 NS DS RRSIG
OKR8BNVHVTI8CTK5KIDNJN546MJM5M16.net. 86400 IN RRSIG NSEC3 8 2 86400 20170113060546 20170106045546 43880 net. BGw3/vY9GzViJNHllwJkC1WB5XBtV9jzjy3LSA9I0zovOpVFHivHE01S r3YUtqAUuJ0LOJ4wrxBPwDRB0wTgbQdIO7dol2nQWuYujbxEbJ6AOWtR 7MTRhiG8BDn9LP06UWpUcWlsyywivKR70xCnamq3ZKeeI48dluRkVy9f lig=
;; Received 679 bytes from 192.33.14.30#53(b.gtld-servers.net) in 1813 ms
这一步返回可以看到, pppan.net所属的次级域名服务器是ns01-ns04.freenom.com, 因为我配置的就是这个地址.
但实际上可以自己在公网搭建这样一个次级域名服务器,只要可以解析出对应的hostname即可.
Step 4
最后,向ns01.freenom.com发起查询,便可以从响应中看到,已经找到了test.pppan.net的一条地址记录:
test.pppan.net. 14440 IN A 233.233.233.233
;; Received 59 bytes from 54.171.131.39#53(ns01.freenom.com) in 464 ms
因此便能得到本次DNS查询的结果, 即test.pppan.net的ip地址为233.233.233.233.
注: 对于用户而言,其实只进行一次DNS查询,即向resolver的查询,中间的过程由resolver进行按级查询,
并将最后查询到的结果返回给用户(如果有的话). 上面的查询由dig命令发起,因此和实际的查询过程还是有点小差别的.
记录类型
从上面的示例中我们可以看到, 我们查询的记录类型为A
或者AAAA
, 返回的结果类型有NS
,DS
或者A
等.
这些记录的类型在DNS协议中都有详细介绍,这里只解释几个常见的类型:
A
A记录(Address Mapping records), 指示了对应名称的IPv4地址, A记录用来将域名转换为ip地址.
AAAA
AAAA记录类似于A记录, 只不过指示的是IPv6的地址.
NS
NS记录(Name Server records), 用来指定对应名称的可信名称服务器(authoritative name server).
PTR
PTR记录(Reverse-lookup Pointer records), 和正向DNS解析(A/AAAA记录)相反, 主要用来根据IP地址查找对应的域名.
CNAME
CNAME记录即Canonical Name records, 用来指定一个新的域名用以完成本次查询.
当resolver查询过程中遇到一个CNAME记录时, 则会重新开始本次查询, 但是查询的域名会改为CNAME指定的域名.
举例来说,假如某次级域名服务器上有如下记录:
NAME TYPE VALUE
--------------------------------------------------
bar.example.com. CNAME foo.example.com.
foo.example.com. A 192.0.2.23
则查询bar.example.com的时候, 会在resolver端转而查询foo.example.com,从而得到查询的地址为192.0.2.23,
可以看到其实CNAME就是一个别名, 但是增加了查找的步骤. 不过这在当我们想要把自己的某个域名当作某个外部
域名的别称时还是很有用的. CNAME也有使用限制, 比如记录值不可以是IP, 以及不可同时有其他同名的A记录等,
具体可以参考这里.
MX
MX记录(Mail Exchanger records)为某个DNS域名指定了邮件交换的服务器. 这个记录信息由SMTP协议使用来将
邮件发送到正确的主机上. 通常对于一个域名有多个邮件交换服务器,并且他们之间都有对应的优先级.
TXT
TXT记录(text records)可以包含任意非格式化的文本信息, 通常这项记录被SPF框架(Sender Policy Framework)
用来防止发送给你的虚假邮件.
当然还有许多其他的记录类型, 不过相对而言没有那么常见. 需要了解的可以再深入查阅DNS协议的白皮书即可.
后记
经过上面对于DNS服务的解释, 我们应该就能解决大部分日常遇到的DNS问题. 比如为什么电脑能上QQ却打不开网页啦,
为什么我的网站突然解析不出来啦; 或者有独立域名的还能实现一些好玩的功能, 比如创建恶作剧的查询记录,或者
搭建个人邮件服务器等. 毕竟DNS协议是我们日常直接或者间接所接触到的最多的协议, 花上几个小时了解一下它的
工作机制,我想应该也是挺有趣的吧.
参考文章
博客地址:
欢迎交流,文章转载请注明出处.
关于DNS,你应该知道这些的更多相关文章
- 6.DNS公司PC访问外网的设置 + 主DNS服务器和辅助DNS服务器的配置
网站部署之~Windows Server | 本地部署 http://www.cnblogs.com/dunitian/p/4822808.html#iis DNS服务器部署不清楚的可以看上一篇:ht ...
- Liunx下配置DNS服务
当Ping 主机名时可以映射出该主机的IP地址,反之亦然.配置并指定DNS服务器可以快速部署集群,不需要每台主机都去修改HOSTS文件即可实现IP与主机名的相互解析.而在Linux下的DNS是用bin ...
- ★Kali信息收集~4.DNS系列
★.1host:DNS信息 参数: 一般情况下,host查找的是A,AAAA,和MX的记录 案例: DNS服务器查询 host -t ns 域名 A记录和MX记录查询 host 域名(host - ...
- Node.js:DNS模块的使用
Nodejs的DNS模块包涵有关DNS查询和操作的方法,下面介绍该模块的基本用法以及实现一个DNS查询小工具. 1.获取DNS服务器地址 使用getServers方法,该方法返回一个IP地址组成的数组 ...
- Java DNS查询内部实现
源码分析 在Java中,DNS相关的操作都是通过通过InetAddress提供的API实现的.比如查询域名对应的IP地址: String dottedQuadIpAddress = InetAddre ...
- DNS报文格式(RFC1035)
一.域名和资源记录的定义 1.Name space definitions 2.资源记录定义(RR definitions) 2.1 格式 后面分析报文的时候详细解释. ...
- DNS原理及其解析过程 精彩剖析
本文章转自下面:http://369369.blog.51cto.com/319630/812889 DNS原理及其解析过程 精彩剖析 网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址 ...
- CentOS7 查看IP、Gateway、DNS、Hostname
1.查看IP# ip addr 2.查看路由# ip route 3.查看DNS# cat /etc/resolv.conf 4.查看主机名# hostname
- linux查看本机IP、gateway、DNS
IP: ifconfig gateway:[root@localhost ~]# netstat -rnKernel IP routing tableDestination Gatew ...
- Centos6.2设置静态ip和dns
参考了如下文章:https://gist.github.com/fernandoaleman/2172388http://www.lifelinux.com/how-to-configure-stat ...
随机推荐
- abstract 与interface区别
1.abstract用于修饰类,interface用于修饰接口 2.抽象类中可以有抽象和非抽象方法,接口中只能定义抽象方法,不能有实现 3.抽象类必须被继承,interface被实现 4.抽象类有构造 ...
- Tomcat部署时war和war exploded区别及验证
war和war exploded的区别 在使用IDEA开发项目的时候,部署Tomcat的时候通常会出现下边的情况: 是选择war还是war exploded 这里首先看一下他们两个的区别: war模式 ...
- 汕头市队赛 SRM 06 C 秀恩爱
C 秀恩爱 SRM 06 背景&&描述 KPM坐在直升机上俯瞰小渔村景象. 渔村可看作二维平面,密密麻麻地到处都是单身狗,KPM当前所在坐标为(sx,s ...
- 关于gsl库出现access violation 0X00000005问题的解决方法
gsl即GNU SCIENCE LIBRARY是一个强大c/c++的数值计算函数库. 在使用这一库出现access violation 0X00000005问题,尝试方法一在project->C ...
- How to learn wxPython
目录 How to learn wxPython Learn Python Choose a good editor Install wxPython Read the wxPython tutori ...
- django+apache部署
参考:http://blog.csdn.net/rongyongfeikai2/article/details/13093555/ 参考:http://blog.csdn.net/yingmutong ...
- tmux下vim颜色不正常问题
在解决了tmux下,make menuconfig颜色不正常问题https://www.cnblogs.com/zqb-all/p/9702582.html后,引入了新的问题,vim颜色错乱. 尝试了 ...
- npm编译报错,缺少组件
解决方式: 1.删除安装文件 node_modules: 2.在需要安装 node_modules 文件的文件夹中,打开命令窗口,输入: cnpm install: 3.再输入: npm start, ...
- JSP 基础之 JSTL <c:choose>用法 if else
<c:choose> <c:when test="${condition1}"> condition1为true </c:when> <c ...
- DRF的过滤与排序
过滤 对于列表数据可能需要根据字段进行过滤,我们可以通过添加 django-filter 扩展来增强支持. pip install django-filter 在配置文件中增加过滤后端的设置: INS ...