DNS 域名解析

article/2025/7/29 15:45:14

介绍域名

网域名称(英语:Domain Name,简称:Domain),简称域名、网域。

域名是互联网上某一台计算机或计算机组的名称。

域名可以说是一个 IP 地址的代称,目的是为了便于记忆。例如,wikipedia.org 是一个域名。人们可以直接访问 wikipedia.org 来代替 IP 地址,然后 DNS 系统就会将域名转化成便于机器识别的 IP 地址。这样,人们只需要记忆 wikipedia.org 这一串带有特殊含义的字符,而不需要记忆没有含义的数字。

域名的结构

域名由多个部分组成,每个部分由 “.” 点分隔。最右边的一个部分是顶级域名,从右侧到左侧隔一个点依次下降一层。每个部分可以包含 1 到 63 个字节。域名的总长度则不能超过 253 个字节。域名里的英文字母不区分大小写。


image-20230209222449782.png

整个互联网中的域名空间结构就像一棵倒置的树,如上图所示。

  • 这棵域名树的根称为根 DNS 服务器,在 Internet 上总共有 13 个根 DNS 服务器(每个根 DNS 服务器都是一个集群),大部分位于北美。
  • 根往下的第一级节点称为顶级域(Top Level Domain,TLD),目前共有 7 个这样的顶级域名,分别是:1.com 商业组织;2.edu 教育机构;3.gov 政府部门;4.mil 军事部门;5.net 网络基础设施;6.org 非营利性组织;7.int 国际组织。每个顶级域由对应的顶级域(TLD)服务器负责管理,除了以上 7 个顶级域名,还有各个国家的顶级域名(如 cn、uk、ca 和 fr 等)也在这一级别进行管理。
  • 每个顶级域再向下展开分支,每个分支域都是一个子域。比如 CDNbook.com 是顶级域 com 的子域。CDNbook.com 也可以再包含子域,比如 a.CDNbook.com、b.CDNbook.com。**一个域就是域名空间中的一棵子树。域的名字也就是这棵子树的根节点的域名。**例如在下图中,CDN.com 域的顶端节点就是 CDN.com。

image-20230209223812002.png


在每个域中,会有一台或多台服务器用来保存这个域名空间的所有信息,并且响应关于该域名空间的所有请求。这种服务器就叫做这个域的权威域名服务器(也常称为授权域名服务器),它拥有这个域所有的域名信息。

每个域都可以分为多个子域,而每个权威域名服务器可以给一个或多个区域进行解析。但即使各个区域被授权给同一个权威域名服务器,它们之间仍然是彼此独立的。例如,CDNbook.com 被划分为三个子域:a.CDNbook.com、b.CDNbook.com 和 c.CDNbook.com。每个子域都可以自行维护自己的权威域名服务器。当一个子域被授权出去,它原本所属的域就不再包含它的数据(A 记录),而只留下一些指针,这些指针指向相应子域的权威域名服务器(NS 记录)。如果有一个询问该子域信息的请求,所返回的应该是该子域的权威域名服务器列表。

一个域可以有多台权威域名服务器,但是只有一台是主域名服务器,这台主域名服务器负责向其他辅域名服务器分发每个域名空间的更新信息。


根 DNS 服务器、顶级 DNS 服务器和权威 DNS 服务器共同组成了 DNS 服务器层,共同维护分布式、层次化的 DNS 数据库。

DNS 系统采用树形设计的一个主要目的就是为了分散管理。而这种分散管理是通过 “授权” 来实现的。对域进行授权,就是域管理组织把子域授权给其他组织进行管理,由子域管理者来维护子域中的数据,可以自由改动数据,包括对子域再进行划分,再授权。

域名解析

域名解析包括正向解析和反向解析。

  • 正向解析是把域名转换为 IP 地址。这需要由专门的域名解析服务器来完成。
  • 反向解析是把 IP 地址转换为域名。反向解析比较罕见,.arpa 顶级域名专门用于这类用途。

本地 DNS 服务器收到客户端的域名解析请求后,会采用递归查询方式(recursive query)或者迭代查询方式(iterative query)向 DNS 系统中的其他远程 DNS 服务器发送查询请求。

  • 迭代查询方式指的是:每次查询请求都由【本地 DNS 服务器】发起,收到答复后再由【本地 DNS 服务器】向下一个远程 DNS 服务器发送查询请求,直到获得结果。
  • 递归查询方式指的是:【本地 DNS 服务器】向【根 DNS 服务器】发送查询请求,并从【根 DNS 服务器】获取域名的解析结果。

image-20230225172236793.png


在实际应用中,迭代查询方式是比较常见的。下图描述的就是一个典型的 DNS 递归查询过程。

当用户在浏览器的地址栏中输入 URL 并点击回车后,浏览器首先判断 URL 中的是 IP 地址,还是域名。如果 URL 中的是域名,那么首先要做的就是域名解析。

域名解析的流程:首先是浏览器查看浏览器的缓存。如果浏览器中没有该域名的缓存,那么浏览器询问【本地 DNS 解析器】,【本地 DNS 解析器】首先查看本地 DNS 缓存。如果本地 DNS 缓存中没有该域名的缓存,那么【本地 DNS 解析器】请求【本地 DNS 服务器】进行域名解析。如果【本地 DNS 服务器】中没有该域名的缓存,那么【本地 DNS 服务器】向 DNS 系统中的其他远程 DNS 服务器发送查询请求。

不能把数据永远放在缓存中,缓存中的数据都被设置了一个生存时间(time to live,TTL)。超过 TTL 时间的数据会被清除,需要再重新获取新的数据。


image-20230209231325837.png

以【本地 DNS 解析器】请求【本地 DNS 服务器】进行 www.CDNbook.com 域名的解析为例:

(1)【本地 DNS 解析器】向【本地 DNS 服务器】发送域名解析请求。(8)【本地 DNS 解析器】收到来自【本地 DNS 服务器】的应答。

(2)【本地 DNS 服务器】向【根 DNS 服务器】发送域名解析请求,【根 DNS 服务器】返回 .com 顶级域的域名服务器列表(多条 NS 记录)。

(4)【本地 DNS 服务器】收到应答后,在 .com 顶级域的域名服务器列表中选择一个 IP 地址,向这个 IP 地址对应的 DNS 服务器发送域名解析请求,.com 顶级域的域名服务器返回 CDNbook.com 域的域名服务器列表。

(6)【本地 DNS 服务器】收到应答后,在 CDNbook.com 域的域名服务器列表中选择一个 IP 地址,向这个 IP 地址对应的 DNS 服务器发送域名解析请求,CDNbook.com 域的域名服务器返回 www.CDNbook.com 域的 A 记录列表(多个 IP 地址)。

(8)【本地 DNS 服务器】收到应答后,在 www.CDNbook.com 域的 A 记录列表中选择一个 IP 地址,将该 IP 地址返回给【本地 DNS 解析器】。

记录类型

域名服务器是根据资源记录来对域名解析请求进行应答的。在 DNS 系统中,最常见的资源记录是 Internet 类记录。

资源记录是一个包含了下列字段的 4 元组:Name、Value、Type、TTL。

  • TTL 是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间
  • Type 是该记录的类型
  • Name 和 Value 的值取决于 Type

Internet 类资源记录主要分为以下几种类型:

  • A 记录,Address:A 记录用于描述域名到 IP 地址的映射关系。将域名指向一个 IPv4 地址。同一个域名,可以有多条 A 记录。也就是说,一次 DNS 查找可以返回多个 IP 地址。
  • NS 记录,Name Server:NS 记录是域名服务器记录,用于指定该域名由哪个 DNS 服务器来进行解析。每个区域可以有多个域名服务器,因此可以有多条 NS 记录。如果需要把子域名交给其他的 DNS 服务器来进行解析,就需要添加 NS 记录。
  • SOA 记录,Start Of Authority:SOA 记录用于指定该区域的权威域名服务器。每个区域允许且只允许有一个 SOA 记录,它是资源记录的第一个条目。
  • CNAME 记录,Canonical Name:CNAME 记录是规范名称,用于描述域名到规范名称的映射关系。将域名指向另外一个域名,指向的域名是规范名称。【本地 DNS 服务器】收到 CNAME 记录后,它会用 CNAME 记录中的规范名称来重新查询新域名的 A 记录。
  • PTR 记录,Pointer Record:PTR 记录是逆向查询记录,返回一个域名,它用于根据 IP 地址查询域名(反向解析)。逆向查询的一个应用是:可以防止垃圾邮件,即验证发送邮件的 IP 地址,是否真的有它所声称的域名。

image-20230208230650583.png

假设有上述的 DNS zone:当要查询 bar.example.com 的 A 记录时,域名解析服务器会查到对应的 CNAME 记录,即foo.example.com,随即开始查询 foo.example.com 域名的 A 记录,查到 192.0.2.23 返回结果。

CNAME 的意思是真实名称。正确的理解是:bar.example.com 的真实名称是 foo.example.com。请求访问bar.example.com 的客户端会得到 foo.example.com 返回的结果。

域名的应用

域名服务器可以将域名映射为 IP 地址。基于这个特点,域名解析除了可以用于浏览器之外,域名解析还可以用于以下的场景:

  • 基于域名实现重定向:使用域名代替 IP 地址。可以让对外提供服务的域名不变,而主机的 IP 地址任意变动。当主机有情况需要下线、迁移时,可以更改 DNS 记录,让域名映射到其他的 IP 地址。
  • 基于域名搭建名字服务器:因为域名是一个名字空间,所以可以使用 BIND 9 等开源软件搭建一个内网的本地 DNS 服务器作为名字服务器。这样我们开发的各种内部服务就可以都用域名来标记,比如数据库服务都用域名 “mysql.inner.app”,商品服务都用 “goods.inner.app”,发起网络通信时使用域名,不必再使用写死的 IP 地址了。
  • 基于域名实现负载均衡,从而提高系统的可用性:基于域名实现负载均衡有两种方式:
    • 第一种方式:域名解析返回多个 IP 地址,客户端收到多个 IP 地址后,自己根据负载均衡策略选择一个 IP 地址使用,把请求分发到不同的服务器。
    • 第二种方式:域名解析内部配置负载均衡策略,在 DNS 端把请求分发到不同的服务器。

参考资料

《CDN 技术详解》雷葆华著

CDN技术详解-雷葆华著-微信读书 (qq.com)

DNS 原理入门 - 阮一峰的网络日志 (ruanyifeng.com)

06 | 域名里有哪些门道? (geekbang.org)


http://chatgpt.dhexx.cn/article/2iyuTJv0.shtml

相关文章

DNS 服务器选择

DNS 服务器选择 重要的事情写到前面,因为现在是快餐文化,快餐阅读,没有人愿意静下心研究和和阅读了。 本文主要介绍了一些DNS的测试速度,不介意直接拿去使用,如需使用还需要自己测试才行,就算我们找到了最…

怎么选最快dns服务器,如何选择适合自己的最快的DNS服务器?-

DNS在平时上网扮演着重要的角色,如果不注意DNS的话,可能会导致网速慢、弹出广告、网址打不开等一系列问题。那么有哪些比较好的DNS服务器呢?参考下图。 默认情况下,我们使用运营商分配的DNS,也可以使用公共DNS&#xf…

设置正确的DNS

上网或下载软件慢问题,除去少数设备陈旧、感染病毒、网卡硬件故障和网卡驱动错误方面的因素,绝大部分原因是由于部分上网电脑或家用无线路由器设置了错误的DNS造成的,正确的方法是应该在电脑或路由器上使用本地互联网营运商(以下简…

将字符串转换为数字(a_to_i)

大部分人看到这样的题目,觉得很简单,很多人就会写出如下程序: int My_atoi(const char* str) { int val 0; while(*str ! \0) { val val * 10 *str - 0; str; } return val; } 这个程序是没有问题的…

java 如何将数值型字符转换为数字_Java 如何将字符串转换为数字 专家详解

在编程中我们经常需要进行各种数据类型之间的转换操作,下面将为您介绍如何将字符串转换为数字。首先我们需要了解各种数据类型的表示,String在java中为字符串类型,int在java中为整数类型,大小在-2147483648到2147483647 之间,long为长整形,可以表示的数值大小比int大很多…

C++中将字符串转换为数字

C中将字符串转换为数字 法一&#xff1a; int t s[len - 1]-0;//减去一个 0 是 将最后一位字母转换成数字例如&#xff1a;这个判断基偶性就是为了防止越界所以将数组转换为数组传入&#xff0c;再将最后一位字母转换位数字判断其基偶性 #include<iostream> using n…

C语言将字符串转换为数字

最近做了一些需要使用字符串形势获取数字的程序&#xff0c;这里就牵扯到了字符串类型和数字类型的转换问题&#xff0c;以下是C语言中&#xff0c;字符串类型转换为数字类型的方法。 1.问题描述 数字既能以字符串形式储存&#xff0c;也能以数值形式储存&#xff0c;把数字储…

C/C++编程笔记:如何将字符串转换为数字,数字转换为字符串?

通常&#xff0c;或更具体地说&#xff0c;在竞争性编程中&#xff0c;有许多情况需要将数字转换为字符串或将字符串转换为数字。但是缺乏某些必不可少的工具的知识使我们不得不这样做。本文介绍了一些实现此任务的方法。 将字符串转换为数字 方法1&#xff1a;使用stringstr…

32程序员面试被拒,嫌弃太老,“大龄程序员”将何去何从

随着互联网的高速发展变革&#xff0c;大龄恐惧症越来越多地在技术圈被人讨论。很多程序员在工作5-10年以后&#xff0c;都会开始思考5年、10年甚至更久以后的自己&#xff0c;会是怎样一种生活工作状态&#xff0c;以及是否会被时代抛弃。 随着前段时间一位32的程序员被拒面试…

大龄程序员的未来在何方,该何去何从?

大龄程序员的界定 老早网上有人说&#xff0c;软件开发干不过30岁&#xff0c;后来又有人说干不过35岁&#xff0c;后来又有人说干不过40岁&#xff0c;后来又有人说干不过45岁……各种说法很多&#xff0c;这里我采取通俗的说法&#xff0c;认为过了30岁的程序员算是大龄程序…

大龄程序员书单

本职专业序列 24小时365天不间断服务: 服务器基础设施核心技术&#xff08;运维基础&#xff09; 云原生基础架构&#xff1a;构建和管理现代可扩展基础架构的模式及实践 企业迁云实践 生产微服务&#xff08;推荐&#xff09; 可伸缩服务架构&#xff1a;框架与中…

大龄程序员

要是写代码写到三十岁没升到管理怎么办啊&#xff1f; 我每天还在写代码&#xff0c;与人讨论技术实现细节&#xff0c;35 岁那年&#xff0c;我写的 Moco 拿了 Oracle 的 Duke 选择奖。 思维误区 我还没开始工作的时候&#xff0c;有人就在说&#xff1a;程序员能做到 30 岁…

35岁的程序员真的到头了么?国外的大龄程序员在干什么?

在Quora有个帖子&#xff1a; 我今年35岁了&#xff0c;是不是太老了&#xff0c;没法加入Google, Facebook, Microsoft 或者 Apple了&#xff1f; 下面的回复让人叹为观止&#xff0c;我摘录几个&#xff1a; 萨特南辛格 Google软件工程师 (2017–present) 不&#xff0c;…

大龄程序员的一次考研之旅

现在程序员的世界越来越卷&#xff0c;如果想拿到一个不错的offer&#xff0c;势必再聊完技术之外&#xff0c;HR也会关注你的学历&#xff0c;是否211&#xff1f;985 &#xff1f;也许有人说&#xff0c;只要技术好就能拿到offer&#xff0c;云云。是的&#xff0c;技术能力确…

35岁大龄程序员职业转型规划

35岁大龄程序员职业转型规划 I. 引言 在当今快速发展的IT行业&#xff0c;程序员这个职业变得越来越重要。但是&#xff0c;对于35岁以上的程序员来说&#xff0c;面临的职业困境也越来越严峻。他们不仅面临着技术的迭代更新&#xff0c;而且还面临着市场的竞争和年轻程序员的…

大龄程序员找工作,为什么这么难?能力与年龄不匹配

背景 今年的金三银四快结束了&#xff0c;公司还在招人&#xff0c;可筛选的人才真是越来越少&#xff0c;于是在简历筛选时&#xff0c;将学历和年龄都适当的放松了。正因为如此&#xff0c;面试了不少大龄的程序员。 网络上一直有讨论大龄程序员找工作困境的话题&#xff0…

35岁以后的大龄程序员,正处于怎样一种状态?

前言 随着互联网的高速发展变革&#xff0c;大龄恐惧症越来越多地在技术圈被人讨论。很多程序员在工作5-10年以后&#xff0c;都会开始思考5年、10年甚至更久以后的自己&#xff0c;会是怎样一种生活工作状态&#xff0c;以及是否会被时代抛弃。 特别是全民创业的这几年&…

大龄程序员的出路究竟在何处?从369个过来人问答贴里,我们得到了答案

前几天&#xff0c;程序员节的到来让程序员这个职业又一次涌上热搜。 在这个特殊的节日&#xff0c;不少大牛也纷纷发表了自己的祝福&#xff0c;其中360创始人周鸿祎通过个人微博发布了相关视频其中关于程序员35岁就会被淘汰的话题引起了程序员们的热议。 在视频中&#xff…

我今年50岁了,还在干前端

程序员圈流传着这样一个段子&#xff1a;35岁之后&#xff0c;干前端去送外卖&#xff1b;搞后端去开滴滴&#xff1b;运维就去买保险…… 招人不要35岁的&#xff0c;裁人清理35岁的&#xff0c;不知道什么时候开始&#xff0c;35岁成了职业生涯的拐点&#xff0c;中年危机逐…

35岁以上的大龄程序员们,后来都干什么去了?

为什么软件开发行业看不见白发苍苍的程序员?大龄程序员都去哪里了?各个公司会辞退大龄程序员吗? 如果一位 50 多岁的程序员申请 20 多岁或 30 多岁的职位&#xff0c;有多少公司会雇用他们呢?关于这个问题&#xff0c;有很多流言传说&#xff0c;也有一些残酷的现实。 当…