Contents
  1. 1. 查询过程
  2. 2. DNS服务器
  3. 3. 域名的层级
  4. 4. DNS 的记录类型
  5. 5. DNS协议报文
  6. 6. 实例
  7. 7. 参考链接

域名系统(英文:Domain Name System,缩写:DNS),是互联网的重要基础协议,作用就是根据域名查出对应的IP地址。

它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。

DNS同时使用TCP和UDP协议,端口53。

查询过程

虽然dns只返回一个ip地址,但是查询过程非常复杂,一般分为多个步骤。

linux命令行工具可以显示整个查询过程。

1
dig math.stackexchange.com

输出内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; <<>> DiG 9.9.5-9+deb8u16-Debian <<>> math.stackexchange.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19662
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;math.stackexchange.com. IN A

;; ANSWER SECTION:
math.stackexchange.com. 68 IN A 151.101.1.69
math.stackexchange.com. 68 IN A 151.101.65.69
math.stackexchange.com. 68 IN A 151.101.129.69
math.stackexchange.com. 68 IN A 151.101.193.69

;; Query time: 227 msec
;; SERVER: 10.0.2.3#53(10.0.2.3)
;; WHEN: Sat Nov 10 22:03:00 CST 2018
;; MSG SIZE rcvd: 115
  • 第一段是查询参数和统计;
  • 第二段是查询内容,查询域名math.stackexchange.com的A记录,A是address的缩写;
  • 第三段是DNS服务器的答复;上面结果显示,math.stackexchange.com有四个A记录,即四个IP地址。68是TTL值(Time to live 的缩写),表示缓存时间,即68秒之内不用重新查询;
  • 第四段是DNS服务器的一些传输信息。

DNS服务器

DNS服务器的IP地址,有可能是动态的,每次上网时由网关分配,这叫做DHCP机制。

也有可能是事先指定的固定地址。Linux系统里面,DNS服务器的IP地址保存在/etc/resolv.conf文件。

上例的DNS服务器是10.0.2.3,这是一个内网地址。有一些公网的DNS服务器,也可以使用,其中最有名的就是Google的8.8.8.8和Level 3的4.2.2.2。

dig命令有一个@参数,显示向指定DNS服务器查询的结果。

1
$ dig @4.2.2.2 math.stackexchange.com

域名的层级

DNS查询有两种方式:递归和迭代。DNS客户端设置使用的DNS服务器一般都是递归服务器,它负责全权处理客户端的DNS查询请求,直到返回最终结果。而DNS服务器之间一般采用迭代查询方式。

DNS服务器怎么会知道每个域名的IP地址呢?答案是分级查询。

请仔细看前面的例子,每个域名的尾部都多了一个点。

比如,域名math.stackexchange.com显示为math.stackexchange.com.。这不是疏忽,而是所有域名的尾部,实际上都有一个根域名。

举例来说,www.example.com真正的域名是www.example.com.root,简写为www.example.com.。因为,根域名.root对于所有域名都是一样的,所以平时是省略的。

根域名的下一级,叫做”顶级域名”(top-level domain,缩写为TLD),比如.com、.net;再下一级叫做”次级域名”(second-level domain,缩写为SLD),比如www.example.com里面的.example,这一级域名是用户可以注册的;再下一级是主机名(host),比如www.example.com里面的www,又称为"三级域名",这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。

总结一下,域名的层级结构如下。

1
2
3
主机名.次级域名.顶级域名.根域名
# 即
host.sld.tld.root

DNS 的记录类型

域名与IP之间的对应关系,称为”记录”(record)。根据使用场景,”记录”可以分成不同的类型(type),前面已经看到了有A记录和NS记录。

常见的DNS记录类型如下。

  1. A:主机记录(Address),返回域名指向的IP地址。
  2. NS:名字服务器,本域的服务器名,域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
  3. MX:邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。
  4. CNAME:别名记录,规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转。
  5. PTR:逆向查询记录(Pointer Record),只用于从IP地址查询域名。
  6. IPv6主机记录(AAAA记录): RFC 3596定义,与A记录对应,用于将特定的主机名映射到一个主机的IPv6地址。

CNAME 记录主要用于域名的内部跳转,为服务器配置提供灵活性,用户感知不到。
由于CNAME记录就是一个替换,所以域名一旦设置CNAME记录以后,就不能再设置其他记录了(比如A记录和MX记录)。

NS记录(Name Server的缩写),即哪些服务器负责管理域名的DNS记录。

DNS协议报文

dns请求和应答都是用相同的报文格式,分成5个段(有的报文段在不同的情况下可能为空),如下:

1
2
3
4
5
6
7
8
9
10
11
+---------------------+
| Header | 报文头
+---------------------+
| Question | 查询的问题
+---------------------+
| Answer | 应答
+---------------------+
| Authority | 授权应答
+---------------------+
| Additional | 附加信息
+---------------------+

Header段是必须存在的,它定义了报文是请求还是应答,也定义了其他段是否需要存在,以及是标准查询还是其他。

实例

执行 dig baidu.com,使用wireshark抓包,查看请求与响应报文,本次请求抓包看到使用的是UDP协议。那么为什么只是用了UDP协议呢?留个悬念。

1
dig baidu.com

返回解决如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; <<>> DiG 9.9.5-9+deb8u16-Debian <<>> baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26178
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;baidu.com. IN A

;; ANSWER SECTION:
baidu.com. 195 IN A 220.181.57.216
baidu.com. 195 IN A 123.125.115.110

;; Query time: 226 msec
;; SERVER: 10.0.2.3#53(10.0.2.3)
;; WHEN: Sat Nov 10 23:12:39 CST 2018
;; MSG SIZE rcvd: 70

wireshark

请求报文:
wireshark请求

响应报文:
wireshark响应

参考链接

  1. https://zh.wikipedia.org/zh-hans/%E5%9F%9F%E5%90%8D%E7%B3%BB%E7%BB%9F
  2. http://www.ruanyifeng.com/blog/2016/06/dns.html
Contents
  1. 1. 查询过程
  2. 2. DNS服务器
  3. 3. 域名的层级
  4. 4. DNS 的记录类型
  5. 5. DNS协议报文
  6. 6. 实例
  7. 7. 参考链接