中科大计网学习记录笔记(九):DNS

2024-02-12 00:28

本文主要是介绍中科大计网学习记录笔记(九):DNS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程
该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信息量过大,有太多无法理解的地方,在我第一次点开的时候也有相同的感受,但经过了一段时间项目的学习,对计网有了更多的了解,所以我准备在这次学习的时候做一些记录并且加入一些我的理解,希望能够帮助到大家。
往期笔记可以看专栏中的内容😊😊😊

文章目录

      • 2.5 DNS
        • 2.5.1 DNS 的必要性
        • 2.5.2 DNS 的实现思路与目的
        • 2.5.3 DNS 的域名解构
        • 2.5.4 DNS 的名字空间
        • 2.5.5 DNS 的工作过程
        • 2.5.6 DNS 协议报文
        • 2.5.7 如何新增一个域名?

2.5 DNS

💡 DNS(Domain Name System,域名系统)是互联网中用于将域名解析为与之对应的 IP 地址的分布式数据库系统。它实现了域名到 IP 地址的映射,为用户提供了便于记忆的域名访问方式,而不必记住复杂的 IP 地址。

2.5.1 DNS 的必要性

👉 IP 地址标识主机和路由器,但是 IP 地址的问题是 不好记忆,不便于人类的使用

  • 人类还是更倾向于用一个有意义的字符串来标识 Internet 上的设备。
  • 但访问还是要通过 IP 地址(通过 TCP 来通信),所以需要有一个应用能够将这个字符串转换为 IP 地址(域名 => IP 地址)

👉 问题 1:如何使用唯一的字符串去标示一个 IP 地址?

  • 使用层次化的命名方式

👉 问题 2:如何完成名字到 IP 地址的转换?

  • 全球范围内的服务导致访问量很大,且对速度有要求,需要分布式的数据库维护和响应名字查询

👉 问题 3:如何维护这些对应关系?增加或者删除域名的业务

2.5.2 DNS 的实现思路与目的

👉 DSN 的实现思路:

  1. 分词的、基于域的命名机制
  2. 若干分布式的数据库完成名字到 IP 地址的转换
  3. 运行在 UDP 之上端口为 53 的应用服务(无连接的)
  4. 核心的 Internet 功能,但以应用层的协议去实现

👉 DNS 的主要功能

  1. 域名解析: 将人类可读的域名(如example.com)解析为计算机可识别的IP地址(如192.0.2.1)。
  2. 逆向解析: 将IP地址解析为相应的域名。
  3. 负载均衡: 通过DNS解析将访问请求分发到多个服务器上,实现负载均衡,提高网站的性能和可用性。
  4. 邮件路由: 通过DNS解析确定邮件服务器的路由,将电子邮件发送到正确的目标邮箱。
  5. 安全防护: DNS可以实现一些安全功能,如阻止恶意网站、拦截垃圾邮件等。

💡 这里来提一下负载均衡,首先要知道,一个分布式的应用会有多个服务器

  • 也就对应着多个地址,而一个域名是可以绑定多个 IP 地址的
  • 当客户端向DNS服务器发起域名解析请求时,DNS服务器会返回多个IP地址中的一个给客户端,客户端随机选择一个IP地址进行连接。
2.5.3 DNS 的域名解构

💡 域名是用于在互联网上唯一标识主机或域的名称,它具有 层次结构,由多个部分组成,各部分之间用点号(.)分隔。

在DNS的域名解析过程中,域名被划分为多个层次,从右向左依次为:

  • 顶级域名(Top-Level Domain,TLD)
  • 二级域名(Second-Level Domain)、三级域名(Third-Level Domain)
  • 子域名(Subdomain)

顶级域名有上百个,这里举例一些常用的

  • 通用的(generic)
    • .com; .edu ; .gov ; .int ; .mil ; .net ; .org .firm ; .hsop ; .web ; .arts ; .rec ;
  • 国家的(countries)
    • .cn ; .us ; .nl ; .jp

每一级的域名会对应着一个或者多个域名服务器的地址,而顶级域名也对应着一个DNS根名字服务器

  • DNS 根名字服务器 是 DNS系统中的最高层次的域名服务器,负责管理顶级域名(Top-Level Domains,TLDs)的域名解析。
  • DNS系统的域名解析过程是 逐级向下 查询的,直到能够找到目标域名对应的IP地址为止。当客户端发送域名解析请求时,本地DNS服务器会按照域名的层次结构逐级查询,直到找到目标域名的IP地址或者查询失败为止。

域名的划分是逻辑上的划分而不是物理上的划分,同一个网络下的主机可能是属于不同的域名。

2.5.4 DNS 的名字空间

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
💡 DNS的命名空间(Namespace)是指 所有可能的域名构成的集合,它描述了整个DNS系统中所有可用的域名。DNS的命名空间是一个层次结构,类似于文件系统中的目录结构,其中每个域名都位于特定的层次,并且可以有任意数量的子域名。

👉 每个域去管理其下面的子域,创建一个新的子域需要向其所属域去申请

👉 域名服务器的解析:分布式的域名服务器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 在DNS(Domain Name System)中,Zone(区域)是指一组共享相同的域名空间的DNS记录集合
  • 每个区域都对应着一个域名,该域名及其子域名的解析信息都由该区域内的DNS服务器负责管理和存储。区域的概念使得管理员可以将特定的域名空间分配给不同的DNS服务器进行管理,从而实现域名解析服务的分布式和灵活配置。

👉 对于域名服务器的理解

  • 首先要清楚,不是每个域名去对应一个域名服务器,而是一个 zone 去对应一个域名服务器。

  • 域名服务器的缓存中存储着它的 zone 内的所有信息,当通过域名服务器去解析域名的时候如果缓存中没有找到对应关系会去数据库中查询,然后查询的结果加入 TTL 构成一个新的对象存储在 缓存 中。

  • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    robot 虽然在 yale 下面,但其并不是在同一个 zone,这也就说明

    当一个域名在另一个域名之下时,它们可能属于不同的 zone。

    • 例如,域名 “example.com” 和 “sub.example.com” 可能由不同的域名服务器管理和提供。如果 “example.com” 和 “sub.example.com” 分别由两个不同的域名服务器管理,那么它们就属于不同的zone。

👉 一个域名服务器之下维护着的信息由以下部分构成

  1. 域名(Domain Name): 表示资源记录所属的域名,可以是相对域名(相对于当前域名)或绝对域名(完整的域名)。
  2. TTL(Time to Live): 表示资源记录的生存时间,即该记录在DNS缓存中的存活时间。TTL字段是一个32位的整数,以秒为单位,用于控制DNS缓存中的记录失效时间。
  3. 类别(Class): 表示资源记录的类别,通常为IN(Internet)表示因特网资源记录。
  4. 类型(Type): 表示资源记录的类型,包括主机地址记录(A记录)、别名记录(CNAME记录)、邮件交换记录(MX记录)、文本记录(TXT记录)等。

💡 其中比较重要的字段是 Type,它的值表示当前对象存储的值的类型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


  • 比较难理解的是 NS 类型,还是这个例子,cs 在 yale 的子域,但是它们又是不同的 zone,也就对应着不同的域名服务器,这就需要知道它的域名和它的服务器的域名
  • 其次是别名,别名主要是做一个重定向的作用允许将一个域名映射到另一个域名,从而提供了灵活性和可扩展性。
    • 以下是需要使用别名的一些常见情况:
      • 简化管理和维护: 别名可以使系统管理员更轻松地管理和维护域名系统。当一个主机或服务的IP地址发生变化时,管理员只需更新相应的别名记录,而不需要修改所有引用该主机或服务的地方。
      • 负载均衡和容错: 别名可以用于实现负载均衡和容错策略。通过将多个主机或服务映射到同一个别名下,系统可以根据负载情况或故障情况自动地将请求分发到可用的主机或服务上。
      • 提供服务的透明性: 别名可以使服务的实际提供者对用户透明化。例如,一个网站可能使用不同的域名别名指向同一个服务器,这样用户可以通过多个不同的域名访问同一个网站,而不需要关心实际服务器的地址。
      • 简化重定向和转发: 别名可以用于简化重定向和转发的配置。通过将一个别名指向另一个别名或目标地址,可以实现更灵活和简洁的重定向和转发规则。
2.5.5 DNS 的工作过程

👉 发起查询: 客户端应用程序通过系统调用或DNS解析库向 本地DNS解析器 发送域名解析请求。如果本地DNS解析器已经缓存了该域名的解析结果,则直接返回缓存中的IP地址;否则,继续向下一步。

👉 本地DNS解析器查询: 如果本地DNS解析器不具有该域名的解析结果,它将向根域名服务器发送查询请求。根域名服务器负责管理顶级域名(TLD)的域名服务器的地址。

👉 根域名服务器响应: 根域名服务器收到查询请求后,会返回TLD域名服务器的地址给本地DNS解析器。

👉 TLD域名服务器查询: 本地DNS解析器接收到根域名服务器返回的TLD域名服务器的地址后,会向TLD域名服务器发送查询请求。TLD域名服务器负责管理顶级域名下的权威域名服务器的地址。

👉 权威域名服务器查询: 本地DNS解析器收到TLD域名服务器返回的权威域名服务器的地址后,会向权威域名服务器发送查询请求。权威域名服务器是负责管理特定域名的DNS记录的服务器。

👉 DNS记录查询: 权威域名服务器收到查询请求后,会检查自己的数据库,查找对应域名的DNS记录。如果找到了匹配的记录,则返回给本地DNS解析器;如果未找到匹配的记录,则返回“域名不存在”的错误。

👉 返回结果: 本地DNS解析器收到权威域名服务器返回的DNS记录后,会将解析结果缓存起来,并将解析结果返回给客户端应用程序。

👉 应用程序处理结果: 客户端应用程序收到DNS解析器返回的IP地址后,将使用该IP地址与目标服务器建立连接,从而完成域名解析过程。

💡 本地名字服务器(Local Name Server)

  • 本地名称服务器通常由 互联网服务提供商(ISP)网络管理员 在本地网络中设置。设置本地名称服务器可以提高域名解析的性能和效率,并且可以在本地缓存常用域名的解析结果,从而加速后续的域名解析过程。
  • 通常,ISP 会提供本地名字服务器的 IP 地址,或者可以选择使用公共DNS服务器,如Google DNS(8.8.8.8)或Cloudflare DNS(1.1.1.1)。
  • Windows 电脑输入 ipconfig /all 可以找到自己电脑的本地DNS服务器
    • 如果发现没有可能是计算机当前没有配置静态DNS服务器,而是使用了DHCP(动态主机配置协议)来获取IP配置,包括DNS服务器的IP地址。
2.5.6 DNS 协议报文

在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过 flags 实现识别查询报文的类型

通过 ID 来实现流水线查询,查询的报文与返回的结果报文的 ID 相同,可以一次查询多条

2.5.7 如何新增一个域名?
  1. 选择并注册域名: 选择一个适合您的网站或业务的域名,并注册该域名。可以使用各种域名注册服务提供商进行注册。
  2. 选择域名托管服务提供商: 一旦您注册了域名,您需要选择一个域名托管服务提供商,以便托管您的域名的DNS记录。域名托管服务提供商将帮助您管理域名的DNS配置。
  3. 设置DNS记录: 登录您选择的域名托管服务提供商的管理控制面板,并添加必要的DNS记录。这可能包括A记录(将域名映射到IP地址)、CNAME记录(为域名设置别名)、MX记录(指定邮件服务器)等。根据您的需求,您可能还需要添加其他类型的记录。
  4. 配置Web服务器: 如果您要在新域名上托管网站,您需要配置Web服务器以响应该域名的请求。您需要将网站文件上传到服务器,并确保Web服务器配置正确,以便它知道如何处理来自新域名的请求。
  5. 等待DNS传播: 一旦您添加了DNS记录并对域名进行了配置,您需要等待DNS传播完成。这可能需要几小时甚至一天时间,具体时间取决于DNS记录的TTL(生存时间)设置和因特网上DNS服务器之间的同步速度。
  6. 测试和验证: 等待DNS传播完成后,您可以测试新域名是否正常工作。在浏览器中输入新域名并访问,确保网站能够正确加载。
  7. 维护和更新: 一旦您的域名正常工作,您可能需要定期更新和维护您的DNS记录和网站内容,以确保它们始终保持最新状态并正常运行。

这篇关于中科大计网学习记录笔记(九):DNS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/701210

相关文章

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示