DNS:网络世界的通讯录

504 阅读8分钟

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

DNS:网络世界的通讯录

什么是DNS:

现实世界中,我们能记住网站的名字,但是很难记住网站的IP地址。因此我们需要一个地址簿,我们可以通过网站的名字,在这个地址簿(DNS服务器)上找到网站对应的IP地址。

Domain Name System域名系统,作用就是提供根据域名查询IP地址的能力。当计算机要访问某个域名的时候,需要先通过DNS查询到这个域名对应的IP地址。

因为网络世界的用户数量庞大,用户分布在世界各地,因此DNS 服务器,一定要设置成高可用、高并发和分布式的,确保网络世界的流程可用。

DNS域名系统按照树状层次结构进行划分:

最上层是.root根DNS服务器,返回的是.root域名的IP地址,因为所有的域名皆为都是.root,所以这个根域名一般就被隐藏忽略了。该服务器返回顶级域名DNS服务器的IP地址。

Eg: www.baidu.com.root =>www.baidu.com.

然后是顶级DNS服务器,比如.com,.net。该服务器返回次级域名DNS服务器的IP地址(也叫权威DNS服务器)

再然后是次级DNS服务器,返回的是对应主机的IP地址。

一个完整的域名结构如下:

主机名.次级域名.顶级域名.根域名

DNS的解析流程:

①、客户端发起一个DNS请求,请求查询www.a.com网址的IP地址,发送这个请求给本地域名服务器(通常是在网络服务商的某个机房里)。

②、本地DNS服务器接收到客户端的请求后,如果能够找到www.a.com网址的IP地址,那么就直接返回对应的IP地址。

②、如果请求不到,那么本地DNS会给root根DNS服务器。

③、root DNS不会直接解析域名,而是会告诉本地DNS,.com这个顶级域名服务器的IP地址。

④、本地DNS转向root DNS返回的com这个顶级域名服务器请求a.com的IP地址。

⑤、com顶级域名服务器接收到请求后,返回a.com这个次级域名服务器的IP地址。

⑥、然后本地DNS转向次级域名服务器请求www.a.com的IP地址。

⑦、次级域名服务器查询到之后,将IP地址返回给本地DNS。

⑧、本地DNS再将IP地址返回给客户端,之后客户端再和www.a.com对应的服务器建立连接。

dns-2.png

DNS与负载均衡:

采用全局负载均衡(GSLB)的前提是在不同地区设立了多个数据中心。

好比海底捞,能够做负载均衡是开多个分店,而不是到处开排队的站点。

对于不需要做全局负载均衡的简单应用来讲,a.com 的次级DNS 服务器可以直接将 a.com 这个域名解析为一个资源比较充足的IP地址或者多个 IP 地址,然后客户端可以通过多个 IP 地址, 进行简单的轮询,实现简单的负载均衡。

但是对于跨地跨运营商的大型应用,需要更复杂的全局负载均衡机制,需要有专门的服务器来做负载均衡这件事,这类服务器或者设备就是GSLB(Global Server Load Balance)。

可以在a.com的次级DNS服务器中,配置CNAME,给www.a.com这个域名取一个别名,www.ab.com,然后告诉本地DNS服务器,去请求www.ab.com解析www.a.com这个域名,这样ab这个GSLB服务器就可以按照自己的策略,实现需要的负载均衡(返回同服务商(提高吞吐量),距离更近的服务器的ip地址(减少时延))。

跨网传输,在不同的运营商之间产生的流量是需要付费结算的,减少跨运营商传输可以节省这部分的开支。

图示如下(省略了DNS递归查找的一些步骤):

dns-3.png

1、2、3:次级DNS服务器返回对应的运营商的GSLB服务器。

4、5、6:本地DNS向这个GSLB服务器请求对应的a.com对应的数据中心的地址并返回给客户端。

7、8:客户端向对应的数据中心请求数据。

实际上,GSLB也可以分成多个层次,比如第一个层次解析出请求的运营商,第二个层次解析出请求所在的地址,通过地址返回最近的数据中心所在的IP地址,再让客户端向对应的数据中心请求数据。

数据中心内部也可以按照当前服务器集群的资源,在内部做负载均衡,保证各个服务器的读写负载均衡。

Dig追随DNS查询过程:

使用dig这个命令行工具,可以显示DNS查询的过程:

dig www.baidu.com

$ dig www.baidu.com
// 第一段,版本信息,查询的参数和结果统计信息。
; <<>> DiG 9.10.6 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60950
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512

// 第二段,查询的内容,表示查询百度的域名的A(Address)记录
;; QUESTION SECTION:
;www.baidu.com. IN A

// 第三段,DNS服务器的答复结果:
;; ANSWER SECTION:
www.baidu.com. 600 IN CNAME www.a.shifen.com.
www.a.shifen.com. 112 IN A 220.181.38.149
www.a.shifen.com. 112 IN A 220.181.38.150

// 第四段,查询结果统计:
;; Query time: 56 msec
;; SERVER: 10.8.8.18#53(10.8.8.18)
;; WHEN: Sun Aug 01 17:05:31 CST 2021
;; MSG SIZE rcvd: 101

为了显示完整的查询过程,可以使用+trace参数,这个参数将显示从root DNS服务器递归查询的过程,可以很方便的定位DNS解析过程中的问题。

dig +trace www.baidu.com

; <<>> DiG 9.10.6 <<>> +trace www.baidu.com
// 查询根域名服务器。
;; global options: +cmd
. 499272 IN NS c.root-servers.net.
. 499272 IN NS k.root-servers.net.
...
// 通过本地DNS服务器,获取到了上面这些root DNS服务器的地址。
;; Received 228 bytes from 192.168.130.57#53(192.168.130.57) in 58 ms

// 查询到下面这些com域名服务器。
com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
...
// 通过荷兰的root DNS服务器获取到了上面这些com域名服务器的地址。
;; Received 1173 bytes from 193.0.14.129#53(k.root-servers.net) in 1504 ms
// 省略一些校验信息。

// 查询到baidu.com 权威DNS服务器。
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.
// 省略一些校验信息。
// 通过美国的com顶级DNS服务器查询到了上面这个baidu.com 权威DNS服务器的地址。
;; Received 761 bytes from 192.41.162.30#53(l.gtld-servers.net) in 1694 ms

// 查询到www.baidu.com 存在别名www.a.shifen.com。
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 ns1.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 ns5.a.shifen.com.
// 通过[河北省保定市 联通]的baidu.com的权威服务器查询到上面这个域名服务器的地址。
;; Received 239 bytes from 110.242.68.134#53(ns1.baidu.com) in 1194 ms

当DNS查询请求到别名的时候,查询就会终止,然后重新发起查询cname的请求。

; <<>> DiG 9.10.6 <<>> +trace www.a.shifen.com
// 省略和上面相似的查询内容。

// 查询到shifen.com的权威DNS服务器。
shifen.com. 172800 IN NS dns.baidu.com.
shifen.com. 172800 IN NS ns2.baidu.com.
shifen.com. 172800 IN NS ns3.baidu.com.
shifen.com. 172800 IN NS ns4.baidu.com.
// 省略一些校验信息。
;; Received 736 bytes from 192.43.172.30#53(i.gtld-servers.net) in 1242 ms

// 通过[北京市 电信互联网数据中心]的ns2.baidu.com这个DNS服务器,查询到了下面这些a.shifen.com的DNS服务器地址
a.shifen.com. 1200 IN NS ns4.a.shifen.com.
a.shifen.com. 1200 IN NS ns5.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 ns3.a.shifen.com.
;; Received 215 bytes from 220.181.33.31#53(ns2.baidu.com) in 1511 ms

// 通过[江苏省南京市 联通]的ns3.a.shifen.com查询到www.a.shifen.com的具体ip地址。
www.a.shifen.com. 300 IN A 110.242.68.4
www.a.shifen.com. 300 IN A 110.242.68.3
a.shifen.com. 1200 IN NS ns1.a.shifen.com.
a.shifen.com. 1200 IN NS ns2.a.shifen.com.
a.shifen.com. 1200 IN NS ns3.a.shifen.com.
// ...
;; Received 236 bytes from 112.80.255.253#53(ns3.a.shifen.com) in 1481 ms

而我们访问110.242.68.4这个ip地址,正是百度的首页!

DNS记录的类型

上面通过dig这个工具,我们可以直观的看到dns查询过程中的细节,而域名与IP之间的对应关系,称为"记录",dns查询就是在一层一层查询这些记录获取到自己想要方位的域名的IP地址。 常见的DNS记录有以下几类:

A记录:A(Address)记录是用来指定主机名(或域名)对应的IP地址记录。

NS记录:NS(Name Server)记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。

CNAME记录:CNAME(Canonical Name)别名记录,即多个域名可以映射到同一台主机上。

TTL值:TTL(Time-To-Live)DNS记录在DNS服务器中能存活的时间,TTL是IP协议包中的一个值,它告诉网络路由器包在网络中的时间是否太长而应被丢弃,当DNS服务器缓存了这条记录之后,在有效时间内,如果再次接收到对这条记录的查询请求,那么会直接使用缓存作为查询结果返回,

MX记录:MX(Mail Exchanger)邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器,简单说就是接收电子邮件的服务器地址。

PTR值:PTR是pointer的简写,用于将一个IP地址映射到对应的域名,也可以看成是A记录的反向,IP地址的反向解析域名。 PTR主要用于邮件服务器,比如邮箱AAA@companyA.com给邮箱BBB@companyB.com发了一封邮件,companyB的邮件服务器在接收到邮件时会分析这封邮件是由哪个IP地址发出来的,然后根据这个IP地址反向解析出域名,如果解析结果对应companyA.com的IP地址就接受这封邮件,否则就认为这封邮件的来源不明,拒绝接收这封邮件。


参考: