前言

我们在上一篇说到,IP 地址的发明把我们纷乱复杂的网络设备整齐划一地统一在了同一个网络中。

但是类似于 192.168.1.0 这样的地址并不便于人类记忆,于是发明了 域名(Domain Name) 来帮助解决这样的问题。

对应的,我们也需要一个系统来帮助"翻译":

Part 1. DNS 是什么?

DNS (Domain Name System 的缩写) 的作用非常简单,就是根据域名查出对应的 IP 地址,你可以把它想象成一本巨大的电话本

换句话说,DNS 是将域名映射到响应 IP 地址的服务。

Part 2. DNS 是如何工作的?

DNS 是我们今天使用 Internet 的核心。

最新报告显示,2020 年第三季度有 3.71 亿个域名,如果没有 DNS 将其对应解析成对应的 IP 地址,我们将会在网络世界中迷路。

当宁想要使用手机打电话给某人,宁几乎不太可能背出确切的电话号码,而是直接使用此人的名字进行搜索和拨号。

当宁想要加载网站时,DNS 会执行类似的操作。

解析域名或者主机名需要经历几个不同的阶段。

在某些情况下,DNS 解析是一个一步就完成的过程,而某些情况下,则需要联系多个 DNS 服务器。

下图就展示了这一过程必要的步骤,并且没有考虑浏览器缓存:

过程可能有些复杂,为了便于理解,我们在进一步说明之前需要先说明两点:「DNS 服务器和域名的分级」 以及 「DNS 缓存」

Part 3. 域名和 DNS 服务器的分级

域名的分级

我们日常上网输入的网址,比如:https://www.google.com,其实可以拆成几个部分看待:

默认支持的服务类型(HTTP/ HTTPS)、主机名(www)、端口号(80)、默认文档(index.html)是可以省略的,所以以上网址可以省略为:google.com

严格来说,google.com 才被称为域名(全球唯一)www 是主机名,对应着一种服务,google.com 域名下不同的主机服务器,可以提供很多不同的服务:

wwwblog 等很多服务可以部署在同一台服务器上,而一台服务器独占着一个 IP 地址,可见,域名和 IP 地址的对应关系可以是多对一的,或者一对多(负载均衡),也可以一对一

所有的域名都有一个的概念,所以整个互联网的域名空间看起来会是这样:

DNS 分级

把全世界所有的电话号码存储在同一个通讯录里面既不现实也效率低下。

DNS 也是类似,对应域名空间,DNS 也有类似的结构:

整个域名系统采取分布式存储

全世界根域名服务器总共有 13 个,其中 10 个在美国,英国瑞典各 1 个,日本 1 个:

这是逻辑上的数量,这 13 个根域名器服务器背后其实还是有很多台物理的服务器在工作。

根域名服务器只负责管理顶级域名服务器(Top Level Domain,简称 TLD),记录所有 TLD 的位置。

而 TLD 则对应管理着所有注册在当前顶级域名下的所有权限服务器,也就是真实提供服务的服务器的真实 IP 地址。

这有点儿类似于我们真实的通讯录,比如我们想要给 香克斯 打电话:

可以这样想象:全世界的域名被根域名服务器逻辑的统一在一个通讯录中,而根域名服务器就像右边的导航一样,存储着不同标识对应列表的位置信息;

而这些标识类似于顶级域名服务器,存储着注册其下所有的权限服务器(比如 google.com 对应的服务器)信息;

只有查询权限服务器,你才能拿到详细的 IP 地址(不考虑缓存的情况下);

Part 4. 为什么需要 DNS 缓存?

通过上面通讯录的例子,我们已经足够理解 DNS 查询的主要过程了:(再来看一眼)

但实际上,真正访问 DNS 服务器之前,我们会在多个地方缓存域名与 IP 之间的对应关系:

  1. 这样可以减少对 DNS 服务器的访问,减缓 DNS 服务器的访问压力;
  2. 这样也能够加快域名解析的过程;

涉及 DNS 的地方就会有缓存,包括浏览器、操作系统、本地 DNS 服务器、路由器、ISP 提供的递归路由器、根域名服务器等,它们都会对 DNS 结果做一定程度的缓存。

但是,DNS 缓存也存在一些问题:

  1. DNS 更改刷新需要时间来传播,这意味着每一台 DNS 服务器缓存更新到最新的 IP 需要一段时间;
  2. DNS 缓存也是黑客潜在的攻击手段;

Part 5. 一次请求的详细过程

这一次我们来跟踪一次详细的过程,例如我们在浏览器输入网址 www.example.com 并回车:

  1. 查询浏览器缓存,有结果则返回;(如果你使用 Chrome 浏览器可以输入 chrome://net-internals/#dns 自行查看)
  2. 查询系统缓存,通常存在于 host 文件中,有结果则返回;
    • Mac:/etc/hosts
    • Windows:C:\Windows\System32\drivers\etc\hosts
  3. 本地 DNS 服务器,通常是路由器,有结果则返回,否则向上查询直连 ISP 的递归 DNS 服务器;

  4. 查询 ISP 提供的 「递归 DNS 服务器」,有缓存则返回,否则一直递归查询到 「根服务器」
  5. 「递归 DNS 服务器」「根服务器」 查询 .com 权威 DNS 服务器」 的地址;
  6. 「递归 DNS 服务器」.com 权威 DNS 服务器」 查询 example.com 所使用权威 DNS 服务器」 的地址;
  7. 「递归 DNS 服务器」example.com 所使用权威 DNS 服务器」 查询解析获得 DNS 记录并缓存
  8. 「递归 DNS 服务器」 向浏览器返回结果;
  9. 浏览器拿到 IP 地址并向 www.example.com 发送请求;(完毕)

结合上面的内容,我相信你已经对 DNS 如何工作不再陌生。

相关问题

为什么根 DNS 只有 13 台?

简而言之:由于历史和技术原因,对于 IPv4 来说,根 DNS 只能有 13 个。

不简而言之的简而言之

DNS 消息使用 UDP 协议进行传输,这规定了消息最大的长度在 512 字节(不包含 IP 头部、UDP 头部)。

有了最大长度限制之后,一个 UDP 协议传输的 DNS 响应能够返回的资源记录数量就是有限的。

要让所有的根服务器数据能包含在一个 512 字节的 UDP 包中,根服务器只能限制在 13 个。(事实上改进之后才能容纳 13 个,最开始也没有 13 个这么多)

扩展阅读(下3)

当键入网址后,到网页显示,其间发生了什么?

本文涉及输入网址访问,这是自然而然会联想到的问题。但本文只是详细说明了 DNS 查询域名背后 IP 的过程。

该问题涉及浏览器原理、网络协议等细节问题,感兴趣可以戳这里(下4)

美国如果把根域名服务器封了,中国会从网络上消失吗?

美国拥有最多的根域名服务器,如果美国把根域名服务器封了,中国会从网络上消失吗?

答案是:不会。 因为虽然根不在我们手里,但是我们有镜像(备份)。

扩展阅读(下5)

后记

这一篇文章我们又进一步揭开了一点网络关于 DNS 一角的神秘面纱:

也是使用了 PPT 制作了动图帮助大家理解,希望大家能够有所收获。

后续也会继续跟大家一起学习计算机网络的基础知识,也会尝试着跟着后端学习路线图的脚步跟着大家一起学习进阶。

(完)

参考资料

  1. What Is A Domain Name System (DNS) & How Does It Work? - https://phoenixnap.com/kb/what-is-domain-name-system-works
  2. 域名报告 - https://www.verisign.com/assets/domain-name-report-Q32020.pdf
  3. 根域名服务器只有 13 台? - https://zhuanlan.zhihu.com/p/107492241
  4. 30张图解:当键入网址后,到网页显示,其间发生了什么? - https://zhuanlan.zhihu.com/p/113702574
  5. 美国如果把根域名服务器封了,中国会从网络上消失? - https://segmentfault.com/a/1190000023696737
  • 本文已收录至我的 Github 程序员成长系列 【More Than Java】,学习,不止 Code,欢迎 star:https://github.com/wmyskxz/MoreThanJava
  • 个人公众号 :wmyskxz,个人独立域名博客:wmyskxz.com,坚持原创输出,下方扫码关注,2020,与您共同成长!

Hi,这里是 我没有三颗心脏,2021,与您在 Be Better 的路上共同成长!

DNS 是什么?如何运作的?的更多相关文章

  1. 保护DNS服务器3大方法

    保护DNS服务器3大方法       DNS全称DomainNameSystem域名解析系统,通俗地说,DNS就是帮助用户在Internet上寻找名称与IP对应的解析服务.为了更方便使用网络资源,DN ...

  2. Kubernetes DNS 高阶指南(转发别人 解析很详细)

    转发地址:http://www.jintiankansha.me/t/Js1R84GGAl DNS 是 Kubernetes 的核心功能之一,Kubernetes 通过 kube-dns 或  Cor ...

  3. Linux 如何查看修改DNS配置

    DNS服务器介绍 DNS是计算机域名系统(Domain Name System 或Domain Name Service) 的缩写,它是由域名解析器和域名服务器组成的.域名服务器是指保存有该网络中所有 ...

  4. DNS 原理入门

    导读 DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识.本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作.我的目标是,读完此文后,你就能完全理解DNS. 一 ...

  5. DNS原理

    DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作.我的目标是,读完此文后,你就能完全理解DNS. 一.D ...

  6. dns简介

    dns(domain name system),它是提供域名到ip的解析功能的系统.它和普通的系统一样,也是运行在服务器之上的. 1.dns指定的ip是用来干嘛的? 这个ip指向dns系统所在的机器. ...

  7. 最全面的 DNS 原理入门

    DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作.我的目标是,读完此文后,你就能完全理解DNS. 一.D ...

  8. DNS负载均衡

    1)DNS负载均衡的介绍 对于负载均衡的一个典型应用就是DNS负载均衡.庞大的网络地址和网络域名绝对是负载均衡体现优势的地方.那么它的具体原理是如何的呢?本文就将为大家详细介绍一下相关内容. DNS负 ...

  9. 解析:DNS 原理(入门篇)

    DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作.我的目标是,读完此文后,你就能完全理解DNS. 一.D ...

随机推荐

  1. 【System】进程,线程和任务之间的区别是什么?

    任务(task)是最抽象的,是一个一般性的术语,指由软件完成的一个活动.一个任务既可以是一个进程,也可以是一个线程.简而言之,它指的是一系列共同达到某一目的的操作.例如,读取数据并将数据放入内存中.这 ...

  2. k8s-jenkins持续发布tomcat项目

    k8s-jenkins持续发布tomcat项目 一.需求 这个实验前期后后搞了很久(公司经常插一些别的事过来,然后自己比较懒,再加上自己知识不够扎实).二进制部署完k8s集群就开始做jenkins持续 ...

  3. vue2.0、vue3.0不同之处

    一.响应式赋值操作不同 Vue2.0 1.通过data返回对象做相应: 2.对复杂的对象或数组下的属性等深层次的改变需要通过$set的方式. Vue3.0 1.ref实现简单的实现响应,通过value ...

  4. Python赋值、浅复制和深复制

    Python赋值.浅复制和深复制 ​ 首先我们需要知道赋值和浅复制的区别: 赋值和浅复制的区别 赋值,当一个对象赋值给另一个新的变量时,赋的其实是该对象在栈中的地址,该地址指向堆中的数据.即赋值后,两 ...

  5. SpringBoot单元测试的两种形式

    @ 目录 前言 demo环境 springbootTest Junit 总结 前言 最近公司要求2021年所有的项目代码单元测试覆盖率要达到90%,作为刚毕业的小白来说这简直就是噩梦啊,springb ...

  6. 在线配置热加载配置 go-kratos.dev 监听key

    paladin https://v1.go-kratos.dev/#/config-paladin example Service(在线配置热加载配置) # service.go type Servi ...

  7. It is thread-safe and idempotent, but not reentrant.

    https://github.com/django/django/blob/master/django/apps/registry.py

  8. 选出ip记录表最近的10行数据

    w select * from wip where id>(select (select max(id)from wip)-10) ;

  9. loj10172

    涂抹果酱 Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM  ...

  10. jQuery——开发插件

    当我们编写的代码可以供其他人甚至我们自己重用的时候,可以通过将这些代码打包成一个新插件. ###**在插件中使用别名∗∗自定义的插件就应该始终都使用jQuery这个名字来调用jQuery方法,或者也可 ...