灵魂拷问,你真的了解DNS吗?

news2025/1/1 22:22:50

未来已来,只是不均衡地分布在当下

大家好,我是菜农,欢迎来到我的频道。

都说程序员是面向Google编程,殊不知当你输入 www.google.com 地址的时候,是否有想过,在回车的一瞬间浏览器如何将请求发送,如何到达目的地为你取得正确的数据。

遇到问题我们通常会打开浏览器,输入 www.google.com 回车,然后搜索我们的问题,获取到我们想要的内容后,我们又会心满意足的关闭浏览器。

而在这一个请求的过程中,浏览器内部发生了什么?

我们也许会在某个不经意间发现,输入 142.251.43.14 这串 IP 也能够访问Google网站,而为了让人觉得高大上一点,你改掉了输入 google.com“臭毛病”, 而是每次都会在浏览器输入这串IP,毕竟在回车之前别人总是难以琢磨你要访问的是哪个网站,除非遇到 “志同道合” 的人。

一开始你使用得不亦乐乎,毕竟敲入这串 IP 也能够熟能生巧,使用速度也不减当年,但某一天你跟往常一样输入这串IP 的时候发现怎样都访问不到网站了,你开始急了,并寻找问题,怀疑自己的记忆力是否出现了问题,亦或是网站出现了问题,折腾半天后,发现是 Google 网站的 IP 发生了变化,而等待你的就只有两条路,一是继续背下新的 IP 地址,但难保某一天又面临不能访问的情况,二是回归从前,老老实实访问 google.com 。最终你醒悟了,终于发现背诵 IP 进行日常访问真是个 “有病” 的行为。

那么为什么 www.google.com 能够通过 142.251.43.14 进行访问?这里我们先记住两个名词,一个是域名,一个是 IP,www.google.com 是一个域名,而 142.251.43.14 则是一个 IP。概念:域名可以对应有多个 IP 地址

怎么理解?很简单,打开你的手机通讯录,可以看到 富婆 就是一个 “域名” 的概念,而具体的电话号码就可以对应上 “IP”

我们想要给一个人打电话,我们可以输入富婆,也可以输入具体的电话号码,当然富婆的记忆点低,而电话号码的记忆点高,而为什么与遇到上面所说的一点时间后再次访问 IP 就访问不到网站了,这种情况你可以想象成,富婆换电话了 ~

那么回到我们的内容,将域名解析为 IP 的这个过程就是 DNS(Domain Name System) 域名系统。

DNS 产生背景

Internet 将数量众多的主机连接在一起,要让这些主机能够进行通信,就需要有一套名字标识体系,让主机之间能够彼此找到对方。实际上,在 Internet 上有多种方式可以进行主机标识,既可以用主机名(域名)标识,也可以使用IP地址进行标识。主机在互联网上的位置主要靠 IP 地址进行标识,每个 IP 地址都由 4 个字节组成,有这严格的层次结构,以便路由器进行识别和处理。但这种纯数字的标识方式对于人类的记忆来说简直是个噩梦,因此提出了主机名的标识方式,就是上述说到的 www.google.com ,这种名字的好处很直接,就是便于记忆。但是对于喜欢 0 和 1 的计算机来说,肯定更喜欢 IP 的表达方式,因此就出现了计算机喜欢 IP 地址,人喜欢主机名的对立情况,那么就需要一个适配器 来完成两者之间的转换,这就是主机名与IP地址的映射关系。

在DNS之初,整个网络中只有几百台的主机,所有的主机信息以及主机名与地址的映射记录都存放在一个名为 HOST.TXT 的文件中。 HOST.TXT 从一台名为 SRI-NIC 的主机上分发到整个网络,而维护映射记录的方式也很粗暴,通过将变更信息以电子邮件的方式告知管理员,然后进行定期 FTP 到 SRI-NIC 上,获得最新的 HOST.TXT 文件。

但这种方式长期来看肯定是不合实际的,互联网飞速发展,主机的数量日益暴增,存在问题:

  • 无法进行分散管理
  • 无法及时全网更新与同步
  • 维护困难

为了解决以上问题,1984年,南加州大学信息科学所的 PaulMockaprtris 发布了描述 DNS 的 RFC 882 和RFC 883的规范,简单来说就是 DNS 诞生了。

DNS 工作原理

DNS 实际上是一个应用层协议,但它通常被其他的应用层协议所使用,用于将用户提供的主机名解析为 IP 地址。

当我们在浏览器的地址栏上输入 www.google.com 这样一个 URL时,实际上我们想要浏览的网页内容都存放在互联网中的某台服务器上,而浏览器的任务就是找到我们想要访问的这台服务器的 IP 地址,然后向它请求内容,而这一整个过程就是 DNS 工作的内容。

如图所示,DNS 地址解析服务是在 HTTP 连接建立之前的一个过程。从用户主机上调用应用程序的角度来看,DNS是一个提供简单、直接的转换服务的黑盒子,但实际上 DNS 服务系统运转相当复杂,由分布于全球的大量 DNS 服务器以及相关应用层协议共同组成。

域名结构

整个互联网中的域名空间结构就像是一棵倒置的树

我们试着将一个 Google 的域名进行拆分,www.google.com

我们惊奇的发现,之前看似简单的一段域名居然由这么多部分构成。既然上部分说到,域名空间结构就像是一棵倒置的树,那么我们就手动梳理下这棵树的结构。

每个顶级域由对应的顶级域(TLD)服务器负责管理,除了以下 7 个顶级域名,还有各个国家的顶级域名(cn、uk、ca和 fr 等)也在这一级别进行管理。

每个顶级域再向下展开分支,每个分支域都是一个子域,比如 google.comcom 的子域,而 google.com 也可再包含子域,比如 a.google.comb.google.com。一个域就是域名空间中的一棵子树,域的名字也就是这棵子树的顶端节点的域名。

拆分原理

DNS 承载的流量是全球的流量,那么将结构设计为层次结构的原因也很简单,那就是分布承担流量

在每个域中,会有一台或多台服务器用来保存这个域名空间的所有信息,并且响应关于该域名空间的所有请求,这种服务器就叫做这个域的 权威域名服务器(授权域名服务器) 。它拥有这个域的所有的域名信息,每个域都可以分为多个子域,而每个权威域名服务器可以个一个或多个区域进行解析。

google.com 可以被划分为三个子域,a.google.com、b.google.com和 c.google.com。每个子域都可以自行维护自己的权威域名服务器,一个域可以有多台权威域名服务器,但是只有一台是主域名服务器,这台主域名服务器负责向其他辅域名服务器分发每个域名空间的更新信息。简单理解,域名空间就相当于是一个 小集群

当一个子域被授权出去后,它原本所属的域就不再包含它的数据,而只留下一些指针,这些指针指向相应子域的授权域名服务器。如果有一个请求来询问该子域的信息,那么所返回的应该是该子域权威服务器的列表。

因此,DNS 服务器层由:根 DNS 服务器、顶级域名(TLD)服务器和权威DNS服务器共同组成 ,共同维护分布式、层次化的DNS数据库。DNS系统采用树形设计的一个主要目的就是为了分撒管理,而这种分散管理是通过 授权 来实现的。对域进行授权,就是域管理组织把子域授权给其他组织进行管理,由子域管理者来维护子域中的数据,可以自由改动数据,包括对子域的再次划分和授权。

在 DNS 系统中还有一类非常重要的域名服务器,叫做 本地DNS服务器(LDNS),是用户所在局域网或 ISP 网络中 的域名服务器,本地 DNS 服务器地址是客户端网络配置的一部分,或者通过 DHCP 方式分配给客户端。

针对DNS的分布查询原理如下:

浏览器发出的请求会先发送到本地DNS服务器,本地DNS服务器收到浏览器的域名解析请求后,会采用递归的方式向 DNS 系统中的其他远程域名服务器提出查询请求。(递归方式指每次查询请求都由本地DNS服务器发起,收到答复后再向下一个远程DNS服务器提出请求,直到获得结果。迭代查询指本地DNS服务器只将自己知道的最合适的答案返回给查询者,帮助它把查询过程继续下去,而它本身不再做其他任何查询)

过程: 本地DNS服务器首先会去根DNS服务器请求解析(此时条件是本地DNS服务器并没有关于这个域名的缓存),根域名服务器中虽然没有www.google.com这条记录的,但它可以知道这个URL属于com 域,于是就找到com域服务器的IP地址,然后访问com域服务器,重复上面的操作,再找到放了google 域的服务器是哪个,继续往下,直到找到www.google.com的那条记录,最后返回对应的IP地址

缓存原理

频繁使用 DNS 查询会给使用它的互联网应用带来额外的时延,而时延本身不能确定,有可能大有可能小。那么为了解决这个问题就需要引入 缓存 机制。缓存是指 DNS 查询结果在主机中的缓存,有了缓存就不需要在每次查询的时候都经过复杂的递归过程。当然 DNS 数据有可能过期,因此 DNS 服务器不能把数据永远的存放在缓存中,管理员会为这些数据设置一个生存期(TTL)。超过 TTL 时间的数据会被清除,重新向 DNS 服务器进行查询。

除了DNS服务器能够缓存 DNS 响应信息之外,客户端浏览器也可以缓存 DNS 响应信息,当用户请求页面域名解析结果在浏览器自身的DNS缓存汇总能够查到时,就不会向DNS服务器发起请求了,这样可以加快浏览网页的速度。当消息记录时间超过浏览器设置的 DNS 缓存时间时,会重新向DNS服务器发起域名解析请求,用新的解析结果更新缓存。

记录类型与报文格式

域名服务器是根据资源记录来对 DNS 请求进行应答的。在 DNS 系统中,最常见的资源记录是 Internet 类记录,资源记录是一个包含了下列字段的 4 元组:

  • Name
  • Value
  • Type
  • TTL

其中,TTL 是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。Name 和 Value 的值取决于 Type,即记录类型。而记录类型分为以下几类:

我这里附上一张阿里云的域名解析配置图,先有一个大致的概念

  1. A / AAAA:Address

A 记录用于描述域名到 IP 地址的映射关系,对同一个域名可以有多条 A 记录,也就是说一次DNS查找可以返回多个地址。

  1. CNAME

CNAME 记录用于描述别名与域名的对应关系,这种记录允许你将多个名字映射到同一台计算机。比如我们有个域名是 cbuc.com,那我可以添加一条 www.cbuc.com 的 CNAME记录,以便请求 www.cbuc.com 时也能够访问到 cbuc.com 。查找过程也是通过 www.cbuc.com 找到 cbuc.com ,继而找到对应的 IP 地址,这里不再赘诉。

  1. NS:Name Server

NS 记录是域名服务器记录,用于指定该域名由哪个 DNS 服务器来进行解析。每个区域可以有多个域名服务器,因此可以有多条NS记录。

  1. SOA:Start Of Authority

SOA 记录用于指定该区域的权威域名服务器。每个区域允许切只允许有一个 SOA 记录,它是资源记录的第一个条目。

  1. PTR:Pointor Record

PTR 记录用于描述IP地址到域名的映射关系

DNS 总结

DNS是域名系统的简称,它是一种用于将域名和IP地址相互映射的协议。简单地说,它是一种用于将人类可读的域名(例如www.google.com)转换为浏览器可以理解的IP地址(例如 142.251.43.14)的方法。这样,用户就可以通过输入域名来访问网站,而无需记住网站的IP地址。

DNS的设计原理是使用分层的系统将域名和IP地址相互映射。主要包括以下三个部分:

  • 域名服务器(DNS服务器):DNS服务器是网络中的一种特殊服务器,它存储了域名和IP地址的映射关系。当用户访问一个网站时,浏览器会向DNS服务器发出请求,DNS服务器则会返回该网站的IP地址。
  • 域名系统域(DNS域名空间):DNS域是用于组织DNS服务器的层次结构。它以树型结构组织DNS服务器,使得每个服务器都有一个唯一的名称,这样就可以方便地查找到指定的DNS服务器。
  • 域名系统数据库(DNS数据库):DNS数据库是用于存储域名和IP地址映射关系的数据库。它包含了所有域名和IP地址的映射关系,以便DNS服务器可以根据用户的请求返回正确的IP地址。

简而言之,当用户访问一个网站时,浏览器会向DNS服务器发出请求,DNS服务器会查询DNS数据库,并根据域名和IP地址的映射关系返回正确的IP地址

DNS系统的设计具有以下几个亮点:

  • 可扩展性:DNS系统的分层结构允许添加新的DNS服务器,从而支持更多的域名和IP地址。
  • 可靠性:DNS系统可以通过多台DNS服务器进行冗余存储,从而提高系统的可靠性。
  • 灵活性:DNS系统允许用户随时修改域名和IP地址的映射关系,从而使网络更加灵活。
  • 可维护性:DNS系统可以使用缓存技术,从而减少DNS数据库的查询次数,降低系统的维护成本。

好了,以上便是本篇的所有内容,如果觉得对你有帮助的小伙伴不妨点个关注做个伴,便是对小菜最大的支持。不要空谈,不要贪懒,和小菜一起做个吹着牛X做架构的程序猿吧~ 咱们下文再见!

今天的你多努力一点,明天的你就能少说一句求人的话!

我是小菜,一个和你一起变强的男人。 💋

微信公众号已开启,菜农曰,没关注的同学们记得关注哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

价值年薪70W的JAVA进阶学习路线!终于让我从阿里P8手里抠出来了

作为一个男人我感觉必须得做点什么来证明一下自己,现在我又回来了,准备把自己的节操准备补一下。另外给各位未来的Java程序员说一句,别的我不清楚,学习编程请从一而终 咱们学习编程就挺难的,有这些先驱者来带领咱们学习…

【Maven基础】命令行环境使用

实验一:根据坐标创建 Maven 工程 1、Maven 核心概念:坐标 1.1、数学中的坐标 使用 x、y、z 三个『向量』作为空间的坐标系,可以在『空间』中唯一的定位到一个『点』。 1.2、Maven中的坐标 1.2.1、向量说明 使用三个『向量』在『Maven的仓…

[附源码]计算机毕业设计会议室预定管理APPSpringboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【个人笔记 hive】hive里面的说SerDe含义

官网中这样介绍serde:https://cwiki.apache.org/confluence/display/Hive/SerDe: SerDe Overview SerDe is short for Serializer/Deserializer. Hive uses the SerDe interface for IO. The interface handles both serialization and deserialization …

Linux中mysql的安装|配置|操作|卸载

文章目录1. mysql的卸载1.1 首先查询系统是否安装了MySQL1.2 关闭MySQL服务1.3 查看MySQL对应的文件夹1.4 卸载并删除MySQL安装的组键服务1.5 删除系统中MySQL的所有文件夹1.6 最后验证MySQL是否删除完成2. mysql的安装与配置2.1 下载mysql8.0安装包2.2 解压mysql8.0安装包2.3 …

蜂鸟学习笔记E203(七)——写回、存储器和ICB总线

一、 蜂鸟E203处理器的写回硬件实现 核心思想如下 将指令划分为单周期指令和长指令两大类将长指令的交付和写回分开,使得即使执行力多周期的长指令也不会阻塞流水线,妨碍单指令 主要包含最终写回仲裁、长指令写回仲裁 最终写回仲裁 长指令的写回比…

Python的数据结构- 序列(sequence)

数据结构 - 序列(sequence) 序列的一个特点就是根据索引(index,即元素的位置)来获取序列中的元素,第一个索引是 0,第二个索引是 1,以此类推。 所有序列类型都可以进行某些通用的操作…

ChatGPT教我面试

​持续坚持原创输出,点击蓝字关注我吧 最近ChatGPT爆火,ChatGPT能干什么呢?想必已经看过很多文章了,例如ChatGPT通过美国高考、ChatGPT开发游戏、调试代码、写文章等等。 哈哈,作为一个软件测试博主,我怎么…

frp内网穿透SSH

参考博客: 博客1(推荐): https://sspai.com/post/52523 博客2: https://blog.csdn.net/qq_36981760/article/details/115713179 博客3: https://blog.csdn.net/qq_36981760/article/details/115713179 参考视频 (推荐,比较详细): https://www.bilibili.com/video/BV…

谈谈inline(内联函数)

目录1、例子抛出2、 了解inline2.1 宏替换的副作用2.2 内联函数2.3 有意思的点3、总结4、 感谢您的阅读!1、例子抛出 我们知道可以用宏定义来代替一个变量或者函数块: #define A 20 #define MYFUNC(a,b) ((a) > (…

Kubernetes双主集群的部署(二)

Kubernetes单主集群的部署(一)_Evens7xxX的博客-CSDN博客 上期完成了单主架构集群的部署,本期将在单主架构的基础上添加Master和负载均衡器 目录 二、k8s双主架构集群的部署 1.另一台Master同样做初始化配置 2.配置 Master02 3.配置负载均…

算法与数据结构31:DC3算法生成后缀数组

算法与数据结构31:DC3算法生成后缀数组什么是后缀数组引出DC3算法DC3算法具体实现DC3算法模板DC3模板的用法一个可以使用DC3的题什么是后缀数组 假设有字符串 aabaabaa 那么从每个位置开始,到结尾位置,截取后缀串,可得 a aa baa …

四面阿里巴巴如愿拿到offer定级P7,为此我筹备了半年

前言 每个程序员都有一个大厂的梦,而互联网大厂首当其冲自然是阿里巴巴最吃香,今天小编就来分享一个小伙进阿里巴巴的面经! “不想进大厂的程序员不是好程序员”哈哈哈 春节过后,本是金三银四之际,大部分人也都准备好…

【RealSense】L515学习记录

Intel RealSense™ SDK 2.0的安装 1、注册服务器的公钥: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8…

ChatGPT:chatGPT本地部署、运行和接口调用

文章目录从 github 下载环境配置conda 创建虚拟环境官方步骤配置环境安装 revChatGPT更改 config.json.example -> config.json将 config.json 移动到 revChatGPT 路径下cookie 信息写入 config.json方式1:使用账号密码作为登录的方法方式2: 使用 ses…

软件测试期末测试题及解析(五套试题共两万余字)

软件测试期末考试复习题题目软件测试期末考试复习题(一)一、单项选择题:二、判断题:三、简答题期末考试复习题(二)一、单项选择题:二、判断题:三、简答题期末考试复习题(…

并查集最重要的优化:路径压缩

本文章将直接讲解优化,对并查集还不理解或忘记的同学可以看以下两篇文章 并查集基础 优化:启发式合并 先赞后看好习惯 今天我们要来说另一种对并查集的优化:路径压缩 也许有些同学看了启发式合并会说:其实优化的也不多啊&…

定时器: Timer (Java)

定时器: Timer一、定时器是什么二、标准库中的定时器三、实现定时器3.1 定时器的构成3.2 实现细节3.3 完整代码一、定时器是什么 定时器也是软件开发中的一个重要组件。类似于一个 “闹钟”,即达到一个设定的时间之后,就执行某个指定好的代码。 定时器…

收藏 | 自然语言处理(NLP)数据集汇总(附下载链接)

🎄🎄【自然语言处理NLP】简介 🎄🎄 自然语言处理(Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门…

自制CPU

CPU是计算机的核心部件,其发展历程就是人类文明的发展史。 随着计算机技术的不断发展, CPU也从一开始的功能简单,到现在已经变成功能强大、应用广泛的芯片。 但要想更深入了解 CPU,你需要知道它是如何工作以及为什么这么做的。 你…