前言
英译汉的时候会掩盖很多本质,导致很多问题稀里糊涂,问的人不知道怎么说,回答的人也是答非所问。
DNS是Domain Name System缩写,不是Domain Name Server,或者Domain Name Software。有的时候还有个名词叫 Name Server,汉语就不翻译了,越翻译越混乱。下面2篇文章介绍了这两者区别。
What is the difference, if any, between DNS server and name server?
The Difference Between DNS and Name Servers
Are Domain Name Server and Name Server the same thing?
在学习dig和nslookup的时候遇到了DNS record types(域名系统记录类型),再次记录一下,后续再更新
DNS系统中,常见的资源记录类型有
- 主机记录(A记录):RFC 1035定义,A记录是用于名称解析的重要记录,它将特定的主机名映射到对应主机的IP地址上。
- 别名记录(CNAME记录): RFC 1035定义,CNAME记录用于将某个别名指向到某个A记录上,这样就不需要再为某个新名字另外创建一条新的A记录。
- IPv6主机记录(AAAA记录): RFC 3596定义,与A记录对应,用于将特定的主机名映射到一个主机的IPv6地址。
- 服务位置记录(SRV记录): RFC 2782定义,用于定义提供特定服务的服务器的位置,如主机(hostname),端口(port number)等。
- NAPTR记录:RFC 3403定义,它提供了正则表达式方式去映射一个域名。NAPTR记录非常著名的一个应用是用于ENUM查询。
域名系统Berkeley Internet Name Domain, BIND)。
FQDN
类比
hostname相当于 “张三“,全国叫张三的几千万,怎么区分?
domain main相当于加上户籍地址,将张三进一步细化。
FQDN = hostname + domain name,相当于四川省.成都市.成华区.建设北路2段4号张三
现实情况
在互联网上很多主机hostname都叫www,但是他们的domain name都不一样,例如 www.google.com.tw, www.seednet.net, www.hinet.net 等等,他们的domain name分别是.google.com.tw, .seednet.net, .hinet.net 等等。
学数据结构的时候,二叉树事递归定义的。DNS与二叉树类似,上一层的FQDN相当于下一层的domain name。
注:图片引自http://linux.vbird.org/linux_server/0350dns.php,只为说明DNS分层递归定义情况。如有问题请告知,及时删除。
注:小数点.不一定区分hostname与domain name
TLDs(Top Level Domains)
注:图片引自http://linux.vbird.org/linux_server/0350dns.php,只为说明DNS分层递归定义情况。如有问题请告知,及时删除。
root DNS server用.表示
顶层域名 = 通用顶层域名 + 国家码顶层域名
通用顶层域名:包括.com .org .gov .edu .net .mil .jobs .info .asia等等
国家码顶层域名:包括.uk .jp等等
https://www.slashroot.in/what-dns-zone-file-complete-tutorial-zone-file-and-its-contents
https://www.slashroot.in/how-dns-works
DNS分层查询
DNS是分层的,每一层DNS server认为他下边的client (这些client其实也都是DNS server)都是hostname,他只需要维护 hostname<—>IP address的映射即可。域名解析的过程 和 快递流程是一样的,其解析过程是从大范围到小范围,对应域名上是自右向左。快递首先回查ccTLDs,属于中国。然后查看属于哪个省,一看四川。再看属于哪个市,继而哪个区,那个街道,那个小区,哪号楼,那个房间。。。
上图中的DNS server在Linux里面指的是/etc/resolv.conf 里面配置的DNS server。一旦解析域名成功,DNS server会缓存一份,以防止其他主机有类似请求。缓存是有时效的,超过指定时间缓存作废,在执行一边DNS解析过程(即经过 . 在向下一层查询的过程)。
客户机只要只想互联网上任何一个DNS服务器就能解析全球的域名。