DNS域名系统
域名系统(英文:Domain Name System,缩写:DNS),是互联网的重要基础协议,作用就是根据域名查出对应的IP地址。
它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
DNS同时使用TCP和UDP协议,端口53。
查询过程
虽然dns只返回一个ip地址,但是查询过程非常复杂,一般分为多个步骤。
linux命令行工具可以显示整个查询过程。
1 | dig math.stackexchange.com |
输出内容如下:
1 | ; <<>> DiG 9.9.5-9+deb8u16-Debian <<>> math.stackexchange.com |
- 第一段是查询参数和统计;
- 第二段是查询内容,查询域名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 | 主机名.次级域名.顶级域名.根域名 |
DNS 的记录类型
域名与IP之间的对应关系,称为”记录”(record)。根据使用场景,”记录”可以分成不同的类型(type),前面已经看到了有A记录和NS记录。
常见的DNS记录类型如下。
- A:主机记录(Address),返回域名指向的IP地址。
- NS:名字服务器,本域的服务器名,域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
- MX:邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。
- CNAME:别名记录,规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转。
- PTR:逆向查询记录(Pointer Record),只用于从IP地址查询域名。
- IPv6主机记录(AAAA记录): RFC 3596定义,与A记录对应,用于将特定的主机名映射到一个主机的IPv6地址。
CNAME 记录主要用于域名的内部跳转,为服务器配置提供灵活性,用户感知不到。
由于CNAME记录就是一个替换,所以域名一旦设置CNAME记录以后,就不能再设置其他记录了(比如A记录和MX记录)。
NS记录(Name Server的缩写),即哪些服务器负责管理域名的DNS记录。
DNS协议报文
dns请求和应答都是用相同的报文格式,分成5个段(有的报文段在不同的情况下可能为空),如下:
1 | +---------------------+ |
Header段是必须存在的,它定义了报文是请求还是应答,也定义了其他段是否需要存在,以及是标准查询还是其他。
实例
执行 dig baidu.com
,使用wireshark抓包,查看请求与响应报文,本次请求抓包看到使用的是UDP协议。那么为什么只是用了UDP协议呢?留个悬念。
1 | dig baidu.com |
返回解决如下:
1 | ; <<>> DiG 9.9.5-9+deb8u16-Debian <<>> baidu.com |