0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么要有DNS?它的设计有哪些是值得我们学习的

jf_ro2CN3Fa 来源:小白debug 2023-02-06 15:14 次阅读

为什么要有DNS

如果我们想要访问某度,你可以在浏览器上的搜索栏里输入112.80.248.76这个IP地址,直达页面。

e2a276da-a404-11ed-bfe3-dac502259ad0.png

通过IP访问网页

这样的行为,合法,但有病

大部分人,连自己对象的电话号码都记不住,又怎么可能记得住这么一串IP地址呢。

哦,不好意思,伤害到兄弟们了,你们没对象。

但我假设你们有。

回想一下,虽然你记不住对象的电话号码,但却不影响你给她打电话。你的操作过程是不是打开通讯录 ,输入"富婆",然后就弹出一个电话号码。点击即拨打。

在计算机领域,你大概率也记不住IP,所以也需要有类似的通讯录的功能 。比如,你只需要输入www.baidu.com,它就能帮你找到对应的 112.80.248.76,然后进行访问。

e2b0ee40-a404-11ed-bfe3-dac502259ad0.png用域名访问

其中www.baidu.com 是域名 ,通过这个域名可以获得它背后的IP是112.80.248.76。

就像一个人可以有多个电话号码一样,一个域名也可以对应有多个IP地址。

而将域名解析为IP的过程,也就是查"通讯录"的过程 ,其实就是DNSD omain N ame S ystem,域名系统)协议需要做的事情。

另外需要注意的是,上面的这个IP地址,我写这篇文章的时候能访问,不代表大家看文章的时候能访问。因为这背后的IP地址是有可能变更的。可以通过使用 ping www.baidu.com获得最新的IP地址。

e311ad7a-a404-11ed-bfe3-dac502259ad0.pngping获得IP

但问题就来了。

普通人的通讯录,一般有一千个电话号码就算是社交小达人 了,放在通讯录里绰绰有余。

然而网站域名,却不一样,据说2015年的时候就已经超过3亿了。

如果将这3亿条记录都放在一个服务器里,会有两个问题

• 超过3亿条域名数据,数据量过大 ,并且数据量持续增加

• 需要承受大量的读请求 。每个网站域名都可能会有成千的访问。这加起来,四舍五入也有千亿qps了。

显然,如果将DNS做成类似手机通讯录这样的单点服务,那是不可能实现这样的能力的,必须得是分布式系统

于是,问题就变成了,如何设计一个支持千亿+qps请求的大型分布式系统

我知道肯定有人要说:"这是服务只有10qps的人该考虑的事情吗?"

虽然我们做的服务可能只有10qps,但这并不妨碍我们学习DNS里优秀的设计。

我们就从URL的层次结构聊起。

URL的层次结构

举个例子。一个常见的域名,比如 www.baidu.com。

可以看到,这个域名中间用了两个句点 。通过句点符号,可以将域名分为三部分。

其中com被称为一级域顶级域 ,其他常见的顶级域还有cn,co等,baidu是二级域 ,www则是三级域

除此之后,在com后面,其实还有一个被省略掉的句点号 。它叫根域

域名的层次结构

当域名多起来了之后,将它们相同的部分抽取出来,多个域名就可以变成这样的树状层级结构

e3776a34-a404-11ed-bfe3-dac502259ad0.png

层次结构

这时候我们就可以看到,这些域之间其实是一种层级关系 ,就像是学校,年级,班级那样。

当你想要去定位一个具体域名的时候,你就可以通过这样的层级找到对应的域名。

举个例子。大家应该还记得那句广告词,"三年级2班的李小明同学,你妈妈拿了两罐旺仔牛奶给你",其实李小明的妈妈,就是通过,学校、年级、班级的层级形式,一层层找到人。

DNS的原理

我们重新回来看下大佬们是怎么设计DNS。

先直接说最重要的结论。

利用层级结构去拆分服务

加入多级缓存

接下来展开。

利用URL层级结构去拆分服务

DNS承载的流量压力非常大,必须要做成分布式服务 ,于是问题的关键就变成了如何拆分服务

既然URL是树状的层级结构,那保存它们的服务,也可以依据这个,非常自然的拆成树状的形式。

一台服务器维护一个或多个域的信息。于是服务就变成了下面这样的层级形式。

当我们需要访问www.baidu.com。

查询过程就跟下图一样。

e3b2695e-a404-11ed-bfe3-dac502259ad0.png

DNS查询过程

请求会先打到最近的DNS服务器(比如你家的家用路由器)中,如果在DNS服务器中找不到,则DNS服务器会直接询问根域服务器,在根域服务器中虽然没有www.baidu.com这条记录的,但它可以知道这个URL属于com域,于是就找到com域服务器的IP地址,然后访问com域服务器,重复上面的操作,再找到放了baidu域的服务器是哪个,继续往下,直到找到www.baidu.com的那条记录,最后返回对应的IP地址。

可以看到,原理比较简单,但这里涉及到两个问题。

• 本机怎么知道最近的DNS服务器IP是什么?

• 最近的DNS服务器怎么知道根域的IP是多少?

我们一个个来回答。

本机怎么知道最近的DNS服务器的IP是什么?

这个在之前写过的《刚插上网线,电脑怎么知道自己的IP是什么?》 提到过,插上网线时,机子会通过DHCP协议获得本机的IP地址,子网掩码,路由器地址,以及DNS服务器的IP地址

e3d6d30c-a404-11ed-bfe3-dac502259ad0.png

DHCP协议

下面是我的mac机子,第二阶段DHCP Offer中的抓包截图。可以看到,这里面返回的信息里包含了DNS服务器的IP

e3f4580a-a404-11ed-bfe3-dac502259ad0.png

offer阶段

同时也可以在左上角的点左上角的苹果图标->系统表偏好设置->网络->高级->DNS中查看到DNS服务器的IP地址。

e42b8e9c-a404-11ed-bfe3-dac502259ad0.png

这里有个小细节,从上面的抓包图里可以看到路由器地址和DNS服务器地址,以及DHCP服务器地址 ,其实都是192.168.31.1,这个其实是我这边的家用路由器 的IP地址,也就是说一般家用路由器自带这几个功能。

而在某里云服务器里,DNS服务器也是一样,是通过dhcp协议获得。查看DNS服务器的IP地址也很方便,执行cat /etc/resolv.conf就好了。

e43b8388-a404-11ed-bfe3-dac502259ad0.png

这上面的nameserver中,可以看出有两台DNS服务器,机子会按照文件中出现的顺序来发起请求,如果第一台服务器没反应,就会去请求第二台。

最近的DNS服务器怎么知道根域的IP是多少?

我们也知道根域,就是域名树的顶层,既然是顶层,那信息一般也就相对少一些。对应的IPV4地址只有13个,IPV6地址只有25个。

我们可以通过dig命令的+trace选项来查看一个域名的dns解析过程。

e44bbc4e-a404-11ed-bfe3-dac502259ad0.png

而前面提到的传说中的13个根域,从字母a-m,就都在上图中。

但这又引发了一个问题,上面看到的都是域名。

这。。。

"我本来是想通过域名去找IP的,你又让我去找其他域名的IP?"

听起来不科学,这不就死循环 了吗。

是的,所以这些根域名对应的IP会以配置文件的形式,放在每个 域名服务器中。

也就是说并不需要再去请求根域名对应的IP ,直接在配置里能读出来就好了。

下面这个截图是域名服务器里的配置内容。

可以看到A开头的根域,它的IPV4地址是198.41.0.4。

e475bada-a404-11ed-bfe3-dac502259ad0.png

加入多级缓存

对于高并发读多写少的场景,加入缓存几乎就是标配。

DNS也不例外,它加了缓存,而且不止一层。

从在浏览器的搜索框中输入URL。它会先后访问浏览器缓存操作系统的缓存 /etc/hosts、最近的DNS服务器缓存 。如果都找不到,才是到根域,顶级(一级)域,二级域等DNS服务器进行查询请求。

e4938ba0-a404-11ed-bfe3-dac502259ad0.png

加入缓存后的DNS查询顺序

于是请求过程就成了下图这样。可以看到上面提到的好几有缓存的地方我都加了个绿色的小文件图标,优先在缓存里做查询。

e4ae84d2-a404-11ed-bfe3-dac502259ad0.png

加入缓存后的DNS查询过程

由于缓存了上面树状结构的信息,最近的DNS服务器也不再需要每次都从根域 开始查起。比如在缓存里能找到baidu.com的服务器IP,就直接跳到二级域服务器上做查找就好了。

正因为多级缓存的存在,每一层实际接收到的请求都大大减少了。并且每个人日常访问的网站也就那么几个,所以大部分时候都能命中缓存直接返回IP地址。

简单小结下。

DNS的设计中,通过层次结构将服务进行拆分 ,流量分散到多个服务器中。

又通过加入多级缓存 ,让每个层级实际接收到的请求大大减少,因此大大提高了系统的性能。

两点 ,是我们做业务开发的过程中可以参考的优秀设计。

还有一点 ,是我们大概率学不来的,叫任播 ,它也为DNS实现高并发处理能力提供了重要支持,我会把它放到放到下一篇文章展开聊聊。

协议格式

DNS是个域名解析系统,而运行在这套系统上的协议,就叫DNS协议

和HTTP类似,DNS协议也是个应用层协议

e4c59848-a404-11ed-bfe3-dac502259ad0.png

DNS是应用层协议

下图是它的报文格式。

e4e906d4-a404-11ed-bfe3-dac502259ad0.png

DNS报文

字段太多,很晕?这就对了。

我们就挑几个重点的说说。

Transsaction ID 是事务ID,对于一次请求 和这个请求对应的应答 ,他们的事务ID是一样的,类似于微服务系统中的log_id。

flag字段 是指标志位,有2个Byte,16个bit,需要关注的是QR,OpCode, RCode。

QR 用来标志这是个查询还是响应报文,0是查询,1是响应。

OpCode 用来标志操作码,正常查询都是0,不管是域名查ip,还是ip查域名,都属于正常查询 。可以粗暴的认为我们平时只会看到0。

RCode 是响应码,类似于HTTP里的404, 502 这样的status code。用来表示这次请求的结果是否正常。0是指一切正常。1是指报文格式错误,2服务域名服务器内部错误。

Queries 字段,是指你实际查询的内容。这里其实包含三部分信息,Name, Type, Class。

e50aa47e-a404-11ed-bfe3-dac502259ad0.png

查询的内容分成三部分信息

Name 可以放域名或者IP。比如你要查的是baidu.com这个域名对应的IP,那里面放的就是域名 ,反过来通过IP查对应的域名,那Name字段里放的就是IP

Type 是指你想查哪种信息,比如你想查这个域名对应的IP地址是什么,那就是填A(address),如果你想查这个域名有没有其他别名,就填CNAME(Canonical Name)。如果你想查 xiaobaidebug@gmail.com对应的邮箱服务器地址是什么(比如 gmail.com),那就填MX(Mail Exchanger)。除此之外还有很多类型,下面是常见的Type表格。

e5230956-a404-11ed-bfe3-dac502259ad0.png

• Class字段就比较有意思了,你可以简单的认为,我们只会看到它填IN (Internet)。其实DNS协议本来设计出来是考虑到可能会有更多的应用场景的,比如这里还能填CH,HS。大家甚至都不需要知道它们是什么含义,因为随着时间的发展,这些都已经成化石了,我们知道这个字段的唯一作用,可能 就是可以在面试的时候可以随意装个x,深藏功与名。

e544ef08-a404-11ed-bfe3-dac502259ad0.png

Answers 字段,从名字可以看出,跟Queries对应,一问一答 。作用是返回查询结果,比如通过域名查对应的IP地址,这个字段里就会放入具体的IP信息。

e583f432-a404-11ed-bfe3-dac502259ad0.png

抓包

原理看完了,来抓个包吧。

我们打开wireshark。然后执行

digwww.baidu.com

此时操作系统会发出DNS请求,查询 www.baidu.com对应的IP地址。

e60a9b5e-a404-11ed-bfe3-dac502259ad0.pngDNS_Query

上面的图里是DNS查询(request)的内容,可以看到它是应用层的协议,传输层用的是UDP协议 进行数据传输。截图里标红的部分,也就是上面提到的需要重点关注的报文字段内容。其中flag字段是按bit展示的,因此抓包里进行了分行展示。

接下来再看下响应(response)的数据包内容。

e6c78bec-a404-11ed-bfe3-dac502259ad0.png

DNS_Response

可以看到事务ID (Transaction ID)跟DNS请求 报文是一致的。并且Answers字段里带有两个IP地址。试了下,两个IP地址都是可以正常访问的。

e6fda6e6-a404-11ed-bfe3-dac502259ad0.pnge71235f2-a404-11ed-bfe3-dac502259ad0.png

总结

• DNS是非常优秀的高并发分布式系统,通过层次结构将服务进行拆分 ,流量分散到多个服务器中。又通过加入多级缓存 ,让每个层级实际接收到的缓存大大减小,因此大大提高了系统的性能。这两点在做业务开发的过程中是可以借鉴的。

• 插上网线通网时,本机通过DHCP协议获得DNS服务器的地址。

• 根域服务器的IP会以配置的形式加载到每一台DNS服务器当中。因此访问任意一台DNS服务器都能轻松找到根域对应的IP地址。

最后

最后给大家留下两个问题。

e731159e-a404-11ed-bfe3-dac502259ad0.png

DNS基于UDP协议

• 从抓包可以看出,DNS在传输层上使用了UDP协议,那它只用UDP吗?

• 上面提到,DNS的IPV4根域名 只有13个,这里面其实有不少都部署在漂亮国,那是不是意味着,只要他们不高兴了,切断我们的访问,我们的网络就得瘫痪了呢?







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    8986

    浏览量

    85119
  • DNS
    DNS
    +关注

    关注

    0

    文章

    215

    浏览量

    19775
  • URL
    URL
    +关注

    关注

    0

    文章

    139

    浏览量

    15304
  • DHCP协议
    +关注

    关注

    0

    文章

    4

    浏览量

    4951

原文标题:DNS中有哪些值得学习的架构设计

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    值得多看的FPGA 学习路线

    这个语言做验证 。 FPGA入门学习第二部分:基础知识 说完了编程语言,我们再来看看入门FPGA的第二部分内容:基础知识。这里主要有专业基础课和FPGA相关的专业知识两部分。 专业基础课不多说了,都是
    发表于 01-02 23:03

    esp8266 DNS失败的原因?

    情况下返回错误代码get_hosted_name召回 错误代码: -1 = ESPCONN_MEM -5 =ESPCONN_INPROGRESS 只有当 ESP8066 重新启动时,才能成功请求 DNS
    发表于 07-12 07:15

    如何解决DNS解析错误故障

    DNS解析出现错误,就是把一个域名解析成一个错误的IP地址,或者根本不知道某个域名对应的IP地址是什么时,我们就无法通过域名访问相应的站点了,这就是DNS解析故障。出现DNS解析故障最
    发表于 09-29 15:14

    DNS攻击防范科普系列1》—你的DNS服务器真的安全么?

    的网络安全威胁,一直是网络基础架构中较弱的一环。 我们先来看看DNS服务器的威胁之一:DDoS攻击。DDoS攻击,即分布式拒绝服务攻击,攻击者通过控制大量的傀儡机,对目标主机发起洪水攻击,造成服务器瘫痪
    发表于 10-16 15:21

    DNS攻击防范科普系列2》 -DNS服务器怎么防DDoS攻击

    在上个系列《你的DNS服务真的安全么?》里我们介绍了DNS服务器常见的攻击场景,看完后,你是否对ddos攻击忧心重重?本节我们来告诉你,怎么破局!!首先回顾一下DDoS攻击的原理。DD
    发表于 10-16 15:28

    组播DNS的潜在问题

    我们目前使用的是和声V2.01,但这个问题也在后来的版本中,包括V2.06。这里是framework/tcpip/src/zero_conf_mulitcast_dns.c:bMsgIsAQuery
    发表于 03-24 09:47

    值得学习的机器学习编程语言

    选择最能满足个人需求,以及保证自己将来能够在 AI 和机器学习领域顺利发展的编程语言。在本文中,我们将介绍最值得学习的 5 种编程语言,这些语言不仅能够为机器
    发表于 03-02 06:22

    qt值得学习吗?

    关注+星标公众号,不错过精彩内容作者 |李肖遥转自|技术让梦想更伟大qt值得学习吗?嵌入式要学的东西真的很多,我们可能会说不写界面的话就不用学qt了?我不赞同。Qt的实现主要是采用p...
    发表于 11-08 06:01

    什么是DNS

    什么是DNS  英文缩写: DNS 中文译名: 域名系统 分  类: IP与多媒体 解  释: 遍布于因特网的数据库。
    发表于 02-22 17:25 1081次阅读

    DNS是什么DNS原理入门指南资料概述

    DNS 是互联网核心协议之一。不管是上网浏览,还是编程开发,都需要了解一点的知识。本文详细介绍DNS的原理,以及如何运用工具软件观察的运作。我的目标是,读完此文后,你就能完全理解
    的头像 发表于 02-03 08:58 5211次阅读

    DNS服务器和DNS服务器地址是什么

    今日就来同大家分享什么是DNS服务器地址,DNS服务器地址怎么找,帮助大家更了解DNS服务器。首先,我们一起来聊聊什么是DNS服务器,什么是
    的头像 发表于 03-30 15:57 8688次阅读

    DNS污染是是什么,DNS污染怎么解决

    DNS污染是指有意或无意进行的域名服务器分组,将域名指向错误的IP地址。 什么是DNS污染? DNS污染有哪些处理方法 一般而言,网站通常在Internet上具有可靠的域名服务器,但是为了减少
    发表于 04-19 09:43 1.1w次阅读

    dns是什么意思 dns作用是什么介绍

    dns是什么意思 dns作用是什么介绍
    发表于 10-17 14:44 0次下载

    DNS服务器是什么?有哪些类型?

    每当我们单击网站上的链接时,我们的计算机都会搜索其DNS信息。DNS是互联网地址的数据库。在互联网上搜索信息时,我们会提交
    的头像 发表于 08-14 17:40 2209次阅读

    一文了解常见DNS结构

    的理解。 主DNS服务器 : 主DNS服务器是负责特定区域的权威DNS信息的主要来源。保存着该区域内域名与IP地址等资源记录的原始、准确和权威的信息。对该区域内域名的查询,主
    的头像 发表于 07-05 15:32 275次阅读