点击上面的“Yudao Code”,选择“”
她是前浪还是后浪有关系吗?
能浪的就是好浪!
文章每天10点33分更新,每天都有亿万根头发掉……
源码精品专栏
我曾经是一名学生。现在回想起来,我发现学生时代的男生都有着非常美好的回忆。他们总是能记住一串复杂而神秘的字母数字域名。有的高手甚至可以直接输入IP地址就可以上网。
每天晚上,当他们翻过学校围墙去网吧的时候,总能发现他们在某个论坛里寻找开源学习资料,并且完成后还不忘记祝好贴者一生平安。页面底部。
原来,那个时候,他们就已经在学习互联网最重要的开源、共享精神了。
每每想起,我都感慨万千。
感动了。
我们会发现这里有几个技术问题值得讨论。
例如,为什么我可以同时使用域名和IP访问?
他们之间是什么关系。
再深入一点,我们可以谈谈DNS的原理,以及它的设计有哪些方面值得学习。
今天的话题,我们先来说说为什么需要DNS。
如果我们想要访问某个程度,可以在浏览器的搜索栏中输入IP地址112.80.248.76直接进入该页面。
通过IP访问网页
这种行为是合法的,但却是病态的。
大多数人连伴侣的电话号码都记不住,又怎么能记住这么一串IP地址呢。
哦,对不起,我伤害了我的兄弟,你没有伙伴。
但我假设你有。
回想一下,虽然您不记得伴侣的电话号码,但这并不妨碍您给她打电话。你是否打开通讯录,输入“富婆”,然后就会弹出一个电话号码?点击拨打电话。
在计算机领域,你很可能记不住自己的IP,所以你也需要类似的通讯录功能。比如你只需要输入它,它就会帮你找到对应的112.80.248.76,然后访问。
使用域名访问
其中就是域名,通过域名可以获取到其背后的IP,即112.80.248.76。
就像一个人可以有多个电话号码一样,一个域名也可以对应多个IP地址。
将域名解析为IP的过程,即查看“地址簿”的过程,实际上就是DNS( Name )协议需要做的事情。
另外需要注意的是,上面的IP地址在我写这篇文章的时候是可以访问的,但是并不意味着每个人在阅读文章的时候都可以访问。因为这背后的IP地址可能会改变。通过ping可以获取最新的IP地址。
ping 获取IP
但问题来了。
普通人的通讯录一般有上千个电话号码,这对于一个社交达人来说已经绰绰有余了。
但网站域名不同。据说2015年就突破了3亿。
如果这3亿条记录放在一台服务器上,就会出现两个问题。
显然,如果把DNS做成像手机通讯录一样的单点服务,是不可能实现这样的能力的,一定是分布式系统。
那么,问题就变成了,如何设计一个支持千亿+qps请求的大规模分布式系统。
我知道有些人会说,“这是只服务 10qps 的人应该考虑的事情吗?”
虽然我们提供的服务可能只有10qps,但这并不妨碍我们学习DNS中优秀的设计。
让我们从 URL 的层次结构开始。
基于Boot+Plus+Vue实现的后台管理系统+用户小程序,支持RBAC动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
举个例子。常见的域名,例如.
可以看到,这个域名中间有两个句点。域名可以使用句点符号分为三部分。
其中,com称为一级域名或顶级域名。其他常见的顶级域名还有cn、co等,baidu为二级域名,www为三级域名。
另外,com后面其实还有一个省略的句点。它称为根域。
域名层次结构
当域名较多时,将其中相同的部分提取出来,多个域名就可以成为这样一个树状的层次结构。
等级制度
这时候我们就可以看到,这些域之间其实是存在层级关系的,就像学校、年级、班级一样。
当你想定位某个特定的域名时,可以通过该级别找到对应的域名。
举个例子。大家应该还记得那则广告:“三年级二班李晓明,你妈妈给你送了两罐旺仔牛奶”。事实上,李晓明的母亲通过了学校、年级、班级的等级形式。找人。
基于Cloud++Nacos++Vue实现的后台管理系统+用户小程序&支持RBAC动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
我们回来看看大佬们是怎么设计DNS的。
让我们先直接得出最重要的结论。
接下来展开。
DNS承载的流量压力很大,而且必须是分布式服务。那么问题的关键就变成了如何拆分服务。
由于URL具有树状的层次结构,因此存储它们的服务也可以基于此自然地拆分为树状形式。
服务器维护一个或多个域的信息。于是服务就变成了如下的分层形式。
当我们需要访问时。
查询流程如下图。
DNS查询流程
该请求将首先发送到最近的 DNS 服务器(例如您的家庭路由器)。如果在DNS服务器中没有找到,则DNS服务器会直接询问根域服务器。虽然根域服务器中没有这样的记录,但是它可以知道这个URL属于com域,所以它找到com域服务器的IP地址,然后访问com域服务器,重复上面的操作,并且然后查找哪台服务器有baidu域,继续查找,直到找到一条记录,最后返回对应的IP地址。
可以看到,原理比较简单,但是这里涉及到两个问题。
让我们一一回答。
我之前在《刚插上网线,电脑怎么知道自己的IP是什么?》中写过这个。 “如前所述,当插入网线时,机器将通过 DHCP 协议获取机器的 IP 地址、子网掩码、路由器地址和 DNS 服务器 IP 地址。
DHCP协议
下面是我的 mac 机器上 DHCP Offer 第二阶段的抓包截图。可以看到,这里返回的信息包含了DNS服务器的IP。
报价阶段
同时,您还可以通过点击左上角苹果图标->系统表首选项->网络->高级->DNS来查看左上角DNS服务器的IP地址。
这里有一个小细节。从上面的抓包图中可以看到,路由器地址、DNS服务器地址、DHCP服务器地址实际上都是192.168.31.1。这实际上是我家用路由器的IP地址,也就是说大多数家用路由器都带有这些功能。
在某个云服务器中,DNS服务器也是如此,通过dhcp协议获取。检查DNS服务器的IP地址也很方便。只需执行cat /etc/.conf即可。
从上面可以看到有两个DNS服务器。机器将按照请求在文件中出现的顺序发起请求。如果第一个服务器没有响应,它将请求第二个服务器。
我们还知道根域是域名树的最顶层。由于它是顶层,因此信息通常相对较少。对应的IPV4地址只有13个,IPV6地址只有25个。
我们可以使用dig命令的+trace选项来查看某个域名的dns解析过程。
前面提到的传说中的13个根域,从字母am开始,都在上图中。
但这又引发了另一个问题。上面你看到的都是域名。
这。 。 。
“我本来想通过域名来查找IP,但是你却让我从其他域名中查找IP?”
听起来很不科学,这不是无限循环吗?
是的,所以这些根域名对应的IP会以配置文件的形式放在各个域名服务器中。
也就是说,不需要请求根域名对应的IP,直接在配置中读取即可。
下图是域名服务器中的配置内容。
可以看到以A开头的根域,其IPV4地址为198.41.0.4。
对于读多写少的高并发场景,添加缓存几乎是标配。
DNS 也不例外。它增加了缓存,并且有不止一层。
首先在浏览器的搜索框中输入 URL。它会依次访问浏览器缓存、操作系统缓存/etc/hosts、以及最近的DNS服务器缓存。如果找不到,则向根域、顶级域、二级域等DNS服务器发出查询请求。
添加缓存后的DNS查询顺序
那么请求流程就变成了下图所示。您可以看到我在上面提到的几个缓存位置添加了一个绿色的小文件图标,以对缓存中的查询进行优先级排序。
添加缓存后的DNS查询流程
由于上述树形结构中的信息被缓存,因此不再需要每次都从根域查找最近的DNS服务器。例如,如果在缓存中可以找到服务器IP,则直接跳转到二级域服务器进行搜索即可。
由于多级缓存的存在,每一层实际收到的请求都大大减少。而且大家每天只访问几个网站,所以大多数时候都可以命中缓存,直接返回IP地址。
一个简短的总结。
DNS的设计中,通过分层结构进行服务拆分,将流量分散到多台服务器上。
通过添加多级缓存,每一级实际收到的请求都大大减少,从而大大提高了系统的性能。
这两点都是我们在业务发展过程中可以参考的优秀设计。
但还有一点我们很可能不会学,那就是 。它还为DNS实现高并发处理能力提供了重要支持。我将在下一篇文章中讨论它。
DNS是一个域名解析系统,在这个系统上运行的协议称为DNS协议。
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。