Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >女朋友突然问我DNS是个啥....

女朋友突然问我DNS是个啥....

作者头像
乱敲代码
发布于 2020-12-29 02:07:51
发布于 2020-12-29 02:07:51
1.3K0
举报
文章被收录于专栏:Java系列文章Java系列文章

这是乱敲代码的第36篇原创

今天晚上我正在床上躺着刷手机,然后我女朋友突然说她的电脑坏了。说连着WIFi上不了网,让我给她看一下。(这就是有个程序员男朋友的好处?)

然后我拿到电脑看了一下发现访问网页会出现DNS解析错误,就立马定位到问题了。解决起来很简单就直接修改了一下DNS解析地址然后在CMD输入ipconfig /flushdns就解决了。但是她突然问我DNS是什么。于是乎我就给她讲......

正文

就比如我们打电话一样如果你想要给你的朋友打电话,那么你肯定要知道他的手机号你们才可以建立通信,而这里的手机号就指的是IP地址,因为在计算机网络中是使用的TCP/IP进行通信的而TCP/IP是通过IP地址来确定通信对象,而IP地址都是由数字加点号所组成的12.11.12.11。如果没有IP地址就相当于你不知道你朋友的手机号但是想给他打电话,这合理吗?

但是在你访问某个网站的时候你并不是输入的IP地址,而是输入一个名字就可以访问这个网站。这个名字用来把便于人们使用的机器名字转换成为IP地址,而DNS全称就是Domain Name System域名系统。而为什么使用域名而不使用IP呢?其实就因为IP很难记?。不信你给我记十个IP试试。

域名系统其实就是名字系统,为什么不叫"名字"而叫"域名"呢?这是因为在这种因特网的命名系统中使用了许多的"域 (domain)",因此就出现了"域名"这个名词。"域名系统"明确地指明这种系统是应用在因特网中。

举例来说你如果要访问www.baidu.com这个域名。那么你就需要委托操作系统帮你查询目标网站的IP地址,这是对用户来说是不可见的。按照上面的例子来如果让你记你朋友的手机号那么肯定很困难。这个时候如果你有个电话本你只需要对每个手机号添加一个备注,想要联系某人只需要在电话本中查看到他的手机号即可。而DNS你就可以把它想象成一本巨大的电话本。而这种DNS不仅适用于IPV4还适用于IPv6。同时DNS是属于应用层并为应用层软件提供帮助。

交互流程:

域名结构

域名命名是采用的是层次树状结构的命名方法,那百度的域名举例子,百度的真实域名应该是www.baidu.com.root一般简写为www.baidu.com.而这个.表示的就是域名的根平时根域名。而后面的结构又区分为顶级域名、二级域名、三级域名等等。而二级以后的域名一般都会称之为子域名。如图:

从上图可以看出域名是由多部分组成每部分通过.分割然后在连接在一起最右边就是根域名,根域名都是对用户不可见的。一般我们见到的域名都是这样的:

域名的每个等级不超过不超过63个字符(主要为了方便记忆)。还有就是在域名中是不区分大小写的但是一般都是使用小写。而且DNS也不规定每一层级域名的意思也不限制域名的层级,各个级别的域名都是由上一级的域名机构进行管理,而最高的顶级域名则由ICANN进行管理。这样做的好处就是每个域名在互联网中都是唯一的而且也容易设计出一种查询域名的机制。

在之前域名分为三大类:

  • 国家顶级域名nTLD:比如.cn代表的是中国、.us代表的是美国、.uk代表的是英国等等
  • 通用顶级域名gTLD:最早的顶级域名有
    • .com 代表了公司和企业
    • .net 代表了网络服务机构
    • .org 非盈利性组织
    • .edu 教育机构
    • .gov 政府部门
    • .int 美国军事组织
  • 基础结构域名:基础结构域名只有一个就是arpa用于反向解析,一般都称之为反向域名。

结合着域名系统是层次树状结构那么在因特网中域名系统的结构是这样的:

那么现在就又有一个问题了。上面说到了域名有很多那么是怎么查询的?如果是com的域名就去com的域名查询吗?如果是net域名就去net服务器查询吗?

DNS服务器

如果按照上面的域名结构,那么每一个域名都需要一台服务器。现在在因特网中有很多域名那对应起来就要很多个域名服务器。并且服务器太多的话也会影响域名查询的速度。而且也不可能把所有的域名都保存在一个服务器中。所以在DNS中服务器采用分区的方法来解决上述问题。

在DNS中一个服务器所管辖的范围叫做区,每个单位根据自己的情况划分自己所管辖的区。在自己所管辖的区中每个节点都是可以连通的。然后每个区都有自己的权限域名服务器,用来保存所有域名和IP的映射。

所以在DNS中并不是用域作单位而是使用区作单位。理解了区的概念就比较简单了。

其实可以把根域名看做是一个国家而顶级域名就是一个省份以此类推那么二级域名就是市级单位,三级域名就是县级单位和镇单位。

那么从上图可以看出a.com就是一个市然后下面的节点都属于a.com这个市管辖那它们就只需要一台权限域名服务器就可以完成对a.com下面所有子域名的解析工作。所以在DNS服务器中类别并不是以域作为单位而是用区作为单位,区就是DNS服务器实际管辖的范围。在上图中其实一个区和域的关系是等于的。那么在看下面的这张图。

这时候c.a.com也划分了一个区但是它又属于a.com这个域下面这个时候他们的关系就是域大于区。因为它们同属于a.com这个域下面,在a.com这个域下面又分了一个c.a.com的区。一个区需要一台服务器那现在划分了两个区也就是需要两台权限域名服务器。那现在又有一个问题什么是权限域名服务器?

其实在DNS中服务器也是有区分的

分为三个类别分别为根域名服务器顶级域名服务器权限域名服务器

  • 根域名服务器也就是最高等级的域名服务器,根域名服务器知道所有顶级域名服务器的地址。在解析过程中只要本地DNS服务器无法解析都会去根服务器去查询。所以只要根服务器瘫痪了那么所有的DNS服务器都没法工作了。而根服务器并不做解析工作它只负责告诉你下次应该去哪个顶级服务器去查询。
  • 顶级域名服务器负责管理在该顶级域名服务器注册的二级域名
  • 权限域名服务器主要就是管理一个区的服务器

DNS是怎么查询的

浏览器拿到输入的域名后会先去浏览器的DNS缓存中查询一下是否有记录,如果存在就直接返回,不存在的话就去查询操作系统的缓存,如果操作系统也没有缓存那么就会去查看本地的HOST文件。如果HOST文件也没有记录就会去本地DNS服务如果本地DNS服务器也没有就只能去根服务器去查询了。而这些DNS服务器一般都是由网络运营商提供,或者你自己手动设置。其中根服务器世界上一共存在13台,域名服务器名字分别为“A”至“M”。一台主根服务器在美国其余12台都是辅根服务器,其中9个在美国,欧洲2个,位于英国和瑞典,亚洲1个位于日本。而所有服务器都是由ICANN统一管理。

下面完善一下查询的步骤:

  • 1.客户端浏览器缓存,没有缓存就查询操作系统缓存,如果没有就查询HOST文件,如果还没有就查询本地DNS服务器
  • 2.本地DNS服务器查询本地是否有缓存,如果没有就去查询根服务器
  • 3.根服务器返回给本地DNS服务器查询域,然后本地DNS服务器再次去查询
  • 4.本地DNS服务器把查询的结果返回给客户端,并且把结果缓存。

下图是查询a.com的流程图:

DNS查询域名的IP地址有两种方式一种是递归查询一种是迭代查询。

迭代查询

迭代查询就是本地服务器向根服务器查询一般都是使用迭代查询。迭代查询的特点就是当根域名服务器收到本地DNS服务器查询的请求后会告诉本都服务器去那个顶级服务器去查询,然后本地DNS服务器在去顶级服务器。如果顶级服务器会把自己知道的权限服务器地址告诉本地服务器,然后本地服务器在去查询权限服务器。查询到以后本地DNS服务器就会把结果返回给客户端。

递归查询

递归查询就比较简单,客户端祥本地DNS服务器查询就是采用的递归查询,如果客户端查询的域名本地DNS服务器不知道的话就会以DNS客户的身份向其他域名服务器查询。

手动查询

接下来我们在操作系统中手动查询一下某个域名的DNS。Linux中有dig,dig命令主要用来从 DNS域名服务器查询主机地址信息。

dig 命令默认的输出信息比较丰富,大概可以分为 5 个部分。

  • 第一部分显示 dig 命令的版本和输入的参数。
  • 第二部分显示服务返回的一些技术详情,比较重要的是 status。如果 status 的值为 NOERROR 则说明本次查询成功结束。
  • 第三部分中的 "QUESTION SECTION" 显示我们要查询的域名。
  • 第四部分的 "ANSWER SECTION" 是查询到的结果。
  • 第五部分则是本次查询的一些统计信息,比如用了多长时间,查询了哪个 DNS 服务器,在什么时间进行的查询等等。

dig默认查询的是A记录上面第四部分返回的结果中的A就代表了查询到的是A记录。dig命令解释网上有很多资料这里就不过多解释。想要了解更多dig命令这里推荐阮大的文章。

https://www.ruanyifeng.com/blog/2016/06/dns.html

DNS 记录的类型

类型

解释

A

地址记录,用来指定域名的 IPv4 地址,如果需要将域名指向一个 IP 地址,就需要添加 A 记录。

AAAA

用来指定主机名(或域名)对应的 IPv6 地址记录。

CNAME

如果需要将域名指向另一个域名,再由另一个域名提供 ip 地址,就需要添加 CNAME 记录。

MX

如果需要设置邮箱,让邮箱能够收到邮件,需要添加 MX 记录。

NS

域名服务器记录,如果需要把子域名交给其他 DNS 服务器解析,就需要添加 NS 记录。

SOA

SOA 这种记录是所有区域性文件中的强制性记录。它必须是一个文件中的第一个记录。

TXT

可以写任何东西,长度限制为 255。绝大多数的 TXT记录是用来做 SPF 记录(反垃圾邮件)。

最后

同时需要注意DNS是有缓存机制的,缓存的目的就是为了提高查询的效率。所以在修改完DNS服务器后一定要记得刷新DNS缓存。就像我文章开头的ipconfig /flushdns命令目的就是为了清除本地DNS缓存。

巨人的肩膀

  • 图解TCP/IP
  • https://www.ruanyifeng.com/blog/2016/06/dns.html
  • https://tojohnonly.github.io/68-DNS%E5%8E%9F%E7%90%86%E5%8F%8A%E8%A7%A3%E6%9E%90%E8%BF%87%E7%A8%8B.html
  • 网络是怎么连接的
  • https://zhuanlan.zhihu.com/p/61394192
  • https://blog.csdn.net/m0_37263637/article/details/85157611
  • https://baike.baidu.com/item/%E5%9F%9F%E5%90%8D%E7%BA%A7%E5%88%AB/15536218?fr=aladdin
  • https://www.cnblogs.com/sparkdev/p/7777871.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乱敲代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Rafy 框架 - 使用 SqlTree 查询
本文介绍如何使用 Rafy 框架中的 Sql Tree 查询: 除了开发者常用的 Linq 查询,Rafy 框架还提供了 Sql 语法树的方式来进行查询。 这种查询方式下,开发者不需要直接编写真正的 Sql 语句,而是转而使用一套中间 Sql 语法树对象。这隔离了与具体数据库的耦合,使得开发者编写的查询可以跨越多种不同的数据库运行,甚至可以在非关系型数据库中运行。同时,框架还结合托管属性,提供了方便开发者使用的 API,并尽量保持与传统 Sql 相近的语法,使得开发者可以快速理解并编写。 本文包含以下章节:
用户1172223
2018/01/30
2.5K0
Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能。由于在 09 年最初设计时,ORM 部分的设计并不是最重要的部分,那里 Rafy 的核心是产品线工程、模型驱动开发、界面生成等。所以当时,我们简单地采用了一个开源的小型 ORM 框架:《Lite ORM Library》。这个 ORM 框架可以生成比较简单的 Sql 语句,以处理一般性的情况。 随着不断使用,我们也不断对 ORM 的源码做了不少改动,让它在支持简单
用户1172223
2018/01/26
2.2K0
LINQ to SQL集成到应用程序中需考虑的一些问题
1、LINQ to SQL集成到应用程序中需考虑的一个问题, 到底应该返回IQueryable<T>还是IQueryable? 或许这个列表还应该继续扩展为T, List<T>, 对于Business
张善友
2018/01/19
1.3K0
MySQL 之索引类型
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
小手冰凉
2020/05/09
1.3K0
MySQL 之索引类型
MySQL中的索引详讲
转载自 https://www.cnblogs.com/whgk/p/6179612.html
allsmallpig
2021/02/25
6070
深入浅出查询优化器
提示:公众号展示代码会自动折行,建议横屏阅读 「第一部分 查询优化器框架」 关系型数据库是一个通用系统软件,SQL作为一种结构化查询语言,用户不需要关注怎么做,只需要描述做什么,然后交由SQL引擎来处理。因为关系代数提供的等价性,同一个查询可以用不同的SQL语句描述。为防止用户所写的"不好的"SQL执行慢,这就需要查询优化器快速而准确地选择出一个效率较高的执行计划。 一般的查询优化器基于代价计算模型,包含SQL形态的变换,确定访问路径和多表连接顺序等几个重要的步骤。这些步骤被统一在一个优化器框架之内,相互
腾讯数据库技术
2021/06/02
2K0
《MySQL核心知识》第8章:索引
今天是《MySQL核心知识》专栏的第8章,今天为大家系统的讲讲MySQL中的索引技术,希望通过本章节的学习,小伙伴们能够举一反三,彻底掌握MySQL中的索引技术。好了,开始今天的正题吧。
冰河
2022/09/23
4950
《MySQL核心知识》第8章:索引
如何写优雅的SQL原生语句?
sql各语句执行顺序概览与讲解 项目实战中的一段sql说明讲解 sql语句中别名的使用 书写sql语句的注意事项 前言
coder_koala
2019/07/30
1.9K0
如何写优雅的SQL原生语句?
[转自JeffreyZhao]在LINQ to SQL中使用Translate方法以及修改查询用SQL
目前LINQ to SQL的资料不多——老赵的意思是,目前能找到的资料都难以摆脱“官方用法”的“阴影”。LINQ to SQL最权威的资料自然是MSDN,但是MSDN中的文档说明和实例总是显得“大开大阖”,依旧有清晰的“官方”烙印——这简直是一定的。不过从按照过往的经验,在某些时候如果不按照微软划定的道道来走,可能就会发现别样的风景。老赵在最近的项目中使用了LINQ to SQL作为数据层的基础,在LINQ to SQL开发方面积累了一定经验,也总结出了一些官方文档上并未提及的有用做法,特此和大家分享。
菩提树下的杨过
2018/01/24
5K0
[转自JeffreyZhao]在LINQ to SQL中使用Translate方法以及修改查询用SQL
都快2020年,你还没听说过SvelteJS?
React, Vue和Angular差不多占据了Web开发的大部分江山,可是最近半年Svelte[1]开始逐渐吸引越来越多人的眼球。这个Svelte框架到底有什么过人之处呢?本文将会为大家分析一下Svelte火起来的原因,并且通过使用Svelte去搭建一个简单的书店应用(bookshop)来帮助大家快速入门这门框架。
进击的大葱
2022/08/22
3.2K0
都快2020年,你还没听说过SvelteJS?
R语言重复测量数据的多重比较
使用的数据来自孙振球,徐勇勇《医学统计学》第4版。课本的电子版已上传到QQ群,加群即可免费获取!
医学和生信笔记
2022/11/15
1.1K0
R语言重复测量数据的多重比较
linq to sql中慎用Where<T>(Func<TSource, bool> predicate),小心被Linq给"骗"了!
近日在一个大型Web项目中,采用Linq to Sql替换原来的sqlcommand/sqldatareader方式来获取数据,上线后刚开始一切正常,但是随着访问量的增加,网站明显慢了很多,监测服务器CPU占用率/内存使用情况等性能指标却发现均在正常范围内,无意中在SqlServer Profier中跟踪数据库执行的sql语句时,发现有大量语句直接将整个表的数据全部提取出来了,而非仅返回分页中的当前页数据! 而这些SQL都是Linq自动翻译并最终提交到数据库的,查看了相关的代码,明明写着Skip(n
菩提树下的杨过
2018/01/24
1.1K0
学习正则表达式 - 提取和替换 XML 标签
        使用 lorem.dita 作为示例 XML 文档,通过正则表达式提取出该文档中的所有 XML 标签,并转换为简单的 XSLT 样式表。可以在 Github 中找到 lorem.dita 文件,地址是https://github.com/michaeljamesfitzgerald/Introducing-Regular-Expressions。为了节省篇幅,节选部分文本作为测试数据。
用户1148526
2023/10/14
8470
数据库查询优化技术(二):子查询优化
对应的是限制条件(格式类似“field<op>consant”, field表示列对象,op是操作符如"="、">"等)。
sunonzj
2022/06/21
3.3K0
数据库查询优化技术(二):子查询优化
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
在当今的大数据时代,数据库技术的选择对于企业的信息化发展至关重要。OceanBase作为一种高性能、高可用的分布式关系数据库,在与MySQL模式的兼容性方面展现出了显著的优势,为企业数据迁移、整合与升级提供了极大的便利。
公众号:码到三十五
2024/05/06
7680
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
存储过程和触发器
2.举例 (数据表链接: spj库) ①创建存储过程p1,查询所有信息;运行之。
唔仄lo咚锵
2020/09/15
1.2K0
达观数据文辉:Hadoop和Hive使用经验
近十年来,随着Hadoop生态系统的不断完善,Hadoop早已成为大数据事实上的行业标准之一。面对当今互联网产生的巨大的TB甚至PB级原始数据,利用基于Hadoop的数据仓库解决方案Hive早已是Ha
达观数据
2018/03/30
1.5K0
ORM查询语言(OQL)简介--高级篇(续):庐山真貌
相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山真貌    PDF.NET框架的OQL经过“脱胎换骨”般的重构之后,引来了它华丽丽的新篇章,将“对象化的SQL”特征发挥到极致,与至于我在Q群里面说这应该算是OQL的“收山之作”了。然而,我这么说有什么依据?它的设计哲学是什么?它究竟是何样?由于本文篇幅较长,请听本篇慢慢道来,叙说它的庐山真面目! [有图有真相
用户1177503
2018/02/27
2.3K0
ORM查询语言(OQL)简介--高级篇(续):庐山真貌
Linq to Sql中Single写法不当可能引起的数据库查询性能低下
场景:需要从T_User表中返回指字条件的某条记录的某一个字段 在Linq中有二种理论上都行得通的写法,见下面的代码: Code using (dbUserDataContext db = new dbUserDataContext(Website.ConnStrdbUser))             { try {  //Guid _UserId = db.T_User.Single(c=>c.F_ID==new Guid("00000000-0000-0000-0000-000000000001"
菩提树下的杨过
2018/01/23
1.2K0
Hive性能优化统计每日IP CREATE TABLE ip_2014_12_29 AS SELECT COUNT(DISTINCT ip) AS IP FROM logdfs WHERE logda
Hive性能优化 1.概述   继续《那些年使用Hive踩过的坑》一文中的剩余部分,本篇博客赘述了在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题。下面开始本篇文章的优化介绍。 2.介绍   首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题? 数据量大不是问题,数据倾斜是个问题。 jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,耗时很长。原因是map reduce作业初始化的时间是比较长的。 sum,
Albert陈凯
2018/04/04
1.7K0
Hive性能优化统计每日IP CREATE TABLE ip_2014_12_29 AS SELECT COUNT(DISTINCT ip) AS IP FROM logdfs WHERE logda
推荐阅读
相关推荐
Rafy 框架 - 使用 SqlTree 查询
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档