写在最前
本文亮点:
- 理清域名、IP、DNS的含义和作用
- 了解各级域名的不同,以及对应的 DNS 服务器
- 学习 DNS 查询流程、查询实际、查询请求的发起方式以及查询缓存的设计
- 与 DNS 相关的网络攻击手段
域名与 DNS 的引入
域名和IP地址
在学习 DNS 协议之前,我们先区分一下域名和 IP 地址这个两个概念:
- IP 地址:一长串能够唯一地标记网络上的计算机的数字。如172.20.214.63。另见 IP 协议。
- 域名:是由一串用点分隔的名字组成的互联网上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识。比如
www.baidu.com。
域名与IP为何不能二取其一
- IP 难记,域名可以简化记忆。虽说域名也没那么容易记,但互联网刚出现的时候,技术还不发达,没有搜索引擎啥的,所以使用域名还是很有必要的
- IP 简短,便于存储和传输。IP 只需要 32Byte,也就是 4 字节,而域名可能要几十个字节。
为了同时使用两种技术,就需要使用 DNS 协议。
DNS 协议可以使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。但大多数情况下 DNS 都使用 UDP 进行传输。
DNS 的作用
DNS(Domain Name System,域名解析系统)是一种可以将域名和IP地址相互映射的以层次结构分布的数据库系统。
说人话:它可以把域名解析为 IP 地址。
域名与 DNS 服务器
域名管理机构
全世界域名的最高管理机构,是一个叫做 ICANN (Internet Corporation for Assigned Names and Numbers)的组织,总部在美国加州。ICANN 负责管理全世界域名系统的运作。
域名层级
域名具有一定的层次结构,从上到下依次为:根域名、顶级域名、二级域名、三级域名……
根域名
由于 ICANN 管理着所有的顶级域名,所以它是最高一级的域名节点,被称为根域名(root domain)。在有些场合,www.xxx.com 被写成 www.xxx.com.,即最后还会多出一个点。这个点就是根域名。
由于根域名列表很少变化,大多数 DNS 服务商都会提供它的缓存,所以根域名的查询事实上不是那么频繁。
顶级域名 TLD
顶级域名(TLD),即最高层级的域名。简单说,就是网址的最后一个部分。
比如,网址
www.baidu.com的顶级域名就是.com。
ICANN 的一项主要工作,就是规定哪些字符串可以当作顶级域名。截至 2015 年 7 月,顶级域名共有 1058 个,它们大致可以分成两类:
- 一类是通用顶级域名(gTLD),比如
.com、.net、.edu、.org、.xxx等等,共有 700 多个。 - 另一类是国家顶级域名(ccTLD),代表不同的国家和地区,比如
.cn(中国)、.io(英属印度洋领地)、.cc( 科科斯群岛)、.tv(图瓦卢)等,共有 300 多个。
当然,ICANN 自己不会去管理这些顶级域名,因为根本管不过来。想想看,顶级域名有 1000 多个,每个顶级域名下面都有许多批发商,如果每个都要管,就太麻烦了。ICANN 的政策是,每个顶级域名都找一个托管商,该域名的所有事项都由托管商负责。ICANN 只与托管商联系,这样管理起来就容易多了。举例来说,.cn 国家顶级域名的托管商就是中国互联网络信息中心(CNNIC),它决定了 .cn 域名的各种政策。
二级域名 SLD
二级域名(Second Level Domain,SLD)在通用顶级域名或国家顶级域名之下具有不同的意义:
- 通用顶级域名下的二级域名:一般是指域名注册人选择使用的网上名称,如
yahoo.com(商业组织通常使用自己的商标、商号或其他商业标志作为自己的网上名称,如baidu.com) - 国家顶级域名下的二级域名:一般是指类似于通用顶级域名的表示注册人类别和功能的标志。例如,在
.com.cn域名结构中,.com此时是置于国家顶级域名.cn下的二级域名,表示中国的商业性组织,以此类推。
三级域名/子域名 SubDomain
三级域名是形如 www.baidu.com 的域名,可以当做是二级域名的子域名,特征为域名包含两个 .
对于域名所有者/使用者而言,三级域名都是二级域名的附属物而无需单独费用。
三级域名甚至不能称为域名,一般称之为域名下的「二级目录」。
各种 DNS 域名服务器
根域名服务器
根域名服务器(Root DNS Server)是 DNS 层次结构最高的服务器,它保存所有的「顶级域名服务器」的地址。
理论上所有域名的查询都必须先查询根域名,所以一般来说所有的域名服务器都会注册一份根域名服务器的 IP 地址的缓存,用于在必要的时候向其发送请求。
顶级域名服务器
顶级域名服务器(Top-Level Domain Name Server,也叫做 TLD 域名服务器)管理顶级域名,如 .com、.net 和 .org。
权威域名服务器
权威域名服务器(Authoritative DNS Server)是存储并管理特定区域内所有域名的服务器。
注意,此时不再按域名层级划分服务器,因为如果二三四级域名都对应一个服务器,那域名服务器数量会很多。
区和域其实是不同的,区可以有多种不同的划分方法。以百度为例,我们假设有 fanyi.baidu.com、ai.baidu.com、tieba.baidu.com 这三个三级域名。我们可以这样分区:
fanyi.baidu.com和tieba.baidu.com放在baidu.com权限域名服务器ai.baidu.com放在ai.baidu.com权限域名服务器中baidu.com权限域名服务器和ai.baidu.com权限域名服务器是同等地位的
而具体怎么分区是百度公司根据域名多少、访问多少等情况去自己规定的。
递归式域名服务器
递归式域名服务器(Recursive DNS Server)负责查询其他 DNS 服务器以解析域名。递归式域名服务器首先会查询根域名服务器上的信息,然后查询下一级域名服务器,直到找到包含相应信息的 DNS 服务器。
递归式域名服务器在 DNS 进行递归查询时生效。
本地域名服务器
本地域名服务器(Local DNS Server),也称为「缓存域名服务器」,是指在本地计算机或局域网内部设置的一台 DNS 服务器。这是电脑解析时的默认域名服务器,即电脑中设置的首选 DNS 服务器和备选 DNS 服务器。它通常由网络服务提供商(ISP)或者企业网络管理员来设置和管理。
本地域名服务器的作用是缓存其他 DNS 服务器返回的域名解析结果。当某个计算机或设备请求某个域名时,如果缓存中没有该域名的 IP 地址,本地域名服务器就会向其他 DNS 服务器发送请求,获取该域名的 IP 地址,并将其缓存起来,以便将来更快地响应该域名的请求。
本地域名服务器的设置可以提高域名解析的速度,并减轻 DNS 服务器的负载。同时,本地域名服务器还可以对 DNS 响应进行缓存和过滤,提高网络安全性和性能。
本地域名服务器可以是递归式域名服务器,但它们并不是完全等同的东西,递归式查询服务器在 DNS 进行「递归查询」时生效。
DNS 域名解析原理
两种查询模式
DNS 域名解析有两种模式:
- 递归模式(靠别人)
- 果 A 请求 B,而 B 本身并没有 A 所需的数据,则作为接收者的 B 也会成为请求方,去请求 C 获取数据。这就相当于 B 帮 A 去问 C
- 迭代模式(靠自己)
- 如果接收者 B 没有请求者 A 所需要的内容,接收者 B 将告诉请求者 A,如何去获得这个内容,但是 B 自己并不去发出请求。
根域名服务器压力大吗
DNS 查询时,如果本地域名服务器没有缓存,就会请求根域名服务器,那么根域名服务器压力会过大吗?
实际上,虽然根域名服务器确实会被频繁请求,但根域名服务器通过 DNS 任播技术部署在全球很多节点上,每个节点可以支持数百甚至上千个并发连接,以应对全球范围内客户 DNS 查询的负载。同时,由于 DNS 缓存机制的存在,DNS 解析的大部分请求都可以在本地缓存中解决,不需要再向根域名服务器发出查询请求。因此,尽管根域名服务器确实会受到一定的负载压力,但是它们的整体承载能力和稳定性强,基本不会出现崩溃的情况。
除此之外,一般来说,域名服务器之间的查询会使用迭代查询方式,这也是为了免根域名服务器的压力过大。
DNS 解析的时机
DNS 解析是在发起网络请求前进行的。
- 如果使用浏览器,在用户在浏览器中输入一个 URL 时,浏览器首先会检查其缓存中是否有该域名的 IP 地址。
- 如果没有缓存,或者直接使用
curl命令或程序发送网络请求(也就是说,没有浏览器缓存这一步),则会借助操作系统发起 DNS 解析请求。如果,那么发送请求的程序会调用操作系统提供的函数来解析主机名。
DNS 解析的发起方式
浏览器等程序最终都是借助操作系统发起 DNS 请求的,而操作系统在需要进行 DNS 查询时,需要借助操作系统提供的 Socket 库中的 DNS 解析器 API 即可。具体来说,在编写浏览器等应用程序的时候,只要在代码中写上解析器的名字“gethostbyname”以及要查询的 Web 服务器的域名就可以了
Socket 库会发送 UDP 消息给网卡,而网卡再通过网络连接发到 DNS 服务器上。
DNS 解析流程与 DNS 缓存
- 首先会查看「浏览器 DNS 缓存」
- 没有的话就查询「操作系统 DNS 缓存」。操作系统的缓存其实是用户自己配置的 hosts 文件
- 还没有就询问「本地域名服务器」(就是网络提供商,一般这个服务器都会有自己的缓存,所以 IP 查询大多都在这里完成)
- 如果依然没有缓存,那就需要通过「根域名服务器」和「TLD 域名服务器」再到对应的「权威 DNS 服务器」找记录(每一个服务器都会有缓存),直到找到域名对应的 IP 地址
- 将查询到的 IP 地址缓存到「本地域名服务器」,然后本地域名服务器再将记录返回给本地