在之前的文章中,我们提到了物理层、数据链路层、网络层和传输层,它们都在背后执行着一些我们看不见的任务,或者说是我们很难直接接触到的东西。现在让我们来描述一下 OSI 模型中的最后一层,也就是「应用层」。
在应用层中涉及到了很多的协议,今天我们先介绍一个协议,它负责处理 Internet 计算机命名的问题。
理论上,所有的程序都可以通过计算机的 IP 地址来访问 web 页面、邮箱、多媒体等资源。但是,IP 地址很难记住,并且当一个网页移动到另一台机器上变更了 IP 地址后,还需要通知每个用户新的 IP 地址,这显然不太方便。
为了解决这个问题,引入了一个更易读的「名字」,使得名字和机器地址可以分开。这样,用户只需要记住一个名字,而不需要关心 IP 地址是什么。
然而,网络只能理解「数字形式」的地址,因此需要一种机制将名字转换成网络地址。
在早期,使用一个简单的文件叫做 hosts.txt 来实现这个映射,该文件列出了所有计算机的名字及其对应的 IP 地址,每天晚上,所有主机都会从一个维护此文件的站点获取该文件,并在本地进行更新。
对于几百台机器来说,这种方法还能正常工作,但当几百万台计算机连接到互联网时,就变得不可行了。
为了解决这些问题,1983 年人们发明了域名系统(DNS)这样的机制,它采用了分布式的、层次化的体系结构,可以更有效地将域名解析为对应的 IP 地址,从而实现了更快速、可靠的命名解析服务。
比如你想访问公司官网,公司官网部署在一台「128.61.24.11」的计算机上,但 IP 地址很难记忆,所以你可以直接输入「company.com」来访问公司主页。
当需要将一个名字映射成 IP 地址时,应用程序会调用「解析器」的库程序,并将名字作为参数传递给解析器。
解析器随后向本地的 DNS 服务器发送一个包含这个名字的请求,本地 DNS 服务器会查询这个名字,并将对应的 IP 地址返回给解析器。
针对互联网命名层次结构的分级管理,有一个专门的组织「ICANN」负责。ICANN 负责将互联网划分为超过 250 个一级域名,每个域名下包含许多主机。
获得一个二级域名相对容易得多。比如,如果你想为你的公司获取一个名为 company.com 的域名,只需前往相应的注册机构检查所需的名字是否可用。如果名字可用,你只需要向管理域名注册的机构支付一小笔年费,就可以注册获得该域名。在理论上,一台域名服务器可以容纳整个 DNS 数据库,并响应所有对该数据库的查询。然而,由于这样的服务器需要处理大量查询,一旦它停机,整个互联网就会瘫痪。查询一个名字并找出其对应地址的过程称为「域名解析」。当解析器需要查询一个域名时,它会将查询传递给一个本地域名服务器,如果所需域名恰好在该域名服务器的管辖范围内,该服务器就会返回权威的资源记录。如果本地域名服务器没有相关域的信息,它会启动一次远程查询,向更上层级的服务器查询。一旦本地域名服务器收到查询,它就代替该主机处理域名解析工作,直到它返回所需的答案,答案必须是完整的,不能返回部分答案,即使部分答案可能有所帮助,但不是查询应该得到的结果,这种机制被称为「递归查询」。为了与一个根服务器建立联系,每个域名服务器都必须获取一个或多个根域名服务器的信息。这些信息通常存储在系统的配置文件中,在 DNS 服务器启动时加载到 DNS 缓存中,这个配置文件非常简单,只列出了关于根服务器的 NS 记录和相应的 A 记录。每个根服务器实际上是一台计算机,由于整个 Internet 都依赖于根服务器,因此它们必须具有超强的处理能力。UDP 协议发送消息
域名系统采用 UDP 协议来发送 DNS 消息,这些消息的格式非常简单,只包含查询和响应。
域名服务器可以使用这些数据包来进行解析,如果在很短的时间内没有收到响应,DNS 客户端必须重复查询,如果重复一定次数后仍然失败,则尝试与另一台域名服务器进行通信。
这样的查询过程主要目的是为了应对服务器关闭以及查询丢失的情况。
DNS 是一个庞大而复杂的分布式系统,由数百万计的域名服务器组成,它们必须相互协作。
DNS 在人类可读的域名和机器 IP 地址之间起着关键的桥梁作用,为了提高性能和可靠性,DNS还利用了复制和缓存机制,系统的设计有效解决了互联网规模不断扩大所带来的命名管理问题。
内容优化:ChatGPT
图片来源:Pixabay
内容来源:《计算机网络》
原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34535.html