前言:
学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第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 如何新增一个域名?
DNS(Domain Name System,域名系统)是互联网中用于将域名解析为与之对应的 IP 地址的分布式数据库系统。它实现了域名到 IP 地址的映射,为用户提供了便于记忆的域名访问方式,而不必记住复杂的 IP 地址。
IP 地址标识主机和路由器,但是 IP 地址的问题是 不好记忆,不便于人类的使用
问题 1:如何使用唯一的字符串去标示一个 IP 地址?
问题 2:如何完成名字到 IP 地址的转换?
问题 3:如何维护这些对应关系?增加或者删除域名的业务
DSN 的实现思路:
IP
地址的转换UDP
之上端口为 53
的应用服务(无连接的)Internet
功能,但以应用层的协议去实现DNS 的主要功能
这里来提一下负载均衡,首先要知道,一个分布式的应用会有多个服务器
- 也就对应着多个地址,而一个域名是可以绑定多个 IP 地址的
- 当客户端向DNS服务器发起域名解析请求时,DNS服务器会返回多个IP地址中的一个给客户端,客户端随机选择一个IP地址进行连接。
域名是用于在互联网上唯一标识主机或域的名称,它具有 层次结构,由多个部分组成,各部分之间用点号(.)分隔。
在DNS的域名解析过程中,域名被划分为多个层次,从右向左依次为:
顶级域名有上百个,这里举例一些常用的
每一级的域名会对应着一个或者多个域名服务器的地址,而顶级域名也对应着一个DNS根名字服务器
域名的划分是逻辑上的划分而不是物理上的划分,同一个网络下的主机可能是属于不同的域名。
DNS的命名空间(Namespace)是指 所有可能的域名构成的集合,它描述了整个DNS系统中所有可用的域名。DNS的命名空间是一个层次结构,类似于文件系统中的目录结构,其中每个域名都位于特定的层次,并且可以有任意数量的子域名。
每个域去管理其下面的子域,创建一个新的子域需要向其所属域去申请
域名服务器的解析:分布式的域名服务器
对于域名服务器的理解
首先要清楚,不是每个域名去对应一个域名服务器,而是一个 zone 去对应一个域名服务器。
域名服务器的缓存中存储着它的 zone 内的所有信息,当通过域名服务器去解析域名的时候如果缓存中没有找到对应关系会去数据库中查询,然后查询的结果加入 TTL 构成一个新的对象存储在 缓存 中。
robot
虽然在 yale
下面,但其并不是在同一个 zone,这也就说明
当一个域名在另一个域名之下时,它们可能属于不同的 zone。
一个域名服务器之下维护着的信息由以下部分构成
其中比较重要的字段是 Type,它的值表示当前对象存储的值的类型
比较难理解的是 NS 类型,还是这个例子,cs 在 yale 的子域,但是它们又是不同的 zone,也就对应着不同的域名服务器,这就需要知道它的域名和它的服务器的域名- 其次是别名,别名主要是做一个重定向的作用允许将一个域名映射到另一个域名,从而提供了灵活性和可扩展性。
- 以下是需要使用别名的一些常见情况:
- 简化管理和维护: 别名可以使系统管理员更轻松地管理和维护域名系统。当一个主机或服务的IP地址发生变化时,管理员只需更新相应的别名记录,而不需要修改所有引用该主机或服务的地方。
- 负载均衡和容错: 别名可以用于实现负载均衡和容错策略。通过将多个主机或服务映射到同一个别名下,系统可以根据负载情况或故障情况自动地将请求分发到可用的主机或服务上。
- 提供服务的透明性: 别名可以使服务的实际提供者对用户透明化。例如,一个网站可能使用不同的域名别名指向同一个服务器,这样用户可以通过多个不同的域名访问同一个网站,而不需要关心实际服务器的地址。
- 简化重定向和转发: 别名可以用于简化重定向和转发的配置。通过将一个别名指向另一个别名或目标地址,可以实现更灵活和简洁的重定向和转发规则。
发起查询: 客户端应用程序通过系统调用或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地址。
通过 flags 实现识别查询报文的类型
通过 ID 来实现流水线查询,查询的报文与返回的结果报文的 ID 相同,可以一次查询多条