一文搞懂DNS

最近接触一个关于网络加速的项目,项目主要目的是加速用户请求访问网络的响应速度,提高用户体验。在这个项目中总是提及两个名词“DNS”和“CDN”,咋一看,3个字母就有2个字母一样,容易混淆,但此“DN”非彼“DN”,DNS全名:Domain Name System,域名系统,CDN全名:Content Delivery Network,内容分发网络,所以这两不是同一个概念,但它们之间又有着分不开的关系。DNS我们相对熟悉,在电脑配置网络时总遇到,CDN我们日常很少遇到,这里我打算彻底搞清楚DNS和CDN概念及他们之间的关系。

什么是DNS

DNS,全称 Domain Name System 。采用 client/server 模式,DNS client 发出查询请求,DNS server 响应请求。DNS client 通过查询 DNS server 获得主机的 IP 地址,进而完成后续的 TCP/IP 通信过程。
在这里插入图片描述

为什么要DNS

大部门分网站服务都是基于TCP/IP协议,而TCP/IP协议又是基于 IP 地址去查找对应主机服务进行通信的,但是 IP 地址是一长串数字不太好记,于是为了好记出现了域名代理IP地址,比如百度:www.baidu.com,我们平时上网访问某个网站都是通过www.xxx.com这种域名方式就行能通信访问。用域名虽然好记方便了客户端的使用,但怎么把域名解析成对应的IP地址呢?

当需要请求的网站数量比较少时,我们就能把对应IP地址和域名的对应关系存在本地hosts文件中,但是随着网络规模的不断扩大、接入计算机的数量不断增加,现在成千上万的网站域名,我们总不能把所有的域名和IP地址对应关系都存在hosts文件中吧,且每台主机的 hosts 文件都需要单独手工更新。维护难度越来越大,每台主机同步更新,几乎是一件不可能完成的任务。

那有没有专门负责做域名解析及管理的呢?这时DNS域名系统就出现了,为了解决域名及IP地址互相转换的系统。

DNS 域名

要理解DNS就得先了解什么是域名 。域名是为了识别主机名的一种分层的名称。因为单独的一台域名服务器是不可能知道所有域名信息,所以域名系统是一个分布式数据库系统,域名(主机名)到 IP 地址的解析可以由若干个域名服务器共同完成。每一个站点维护自己的信息数据库,并运行一个服务器程序供互联网上的客户端查询。DNS 提供了客户端与服务器的通信协议,也提供了服务器之间交换信息的协议。由于是分布式系统,即使单个服务器出现故障,也不会导致整个系统失效,消除了单点故障。

DNS 域名组成

DNS 域的本质是一种管理范围的划分,最大的域是根域,向下可以划分为顶级域、二级域、三级域、四级域等。相对应的域名是根域名、顶级域名、二级域名、三级域名等。不同等级的域名使用点号分隔,级别最低的域名写在最左边,而级别最高的域名写在最右边。
在这里插入图片描述
举个栗子:网站域名 www.tsinghua.edu.cn 中,从右到左开始,cn 是顶级域名,代表中国,edu 是二级域名,代表教育机构,tsinghua 是三级域名,表示清华大学,www 则表示三级域名中的主机,并提供了 web 服务。
在这里插入图片描述
除了 www 主机外,常见的主机还有 arch 、sem 、mail ,域名如下:
在这里插入图片描述

每一级的域名都由英文字母和数字组成,域名不区分大小写,长度不能超过 63 字节,一个完整的域名不能超过 255 个字节。

DNS 域名服务器

DNS 域名空间的层次结构,允许不同的域名服务器管理域名空间的不同部分。域名服务器是指管理域名的主机及软件,它可以管理所在分层的域,每层都设有一个域名服务器。
在这里插入图片描述

  • 本地域名服务器
    互联网接入服务运营商或者一个大的网络机构,像公司、大学等都有一台或多台可以自行管理的域名服务器,这类域名服务器称为本地域名服务器,也称为默认域名服务器。本地域名服务器离客户端较近。当一个 DNS客户端发出 DNS 查询时,首先送到本地域名服务器。如果本地域名服务器数据库中有对应的域名信息,会将查询的域名转换为 IP 地址返回客户端。如果没有,它会以 DNS 客户端的身份向根域名服务器进行查询。根域名服务器收到本地域名服务器的查询后,会返回相关域名服务器的 IP 地址,本地域名服务器再向相关域名服务器发送查询请求。

  • 根域名服务器
    通常根域名服务器用来管理顶级域,它注册了顶级域名服务器的 IP 地址,本身并不对域名进行解析,但它对 DNS 的检索数据功能起着至关重要的作用。如果想要新增一个一级域名,或者修改已有的顶级域名,就要在根域名服务器中进行新增或变更。IPv4 根域名服务器全球有 13 台,主机名分别为 A ~ M 。1 台为主根服务器在美国,其余 12 个均为辅根服务器,其中 9 个在美国,2 个在欧洲,位于英国和瑞典,1 台在亚洲,位于日本。所有的域名服务器都必须注册根域名服务器的 IP 地址,因为 DNS 根据 IP 地址进行检索时,需要按顺序从根域名服务器开始。

  • 授权域名服务器
    互联网上的主机在域名服务器上进行注册,这个域名服务器就是主机的授权域名服务器。通常,主机的授权域名服务器就是本地域名服务器。实际上,主机会有两个授权域名服务器,防止单点故障。授权域名服务器上有注册主机域名与 IP 地址的映射信息,当查询注册主机域名时,它会返回相应主机的 IP 地址。如果主机域名和 IP 地址需要进行变更,只需要在授权域名服务器处理即可,不用再向其它域名服务器进行申请或报告。

域名解析

将域名转换为对应的 IP 地址的过程叫做域名解析。在域名解析过程中,DNS client 的主机调用解析器( Resolver ),向 DNS server 发出请求,DNS server 完成域名解析。
在这里插入图片描述
客户端在查询 IP 地址时,向本地域名服务器进行递归查询。如果本地域名服务器的数据库有相应数据,则直接返回相应数据。如果没有,则本地域名服务器向根域名服务器进行迭代查询。从根开始对这棵树按照顺序进行遍历,直到找到指定的域名服务器,并由这个域名服务器返回相应的数据。客户端和本地域名服务器会将收到的信息保存在缓存里,这样可以减少每次查询时的性能消耗。
在这里插入图片描述
DNS 客户端进行域名 www.tsinghua.edu.cn 的解析的完整过程如下:
在这里插入图片描述

  • 1、DNS 客户端向本地域名服务器发送请求,查询 www.tsinghua.edu.cn 主机的 IP 地址;
  • 2、本地域名服务器查询数据库,发现没有域名为 www.tsinghua.edu.cn 的主机,于是将请求发送给根域名服务器;
  • 3、根域名服务器查询数据库,发现没有这个主机域名记录,但是根域名服务器知道 cn 域名服务器可以解析这个域名,于是将 cn 域名服务器的 IP 地址返回给本地域名服务器;
  • 4、本地域名服务器向 cn 域名服务器查询 www.tsinghua.edu.cn 主机的 IP 地址;
  • 5、cn 域名服务器查询数据库,也没有相关记录,但是知道 edu.cn 域名服务器可以解析这个域名,于是将 edu.cn 域名服务器的 IP 地址返回给本地域名服务器;
  • 6、本地域名服务器再向 edu.cn 域名服务器查询 www.tsinghua.edu.cn 主机 IP 地址;
  • 7、edu.cn 域名服务器查询数据库,也没有相关记录,但是知道 tsinghua.edu.cn 域名服务器可以解析这个域名,于是将 tsinghua.edu.cn 的域名服务器 IP 地址返回给本地域名服务器;
  • 8、本地域名服务器向 tsinghua.edu.cn 域名服务器查询 www.tsinghua.edu.cn 主机的 IP 地址;
  • 9、tsinghua.edu.cn 域名服务器查询数据库,发现有主机域名记录,于是给本地域名服务器返回 www.tsinghua.edu.cn 对应的 IP 地址;
  • 10、最后本地域名服务器将 www.tsinghua.edu.cn 的 IP 地址返回给客户端,整个解析过程完成。

域名解析是按照 DNS 分层结构的特点,自顶向下进行的。但是如果每一个域名解析都从根域名服务器开始,那么根域名服务器有可能无法承载海量的流量。在实际应用中,大多数域名解析都是在本地域名服务器完成。通过合理设置本地域名服务器,由本地域名服务器负责大部分的域名解析请求,提高域名解析效率。

好了,这篇DNS到这里,下篇准备搞懂CDN及与DNC的关系。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值