DNS完整解析流程_dns流程-程序员宅基地

技术标签: CDN基础知识  网络  http  网络协议  dns服务器  

一、DNS介绍

  域名(Domain Name)是一个标记主机或主机组的名称,相当于IP地址的别名。

  域名系统(Domain Name Server)是将域名解析成IP地址的互联网基础服务,提供该服务的服务器成为域名解析服务器。

二、域名结构

域名系统是一个分布式系统,Internat采用树状结构命名,结构如下图所示:
在这里插入图片描述

三、DNS解析过程

在这里插入图片描述

1、DNS域名解析服务器分类
  • 本地域名服务器(Local DNS)

    如果通过DHCP配置,Local DNS由ISP提供

  • 根域名服务器(Root DNS)

    当Local DNS解析不到时,第一步向Root DNS查询,并获得顶级域名服务器的IP地址。Root DNS本身并不直接用于域名解析,仅用于返回可供查询的顶级域名服务器IP地址。

  • 顶级域名服务器(Top Level DNS)

    负责管理在该顶级域名服务器下注册的二级域名

  • 权威域名服务器(Authoritative DNS)

    在特定区域内具有唯一性,负责维护该区域内的域名和IP地址映射关系,在DNS应答报文中,标识为AA标识本次DNS记录是否来自于权威域名服务器,否则可能来自于缓存。

2、DNS域名解析中添加的各项解析记录

​ DNS服务器会把一个域名解析到一个IP地址,然后在此IP地址的主机上将一个子目录与域名绑定。域名解析时会添加解析记录,包括:A记录、AAAA记录、CNAME记录、MX记录、NS记录、TXT记录、SRV记录、URL转发。

  • A记录:将域名指向一个IPv4地址,需要增加A记录
  • CNAME记录:如果将一个域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录。这个域名一般是主机服务提供商提供的一个域名。
  • MX记录:建立电子邮箱服务,将指向电子邮箱服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮箱服务商提供的MX记录填写改记录。
  • NS记录:域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录。
  • AAAA记录:将主机名或域名指向一个IPv6地址,需要添加AAAA记录
  • SRV记录:添加服务器记录服务器服务器记录时会添加此项,SRV记录了那台计算机提供了那哪个服务,格式为:服务的名字.协议的类型
  • SOA记录:SOA叫做起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中那一台是主服务器
  • DS记录:委托签发者,此记录用于鉴定DNSSEC已授权区域的签名密钥
  • RRSIG记录:DNSSEC 证书,DNSSEC 安全记录集证书,与 SIG 记录使用相同的格式
  • PTR记录:PTR记录是A记录的逆向记录,又称做IP反查记录或指针记录,负责将IP反向解析为域名
  • 现实URL转发记录:将域名指向一个http(s)协议地址,访问域名时,直接跳转至目标地址。
  • 隐士URL转发记录:将域名指向一个http(s)协议地址,访问域名时,直接跳转至目标地址,隐性转发会隐藏真实的目标地址(浏览器显示源域名)。

​ A记录是把域名解析到IP地址,二CNAME是把域名解析到另一个域名,而这个域名最终会指向一个A记录,在实现功能上A记录和CNAME没有区别。

​ CNAME记录在做IP变更时要比A记录方便。CNAME允许将多个域名映射到一台机器,当有多个域名需要指向同一服务器IP,此时可以将一个域名做A记录指向服务器IP,然后将其他的域名做别名(即:CNAME)到A记录的域名上。当服务器IP地址变更时,只需要更改A记录的那个域名到新IP上,其它做别名的域名会自动更改到新的IP地址上,而不必对每个域名做更改。

3、DNS解析流程
  • 查询本地hosts文件映射

    手动设置IP与域名的映射关系,保存在hosts文件中

    • windows:C:\Windows\System32\drivers\etc\hosts
    • linux:/etc/hosts
  • 查询浏览器或本地DNS缓存

    浏览器或本机都会对DNS进行缓存

  • 委托LSP-DNS查询(递归查询)

    本机向LDNS查询一般都是采用递归查询:如果本机所询问的本地域名服务器不知道查询的IP地址,那么本地域名服务器就以DNS客户的身份,想其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步查询。因此递归查询的结果或者是所要查询的IP,或者报错。

  • LSP-DNS做迭代查询

    本地域名服务器向根域名服务器查询通常采用迭代查询:当跟服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出查询对应的IP地址,要么告诉本地域名服务器下一步应该向哪个域名服务器查询。

    然后本地域名服务器进行后续查询,根域名服务器通常把自己知道的顶级域名服务器告诉本地域名服务器,本地域名服务器再去顶级域名服务器查询。

  • LSP-DNS将查询结果返回到本机

4、DNS解析步骤

在这里插入图片描述

  • 首先检查DNS缓存,如果缓存过期或未命中,客户端需要向Local DNS发起查询请求报文
  • 客户端向 Local DNS 发送查询报文 query www.baidu.com,Local DNS 首先检查自身缓存,如果存在记录则直接返回结果,查询结束;如果缓存老化或未命中,则下一步
  • Local DNS 向根域名服务器发送查询报文 query www.baidu.com,返回 .com 顶级域名服务器的地址
  • Local DNS 向 .com 顶级域名服务器发送查询报文 query www.baidu.com,返回baidu.com所在的权威域名服务器的地址
  • Local DNS 向 baidu.com 权威域名服务器发送查询报文 query www.baidu.com,得到 IP地址,存入自身缓存并返回给客户端
5、实时跟踪解析过程
  • 查询域名对应的IP地址
Nikolai:~ cow$ nslookup www.baidu.com
Server:		114.114.114.114			//本地设置的Local DNS服务器
Address:	114.114.114.114#53	//本地设置的Local DNS服务器

Non-authoritative answer:			// 非权威解答,即从上连DNS服务器的本地缓存中读取出的值,而非实际去查询到的值
www.baidu.com	canonical name = www.a.shifen.com. #canonical name为CNAME
Name:	www.a.shifen.com
Address: 36.152.44.96
Name:	www.a.shifen.com
Address: 36.152.44.95
  • 追踪解析过程
Nikolai:~ cow$ dig +trace www.baidu.com
# 第一步:请求 . 的IP,向Local DNS获取Root-DNS的13个NS的IP和名称[a-m].root-servers.net
; <<>> DiG 9.10.6 <<>> +trace www.baidu.com
;; global options: +cmd
.			1308	IN	NS	k.root-servers.net.
.			1308	IN	NS	c.root-servers.net.
.			1308	IN	NS	g.root-servers.net.
.			1308	IN	NS	b.root-servers.net.
.			1308	IN	NS	a.root-servers.net.
.			1308	IN	NS	f.root-servers.net.
.			1308	IN	NS	l.root-servers.net.
.			1308	IN	NS	h.root-servers.net.
.			1308	IN	NS	m.root-servers.net.
.			1308	IN	NS	e.root-servers.net.
.			1308	IN	NS	i.root-servers.net.
.			1308	IN	NS	d.root-servers.net.
.			1308	IN	NS	j.root-servers.net.
;; Received 239 bytes from 114.114.114.114#53(114.114.114.114) in 43 ms	#Local DNS返回
# 第二步:向某一台Root-DNS(h.root-servers.net)发送www.baidu.com域名解析请求,返回顶级域名.com的NS:IP(未显示)和名称
com.			172800	IN	NS	a.gtld-servers.net.
com.			172800	IN	NS	b.gtld-servers.net.
com.			172800	IN	NS	c.gtld-servers.net.
com.			172800	IN	NS	d.gtld-servers.net.
com.			172800	IN	NS	e.gtld-servers.net.
com.			172800	IN	NS	f.gtld-servers.net.
com.			172800	IN	NS	g.gtld-servers.net.
com.			172800	IN	NS	h.gtld-servers.net.
com.			172800	IN	NS	i.gtld-servers.net.
com.			172800	IN	NS	j.gtld-servers.net.
com.			172800	IN	NS	k.gtld-servers.net.
com.			172800	IN	NS	l.gtld-servers.net.
com.			172800	IN	NS	m.gtld-servers.net.
com.			86400	IN	DS	30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com.			86400	IN	RRSIG	DS 8 1 86400 20210407050000 20210325040000 42351 . da9V1INes+/W51QLFwPi2KH4XxaNMsPxAJyDz1OucQPGYvqrtZOIg+/U se7ZNL44AzRNOWayiGQa2WENkdhHP//RfmORPtU0lJ5xL61Fk5J4Ufqg qLxm0ff1vq9IvJHDhDRpQc9Z8HHMexs9OgGnNUvw4ZIqZmh4J1ybkYFV gAK7H/WeBuIRvxrsoAvBaG21QARgYwnsML1JE5nlU0qaQYKXBA0pU8di LvfbM5XWPdZ1+mXvM0cI/5GY0lljsDE0IcrGQqV0kx+kb/COh0D2zQ4e IYJn2iwfqMcFqr0y9tdGR/LCX2Xn2I398fzkBo7EEg/RclMVldwOuyPT C4g8jg==
;; Received 1173 bytes from 198.97.190.53#53(h.root-servers.net) in 248 ms
# 第三步:想某一台顶级域名服务器(e.gtld-servers.net)发送www.baidu.com域名解析请求,返回baidu.com的NS(IP和名称),这里可以看到有5台服务器
baidu.com.		172800	IN	NS	ns2.baidu.com.
baidu.com.		172800	IN	NS	ns3.baidu.com.
baidu.com.		172800	IN	NS	ns4.baidu.com.
baidu.com.		172800	IN	NS	ns1.baidu.com.
baidu.com.		172800	IN	NS	ns7.baidu.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q1GIN43N1ARRC9OSM6QPQR81H5M9A  NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20210329044039 20210322033039 58540 com. u/fG/22hCyr5d7plovuOVw4cBVYARC3TpYD+/BFVwV/G9t3LsW2mCEza 2gNH2YWAPeaA5wA1K9Ma8C5SYDEvAm/G3EB7zwVjYFGJK2JshioJjK6Z OyryobM7iVOzOQdj1jljwoGkP9h0XD76dGedJ2+XTuYmmBunq2TbTsEp yK4YWPyxXit+kcwqslrTY6aZUeUaG8fL2FNdF++pOJwUWQ==
HPVUSBDNI26UDNIV6R0SV14GC3KGR4JP.com. 86400 IN NSEC3 1 1 0 - HPVVN3Q5E5GOQP2QFE2LEM4SVB9C0SJ6  NS DS RRSIG
HPVUSBDNI26UDNIV6R0SV14GC3KGR4JP.com. 86400 IN RRSIG NSEC3 8 2 86400 20210329061254 20210322050254 58540 com. DOFFQBEbHI3eie9mCVlBPLgouYOOy/U3Z6sPH/9WxtcuXXVxo0VgY0qC tA3Bnn+5VXb++NKcTl3NMbDRYL9nA1xWFEK/DFl18NIATp4t99FxJ7m2 CevCNOse6Znj+BwY4poNesVvLfA+njx0l8nI79tUPnYRde8E/Zjx0GaN UrK1mAISiqivR/m5+sN26+KFJkA3llX7WdnmwPjegxf+Zg==
;; Received 761 bytes from 192.12.94.30#53(e.gtld-servers.net) in 300 ms
# 第四步:向其中一台百度权威域名服务器(ns2.baidu.com)发送www.baidu.com域名解析请求,返回a.shifen.com.和CNAME www.a.shifen.com.、IP和名称
www.baidu.com.		1200	IN	CNAME	www.a.shifen.com.
a.shifen.com.		1200	IN	NS	ns4.a.shifen.com.
a.shifen.com.		1200	IN	NS	ns3.a.shifen.com.
a.shifen.com.		1200	IN	NS	ns2.a.shifen.com.
a.shifen.com.		1200	IN	NS	ns1.a.shifen.com.
a.shifen.com.		1200	IN	NS	ns5.a.shifen.com.
;; Received 239 bytes from 220.181.33.31#53(ns2.baidu.com) in 40 ms

​ 事实上,返回CNAME的同一个包中,也返回了www.a.shifen.com. 对应的NS列表,之后www.a.shifen.com.的解析流程没有跟踪到。
在这里插入图片描述

  • 本机向Local DNS请求查询www.baidu.com
  • Local DNS向根域名服务器Root-DNS请求查询www.baidu.com,根域名服务器返回com.域的顶级域名服务器GTLS-DNS
  • 向com.域GTLS-DNS请求查询,com. 域返回baidu.com域的服务器IP名称列表(通过NS的方式)
  • 向baidu的权威域名解析服务器请求查询www.baidu.com,返回A记录a.shifen.com和CNAMEwww.a.shifen.com
  • 向Root-DNS请求www.a.shifen.com
  • 向com.域GTLS-DNS请求查询www.a.shifen.com
  • 向shifen.com域DNS查询
  • 向a.shifen.com域查询
  • 拿到www.a.shifen.com的A记录
  • Local DNS返回www.baidu.com的CNAMEwww.a.shifen.com以及www.a.shifen.com的IP
6、DNS缓存

​ 一次完整的 DNS 查询过程需要访问多台 DNS 服务器才能得到最终的结果,这肯定会带来一定的时延。为了改善时延,DNS 服务并不是每次请求都要去访问 DNS 服务器,而是访问过一次后将 DNS 记录缓存在本地。具体来说,DNS 服务是一个多级的缓存:

​ 浏览器缓存 -> 操作系统缓存 -> 路由器缓存 -> Local DNS 缓存 -> DNS 查询

​ 缓存并不是永久有效的,前面提到过 DNS 应答报文中的 TTL(Time to Live)值,它决定了 DNS 记录在缓存中的有效时间。需要注意的是,TTL 只是一个参考值,实际使用的缓存有效时间不一定等于该值,甚至是固定值。

四、DNS存在的问题
1、DNS查询时延

​ 一次完整的 DNS 查询过程需要访问多台 DNS 服务器才能得到最终的结果,这肯定会带来一定的时延。从实践来看,这个时间还不容小觑。

2、缓存一致性

​ DNS 缓存的存在虽然减少了时延,却是以牺牲一致性(consistency)为代价的。具体来说:Local DNS 是分地区、分运营商的,在域名解析缓存的处理上,实现策略就不统一了。有时候 Local DNS 的解析结果可能不是最近、最优的节点,有的时候并不会遵从 TTL 的限制,而是设置一个固定时间。这就会导致域名指向新的 IP 地址后,一些客户端依然访问了缓存中 旧的 IP 地址。

3、DNS劫持

​ 由于 DNS 缺乏加密、认证、完整性保护的安全机制,容易引发网络完全问题。最常见的域名劫持攻击是针对 DNS 报文首部的事务 ID进行欺骗,由于事务 ID 在查询报文和应答报文中是匹配的,因此伪装 DNS 服务器可以提前将事务 ID 相同的伪造报文发送到客户端,以实现域名劫持(前提是合法的报文还未到达),把目标网站域名解析到错误的 IP 地址。

4、调度不精确

​ 由于存在缓存、转发、NAT 等问题,权威的 DNS 服务器可能会误判客户端所在的位置和运营商,从而导致解析出跨运营商访问的 IP 地址,用户的访问速度降低。

在这里插入图片描述
在这里插入图片描述
公众号:编程之蝉 专注后台开发、CDN、算法、大数据,欢迎关注,阅读最新更新
公众号:编程之蝉

五、参考
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43710037/article/details/115386472

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签