基本原理
首先一句话概括,DNS就是做域名到IP的映射,rdns表示IP到域名的映射。
怎么映射,其中传递的报文,以及如何进行进行扫描,记录类型都大有讲究。涉及到网络空间测绘当中的DNS扫描,dos也有DNS的相关应用
域名基础解释
首先,早期的DNS实现方案时依赖hosts文件,当然现在也可以,在局域网中还能应用。
现在对于一个简单的域名,它就是由顶级域名和子域名完成的。对于顶级域名,就是常见的.com,.org,.edu等等,而子域当然是千奇百怪。以www.bilibili.com为例:
www 代表主机名,其他的还有mail,space前缀,这些前缀可以标识访问的网站的主要关系,当然是由主站bilibili域名统一管理的。
例如这里www代表主站,mail代表邮箱,space代表个人空间
.com就是一个通用顶级域名。
或许你会问,这些顶级域名又是谁来管理呢,通过迭代,它应该是.com后面的.root,不过现在一般都省略这个,因为通用顶级域名全部由这个管理。
如果你想试试,你可以试着在.com后面加个`.`,它相当于是.root的缩写
域名的组成是倒着书写的,等级越往上的域名,在越后面,.com作为顶级域名,反而是用它结尾的
那么这个根服务器到底是什么呢?用于管理.com/.cn等通用顶级域名,应该非常厉害
根是由13个域名来完成的,注意,并不是13个服务器,这么顶级的东西,当时是阵列来完成的,真实地理位置大多都在美国,例如NASA等地。一共有1467个节点,当然在中国也有啦,通过任播技术,当我们查找顶级域名时就能联系到最近的根域名服务器
也就是 .
-> TLD(Top level domain)顶级域名服务器 -> Authoritative 权威域名服务器
域名解析过程
这个过程的核心就是 迭代查询
和递归查询
首先这个会查看缓存记录
,先查看是否有缓存记录或已过时。
假设没有缓存,获取ip需要先发送到解析器中,这里的解析器只是一段c语言实现的脚本,它用于驱动底层网卡而已,它就相当于DNS客户端,它会向DNS服务器发出查询请求,一般情况下,你的dns地址就是网关,这个DNS服务器最终会定位到理你最近的DNS服务器,一般由ISP管理
本地DNS服务器收到请求后会查看自己的缓存,如果是由缓存返回结果,会标注non-authoritative
非权威
以nslookup举例,
nslookup
set type=ns
.
这样会使用你设定的dns服务器,走53端口,发送udp报文对根服务器进行查询
返回的非权威结果,就是缓存得来的,就是13个域名
继续
set type=a
b.root-servers.net. (a类型就是IPv4类型)
返回非权威结果 199.9.14.201
此时就找到了根域名服务器位置
接下来递归该操作,查找com.的位置
server 199.9.14.201
set type=ns
com.
此时返回出一堆com的域名及其IP地址
因为是根负责的com域名,此时返回的是权威结果
此时得到com的IP地址(它已自动给出)
这里有个前缀,gtld就是我们前面提到的TLD顶级域名,gtld表示通用顶级域名
继续递归这个过程查找bilibili
server 192.5.6.30
set type=ns
bilibili.com.
由上图可以看到,bilibili的域名服务器有两个ns3,ns4,这个实际上是DNSpod提供的服务,两个域名对应着多个ip地址
接下来继续咨询bilibili的dns服务器,查找主站在哪?
server 1.12.0.17
set type=a
www.bilibili.com.
这里返回的是CNAME记录,CNAME就是一个跳转,叫你使用CDN跳转。
最后查找这个cdn
恭喜你,已经找到了
最后通过解析器的返回,我们就可以做缓存了,下次就会很快了
解析器与本地DNS服务器的通信就是递归,无限向下,但是会弹回来
而向根域名查找到bilibili主站查找过程就是迭代,无限迭代,直到找到为止。