域名与IP地址
-
我们将
www.baidu.com
这样的能定位到某个网站的字符串叫做域名 -
将
111.13.100.92
这样同样的定位到某个网站(更准确的说是定位到某台主机)的字符串叫做IP地址
通过上面的例子可以看出相对于IP地址,域名对于用户而言更容易记忆,更加友好。而对于路由器等网络设备却不是这样的。路由器可以根据IP地址更快的定位主机位置。而域名这种长度不定的字符串对于路由器来说简直是无法理解的。
从语法上讲,每一个域名都是有标号(label)序列组成,而各标号之间用点(小数点)隔开。
如下例子所示:
DNS的使命
-
DNS(Domain Name System),中文叫做 域名系统。
DNS就是为了同时保留域名和IP地址的优势的产物。人们可以通过域名简单的记住要访问的web站点,而路由器等网络设备却可以使用IP地址快速定位到相关主机。DNS要做的就是当用户输入域名后,先到DNS服务器查询IP地址,然后再通过IP地址来访问web站点。
DNS服务器的层次结构
-
实现DNS服务器最简单的一种方案就是在一台远程主机上配置好DNS的映射表,所有的域名转换都会通过这台主机。可是这样的方案简单却不可靠。主要的缺点有:
-
当这台主机出现故障时,整个互联网将会瘫痪。只有那些不依赖DNS服务的软件才可以正常工作
-
单个DNS服务器不得不处理整个互联网的所有DNS解析,这样的对带宽的要求是很高的
-
这种单点非分布式的方案,会造成巨大的延迟。假如这台服务器放在美利坚,当你在我大天朝访问大天朝的百度的时候,你的域名解析的报文不得不先到达地球另一面的服务器所在地,然后返回。一次请求,报文往返路程就绕地球一圈了。而互联网的使用者的直观感受就是:慢
-
映射表的维护成本更加昂贵,当需要添加或者更新DNS记录的时候,对于这样大量的数据维护成本极高,效率极低
所以,DNS服务器应该是分布式的。
-
-
DNS服务器的层次结构:
-
根DNS服务器 :用来返回TLD服务器的IP地址。最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。不管是哪一个本地域名服务器,若要对因特网上任何一个域名进行解析,只要自己无法解析,就首先求助根域名服务器。所以根域名服务器是最重要的域名服务器。假定所有的根域名服务器都瘫痪了,那么整个DNS系统就无法工作。需要注意的是,在很多情况下,根域名服务器并不直接把待查询的域名直接解析出IP地址,而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。
-
顶级域(TLD)域名服务器:返回权威服务器的IP地址
-
权威DNS服务器 :返回相应主机的IP地址
-
-
还有一种本地DNS服务器,他并不属于以上的层次机构,却很重要,通常我们电脑和路由器自动获得到的DNS服务器地址就是本地服务器。每个ISP都有本地DNS服务器,当主机发出DNS请求时,请求被发往本地服务器,它起着代理作用,将该请求转发到DNS服务器层次中。
图解访问百度DNS解析过程
一、主机向本地域名服务器的查询一般都是采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
二、本地域名服务器向根域名服务器的查询的迭代查询。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个顶级域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。
下图给出了这两种查询的差别:
下面举一个例子演示整个查询过程:
假定域名为m.xyz.com的主机想知道另一个主机y.abc.com的IP地址。例如,主机m.xyz.com打算发送邮件给y.abc.com。这时就必须知道主机y.abc.com的IP地址。下面是上图a的几个查询步骤:(迭代查询)
1、主机m.abc.com先向本地服务器dns.xyz.com发送DNS查询报文,进行递归查询。该报文包含被转换的主机名y.abc.com。
2、本地服务器采用迭代查询。它将该报文转发到根域名服务器查询。
3、根域名服务器告诉本地服务器,下一次应查询的顶级域名服务器dns.com的IP地址。
4、本地域名服务器向顶级域名服务器dns.com发送报文进行查询。
5、顶级域名服务器dns.com告诉本地域名服务器,下一步应查询的权限服务器dns.abc.com的IP地址。
6、本地域名服务器向权限域名服务器dns.abc.com进行查询。
7、权限域名服务器dns.abc.com告诉本地域名服务器,所查询的主机的IP地址。
8、本地域名服务器最后把查询结果告诉m.xyz.com。
整个查询过程共用到了8个UDP报文。
-
你在浏览器输入了网址,然后浏览器通过UDP协议向本地服务器的53号端口发送了DNS解析请求(1号过程)。
-
如果本地DNS服务器缓存了百度的DNS记录(关于DNS缓存在下一节会详细讲),如果没有该记录就回向根服务器请求(2号路径),然后根服务器收到请求后,会返回给本地服务器相应的顶级域名DNS服务器地址。以
www.baidu.com
为例,就回返回解析com
顶级域名的服务器(3号路径)。 -
然后本地服务器知道TLD DNS服务器的地址后就会向该服务器发送解析请求(4号请求),然后TLD服务器返回给本地DNS服务器百度的权威服务器的IP地址(5号路径)。
-
同上,本地DNS服务器向百度的权威DNS服务器发起查询请求(6号路径)。就会得到百度权威DNS服务器返回给本地服务器的百度服务器的IP地址(7号路径)。
-
最后,本地DNS服务器会把百度服务器的IP地址返回给你的电脑(8号路径),同时将这条记录缓存在本地DNS服务器。
-
注意:以上这种方式称为“先递归,再轮询”的查询方式,计算机网络中还存在其他的查询方式如仅仅的”递归“,可是上面这种查询方式时最常用的。
DNS缓存
-
如果每次DNS解析都要走完上一节整个的流程,那样对于网络带宽的消耗和延时对于用户和DNS解析系统都是不友好的。所以当本地DNS服务器在一次查询后缓存到本地。从而加快DNS的解析速度。实际上,你的访问的解析大多数都是在本地服务器上完成的。
为了提高DNS查询效率,并减轻服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛使用了高速缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。
例如,在上面的查询过程中,如果在m.xyz.com的主机上不久前已经有用户查询过y.abc.com的IP地址,那么本地域名服务器就不必向根域名服务器重新查询y.abc.com的IP地址,而是直接把告诉缓存中存放的上次查询结果(即y.abc.com的IP地址)告诉用户。
由于名字到地址的绑定并不经常改变,为保持告诉缓存中的内容正确,域名服务器应为每项内容设置计时器并处理超过合理时间的项(例如每个项目两天)。当域名服务器已从缓存中删去某项信息后又被请求查询该项信息,就必须重新到授权管理该项的域名服务器绑定信息。当权限服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名解析的正确性。
不仅在本地域名服务器中需要高速缓存,在主机中也需要。许多主机在启动时从本地服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机应当定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删除无效的项。由于域名改动并不频繁,大多数网点不需花精力就能维护数据库的一致性。
DNS的额外服务
-
之所以称这节为DNS的额外服务是指除了主机名到IP地址转换的其他的一些服务
-
主机别名(host aliasing):有着复杂主机名的主机能同时拥有一个或者多个别名。例如:relay1.hangzhou.enterprise.com可能有一个别名叫做enterpries.com 我们称前者为规范主机名。主机别名更容易记忆。DNS可以根据主机别名来返回主机名的规范主机名,和主机的IP地址
-
邮件服务器别名(mail server aliasing):与第一项类似,只不过是针对邮件服务器提供别名服务
-
负载分配(load distribution):并不是每个域名对应一个IP地址,可能对应多台。这是DNS以轮流的方式来返回主机IP地址。
DNS资源记录(DNS存了什么?)
DNS资源记录(resource record,RR)就是上图描述的四种类型的纪录(其实还有其他类型,这里我们不再说明)。其中生存时间TTL决定了该条记录在缓存中删除的时间。(单位为秒)
下面分别举个例子帮助理解
-
(relay1.bar.foo.com, 145.37.93.126, A)
-
(foo.com, dns.foo.com, NS)
-
(foo.com, relay.bar.foo.com, CNAME)
-
(foo.com,mail.bar.foo.com,MX)
DNS协议报文格式
2.1 头部
- 会话标识(2字节):是DNS报文的ID标识,对于请求报文、和其对应的应答报文,这个字段是相同的,通过它可以区分DNS应答报文是哪个请求的响应。
-
QR(1bit) 查询/响应标志,0为查询报文,1为响应报文 opcode(4bit) 0表示标准查询,1表示反向查询,2表示服务器状态请求 AA(1bit) 表示授权回答 TC(1bit) 表示可截断的 RD(1bit) 表示期望递归,客户在该DNS服务器没有某记录时希望它执行递归查询 RA(1bit) 表示可用递归,DNS服务器支持递归查询,在回答报文中置位 rcode(4bit) 表示返回码,0表示没有差错,3表示名字差错,2表示服务器错误(Server Failure) - 数量字段(总共8字节):Questions、Answer RRs、Authority RRs、Additional RRs 各自表示后面的四个区域的数目。Questions表示查询问题区域的数量,Answers表示回答区域的数量,Authoritative namesversers表示授权区域的数量,Additional recoreds表示附加区域的数量。
2.2 正文
-
Queries区域1.1 查询名:长度不固定,且不使用填充字节,一般该字段表示的就是需要查询的域名(如果是反向查询,则为IP,反向查询即由IP地址反查域名),一般的格式如下图所示。
1.2 查询类型:类型 助记符 说明 1 A 由域名获得IPv4地址 2 NS 查询域名服务器 5 CNAME 查询规范名称 6 SOA 开始授权 11 WKS 熟知服务 12 PTR 把IP地址转换成域名 13 HINFO 主机信息 15 MX 邮件交换 28 AAAA 由域名获得IPv6地址 252 AXFR 传送整个区的请求 255 ANY 对所有记录的请求 这里给一个域名,可用来模拟DNS的查询类型,可以选择不同的类型,比如A,PTR等玩一下, https://www.nslookuptool.com/chs/
1.3 查询类:通常为1,表明是Internet数据 - 资源记录(RR)区域(包括回答区域,授权区域和附加区域)
该区域有三个,但格式都是一样的。这三个区域分别是:回答区域,授权区域和附加区域
权威区域包含其他权威服务器的记录。
附加区域包含其他有帮助的记录。
在DNS数据库中插入记录:
假设刚创建一个公司,必须首先在注册登记机构注册其域名,注册登记机构是一商业实体,它验证该域名的唯一性,将该域名输入DNS数据库,对提供的服务收取少量费用。