DNS是如何工作的
当浏览网页,发送邮件或使用App时,背后都有一个默默工作的基础功能,也就是DNS(域名系统,Domain Name System)。他将容易记的域名如www.bilibili.com转换成机器可读的IP地址如127.0.0.1,方便人们不需要人脑记复杂的ip
1. 为什么需要DNS
互联网上的每一台设备都有一个唯一的IP地址,用于定位和通信。但IP地址由数字组成,难以记忆和传播。例如访问www.bilibili.com网站,你可能会记住 bilibili.com,而不是 134.166.250.23(IPv4)或 2404:6800:4008:c03::be(IPv6)这种复杂的地址。
早期互联网使用一个名为 HOSTS.TXT 的文本文件来维护域名与IP的映射关系,由中央管理机构(SRI的NIC)定期更新并分发。但随着网络规模爆炸式增长,这种集中式管理暴露出严重问题,如文件体积越来越大,下载负担重。主机名冲突。单点故障风险高。
于是,DNS 在1983年被提出,后经多次修订成为今天的标准。它采用分布式、层次化的数据库,将域名管理权分散到各级机构,既保证了扩展性,又提高了可靠性和效率。
2. DNS的层次结构
DNS的命名空间是一个树状结构,类似文件系统的目录树。树的每个节点代表一个域名,叶子节点通常是具体的主机。
一个完整的域名(FQDN,Fully Qualified Domain Name)从根开始,由“.”分隔成多个标签。例如 www.bilibili.com.(最后的点表示根,通常省略)。
- 根域(Root Domain):树的最高层,由“.”表示。根域下是所有顶级域。
- 顶级域(TLD,Top-Level Domain):如
.com、.org、.net、国家代码.cn、.uk等。每个TLD由专门的注册管理机构管理(如Verisign管理.com和.net)。 - 二级域(Second-Level Domain):在TLD下注册的名称,如
example.com,通常由个人或组织申请。 - 子域(Subdomain):二级域下的进一步划分,如
www.bilibili.com、a.bilibili.com,可由域名所有者自行创建。
没有一个服务器存储所有域名信息。每个层级都有对应的权威域名服务器,负责维护本层级的记录,并指向下一层级的服务器。这种委托机制使得管理权分散,任意一个区域出现故障不会影响全局。
例如,管理 .com 的服务器不存储 www.bilibili.com 的具体IP,但知道哪个权威服务器负责 www.bilibili.com ,并把查询指引过去。
3. DNS服务器类型
- 本地递归解析器(Local Recursive Resolver)
通常由你的ISP(互联网服务提供商)或公共DNS服务(如Google的8.8.8.8,Cloudflare的1.1.1.1)提供。它负责接收客户端的查询请求,并代为完成整个域名解析过程,最后将结果返回给客户端。它会缓存结果以加速后续查询。
- 根域名服务器(Root Name Server)
全球有13组根服务器(逻辑上13个地址,背后有多台物理服务器,使用任播技术分布世界各地)。它们存储顶级域(TLD)的权威服务器信息(即告诉查询者 .com 的服务器在哪)。根服务器不负责具体域名,只提供TLD的指引。
- 顶级域域名服务器(TLD Name Server)
管理特定顶级域(如 .com)的服务器。它们知道该TLD下所有二级域的权威服务器地址。例如,查询 bilibili.com,TLD服务器会告知 bilibili.com 的权威服务器是 ns3.dnsv5.com 等。
- 权威域名服务器(Authoritative Name Server)
负责存储特定域名的DNS记录(如A记录、MX记录等)。权威服务器是最终回答域名IP的地方。通常由域名所有者(如公司自己)或托管服务商(如Cloudflare,AWS Route 53)维护。
- 客户端(Stub Resolver)
嵌在操作系统中的解析器(如Linux的glibc解析器)。它负责向本地递归解析器发起查询,并等待结果。
4. DNS解析过程
假设你在浏览器里输入 www.bilibili.com,浏览器首先得知道这个网站的IP才能连接。整个过程分两种查询模式:递归查询和迭代查询。一般来说,从你电脑到本地解析器是递归查询,而本地解析器去问各个权威服务器是迭代查询。
你的电脑向本地DNS服务器(可能是你路由器分配的,比如192.168.1.1,或者你手动设的8.8.8.8)发出请求:帮我查查 www.bilibili.com 的IP,你不知道的话就帮我去找,最后把结果告诉我。 本地解析器必须给你一个答案,不管是找到IP了还是报错。本地解析器收到你的请求后,就开始自己跑腿了。
先问根域名服务器,再去问顶级域服务器,最后问权威域名服务器,本地解析器拿到IP后,先把它缓存起来,然后把这个IP返回给你的电脑。你的操作系统拿到IP交给浏览器,浏览器就可以发起连接,打开网页了。
缓存是为了不让根服务器和顶级域服务器累趴下,DNS到处都用缓存。每一级查询的结果(比如根指引、顶级域指引,还有最终IP)都会被本地解析器存一段时间,存多久由每条记录的TTL(生存时间)决定。下次有人问同一个域名,本地解析器直接用缓存里的结果,省得再跑一趟。
DNS记录常见类型
- A 把域名指向一个IPv4地址 (blf1287.asia. IN A 192.0.2.1)
- AAAA 把域名指向一个IPv6地址(blf1287.asia. IN AAAA 2001:db8::1/)
- CNAME 把一个域名指向另一个域名(比如a.w.bilicdn1.com是www.bilibili.com 的别名)
- MX 邮件交换记录 告诉别人发邮件到这个域名该用哪个邮件服务器,还有优先级
- NS 指定这个域名的权威DNS服务器是哪个
- TXT 存一些文本信息,常用来做验证,比如SPF或DKIM

