工作每天都在用的 DNS 协议,你真的了解么?

我们经常访问一些网址的时候,浏览器里输入类似于 www.baidu.com 这样的地址,那么在浏览器里输入这个地址---> 百度服务器给我们返回这个百度的页面,中间的过程是什么样的呢?
带着这个问题,我们一起来解析一下其中的过程。

1、域名和 IP 的关系

首先,类似于‘www.baidu.com’和‘www.sina.com.cn’这样的地址我们统一叫做域名。那么,使用域名访问后,这个请求直接就能到达对应的服务器么?

不是的!

在这个过程中是需要把这个域名转换为 IP 地址的,只有通过 IP 地址去寻找才可以找到这个服务器的位置,服务器才能收到请求。

为什么要在域名和 IP 之间进行这个转化操作呢?我们来回答两个问题:

  1. 那么我们为什么不直接用 IP 地址通信?

    因为 IP 地址对于用户来说不方便记忆,域名更加方便于用户记忆和使用,例如 www.baidu.com 这是百度的域名;www.sina.com.cn 就是新浪的域名,非常好理解和记忆;

  2. 那为什么不干脆直接用域名来找服务器?

这是因为域名的长度是不固定的,不便于计算机进行处理;而 IP 地址是固定长度的,如果是 IPv4 地址就是 32 位的,IPv6 的地址就是 128 位的,长度固定计算机更方便处理。

所以,总结一点就是 IP 地址是面向主机的,而域名则是面向用户的。所以我们需要将域名和 IP 地址进行相互转化。

2、域名转化为 IP 地址

hosts 文件

在最开始的时候,人们都用电脑的 hosts 文件进行域名和 IP 的转化。

在我们电脑 C:\Windows\System32\drivers\etc 路径下面有一个 host 文件,可以保存域名和 IP 的对应关系,如下图所示:

图片

图中框起来的这行,就是把 120.24.89.47 这个 IP 地址映射为 www.tricy1.com 这个域名。当配置完成之后,就算 www.tricy1.com 这个域名不是一个真实注册的域名,在本台电脑里依然可以访问 www.tricy1.com 这域名就可以访问到这个 IP 地址对应的网站(柠檬班的测试派论坛)。

最初,通过互联网信息中心来管理这个 hosts 文件,如果有一个新的计算机想接入网络,或者某个计算 IP 变更都需要到信息中心申请变更 hosts 文件。其他计算机也需要定期更新,才能上网。但是这样太麻烦了。为了更加简便的操作,就出现了 DNS 协议。

DNS 协议

DNS 协议,全称 Domain Name System,它是一个应用层协议,它建立在 UDP 或 TCP 协议之上,默认使用 53 号端口。

客户端默认通过 UDP 协议进行通讯,但是由于广域网中不适合传输过大的 UDP 数据包,因此规定当报文长度超过了 512 字节时,应转换为使用 TCP 协议进行数据传输。所以,DNS 协议是少有的既可以用 UDP 协议,又可以用 TCP 协议作为底层协议的应用层协议。

该协议的功能就是将人类可读的域名 (如,www.qq.com) 转换为机器可读的 IP 地址 (如,119.147.15.13)。

图片

域名的层级结构:

如上图可见的域名中间是用点分割开的。这个每个点隔开的代表什么呢?

我们就需要了解一下域名是分层结构,域名服务器也是对应的层级结构,分别为根域名,顶级域名系统,二级域名系统,三级域名系统等如下图所示:

图片

全球共有 13 台根服务器,这 13 台根域名服务器中文名字分别为“A”至“M”,其中 10 台设置在美国,另外三台分别设置在英国、瑞典、日本。1 个主根服务器放置在美国,其余 12 个均为辅根服务器。

比如www.baidu.com这个域名的层级结构就如下:

com: 顶级域名。表示这是一个企业域名。

baidu: 二级域名,指公司名。

www: 网络协议(World Wide Web)

域名一般不能超过 5 级,从左到右域的级别变高,高的级域包含低的级域。域名在整个 Internet 中是唯一的,当高级子域名相同时,低级子域名不允许重复。

有了域名结构,还需要有一个东西去解析域名,那就是域名服务器。

域名需要由遍及全世界的域名服务器去解析,域名服务器实际上就是装有域名系统的主机。

DNS 解析过程

图片

如上如所示,我们来解析一下 DNS 解析的过程:

用户希望通过客户端浏览器访问百度服务器-域名为 www.baidu.com:

  1. 用户在浏览器里输入 www.baidu.com 域名,默认优先查找浏览器缓存,看缓存中是否含有域名对应的 IP 地址

  2. 当浏览器中找不到时,会检测系统中的 Hosts 文件中是否有对应的 IP 地址

  3. 如果 hosts 里没有这个域名的映射,则查找本地 DNS 服务器;

  4. 若没有,通过 DNS 服务器就向根域名服务器中进行查找;根域名服务返回可供查询的顶级域名服务器 IP 地址;

  5. 顶级域名服务器返回 DNS 响应消息;

  6. 主机收到响应消息后,可以正常访问该服务器了;并将结果保存,以备下一次使用


而 DNS 协议的查询方法又分为以下两种:


递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以 DNS 客户机的身份向其它域名服务器查询,直到得到最终的 IP 地址告诉本机

图片

迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询。

图片

通俗地说,递归就是把一件事情交给别人,如果事情没有办完,哪怕已经办了很多,都不要把结果告诉我,我要的是你的最终结果,而不是中间结果;如果你没办完,请你找别人办完。

迭代则是我交给你一件事,你能办多少就告诉我你办了多少,然后剩下的事情就由我来办。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/311580.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java通过HttpClient方式实现https请求的工具类(绕过证书验证)

目录 一、引入依赖包二、HttpClient方式实现的https请求工具类三、测试类 一、引入依赖包 引入相关依赖包 <!--lombok用于简化实体类开发--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><option…

C++内存管理机制(侯捷)笔记2

C内存管理机制&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youtube: 侯捷-C内存管理机制 Github课程视频、PPT和源代码: https://github.com/ZachL1/Bilibili-plus 下面是第二讲allocator具体实…

React 18中新钩子 useDeferredValue 使用

React是一个流行的用于构建用户界面的JavaScript库,它不断发展以为开发人员提供优化性能的工具。 React 18中引入的此类工具之一是useDeferredValue钩子,它旨在通过优先渲染更新来提高应用程序的性能。 useDeferredValue钩子是什么? useDeferredValue钩子是React性能优化工…

【AI视野·今日Sound 声学论文速览 第四十四期】Tue, 9 Jan 2024

AI视野今日CS.Sound 声学论文速览 Tue, 9 Jan 2024 Totally 27 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers DJCM: A Deep Joint Cascade Model for Singing Voice Separation and Vocal Pitch Estimation Authors Haojie Wei, Xueke Cao, Wenbo Xu…

PCIe进阶之Gen3 Physical Layer Transmit Logic(二)

1 文章概述 本文是接着上面一篇文章《Gen3 Physical Layer Transmit Logic(一)》继续对Gen3 Physical Layer Transmit Logic做进一步的解析,具体包含Byte Striping和Scrambling以及Serializer。 1.1 Byte Striping Gen3 x1 Ordered Set Construction如下所示: Ordered …

Vue入门五(Vue-CLI项目搭建|vue项目目录介绍|vue项目开发规范|es6导入导出语法)

文章目录 一、Vue-CLI 项目搭建介绍node环境搭建1) 下载与安装2&#xff09;测试是否安装成功 安装vue-cli安装vue脚手架 创建Vue项目1&#xff09;使用命令创建项目2&#xff09;使用图形化界面创建项目 二、vue项目目录介绍1.命令行运行vue项目2.Pycharm中运行项目3.目录结构…

k8s的策略

集群调度&#xff1a; Scheduler的调度算法&#xff1a; 预算策略 过滤出合适的节点 优先策略 选择部署的节点 NodeName&#xff1a;硬策略&#xff0c;不走调度策略&#xff0c;node1 nodeSelector&#xff1a;根据节点的标签选择&#xff0c;会走一个调度算法 只要是…

激活/注册navicat15

一、获取软件 链接&#xff1a;https://pan.baidu.com/s/1F_tiLuLvVFMEz8pDfIvDjw?pwdjjfj 提取码&#xff1a;jjfj 二、安装 安装的过程我就不放了&#xff0c;重点如下 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01;…

【阅读笔记】Chain of LoRA

一、论文信息 1 论文标题 Chain of LoRA: Efficient Fine-tuning of Language Models via Residual Learning 2 发表刊物 arXiv2023 3 作者团队 Department of Computer Science, Princeton University School of Computer Science and Engineering, Nanyang Technologic…

Unity获取系统语言

大家好&#xff0c;我是阿赵。   在使用Unity引擎做多语言的游戏时&#xff0c;很有可能需要根据用户的手机或者电脑的当前语言来设置游戏的默认语言。   Unity的API里面默认就有可以获取系统语言的方法&#xff1a; Application.systemLanguageUnity的API例子&#xff1a…

leetcode动态规划(零钱兑换II、组合总和 Ⅳ)

518.零钱兑换II 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount 5, coins [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 55 5221 52111 511111 示例 2: 输入: amount 3, coi…

R730服务器做了raid的硬盘,插在R720上面可以用吗?

环境 戴尔R720 戴尔R730 问题描述 R730服务器做了raid的硬盘&#xff0c;插在R720上面可以用吗&#xff1f; 解决方案 1.直接在 R730服务器做了raid的硬盘&#xff0c;卸下来在插在r720上面使用 &#xff0c;读不到硬盘 2.前往R730服务器上面&#xff0c;去清除RAID配置的…

数字化转型之路为何道阻且长?

数字化转型是企业在数字化时代下的整体转型&#xff0c;是一个系统、长期、艰巨的过程。其本质不仅仅是技术的升级&#xff0c;更多的是涉及业务流程&#xff0c;用数据来重构和升级企业的商业模式和运营模式。但为什么很多企业的数字化转型难以成功呢&#xff1f; 战略缺位&am…

Spring配置类以及扫描过程源码解析

书接上文 文章目录 一、 拾遗1. 回顾2. 源码分析 二、 配置类扫描源码分析1. 源码分析2. BeanDefinition覆盖问题3. full配置类和lite配置类的区别 一、 拾遗 1. 回顾 前面我们分析了Spring框架器启动过程要做的事情&#xff0c;着重分析了ApplicationContext的refresh方法。…

只有金蝶用户,才懂金蝶BI方案的含金量

资深金蝶系统用户都看得明明白白&#xff0c;金蝶系统侧重于企业资源的计划和管理&#xff0c;而当前企业数字化运营决策不仅需要高效合理的流程管理&#xff0c;更需要一套完善的数据分析方案&#xff08;金蝶BI方案&#xff09;&#xff0c;无缝对接金蝶系统&#xff0c;智能…

【Kafka-3.x-教程】-【五】Kafka-监控-Eagle

【Kafka-3.x-教程】专栏&#xff1a; 【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门 【Kafka-3.x-教程】-【二】Kafka-生产者-Producer 【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft 【Kafka-3.x-教程】-【四】Kafka-消费者-Consumer 【Kafka-3.x-教程】-【五…

软件测试|Python如何将列表从大到小排序

简介 在编程中&#xff0c;对列表进行排序是一个常见的操作&#xff0c;有时候我们需要将列表按照从大到小的顺序进行排列。Python 提供了多种方法来实现这一目标。在本文中&#xff0c;我们将深入探讨几种将列表从大到小排序的方法&#xff0c;帮助您根据不同情况选择最合适的…

OpenHarmony—开发环境搭建

背景 因为没有实体的开发硬件&#xff0c;且不想破坏原有的Linux环境&#xff0c;所以这里基于 Docker QEMU 搭建开发环境 宿主机Linux系统命令行方式DockerQEMU 6.2 Docker环境准备 安装Docker 在Ubuntu中&#xff0c;可以使用下面的命令来安装Docker&#xff1a; sudo …

HarmonyOS自定义组件生命周期函数介绍

aboutToAppear 在创建自定义组件的新实例后&#xff0c;在执行其build()函数之前执行。允许在aboutToAppear函数中改变状态变量&#xff0c;更改将在后续执行build()函数中生效。 aboutToDisappear 在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变…

SpringBoot怎么写一个自定义的starter,Gradle依赖引入starter的Jar包

1.新建一个Spring的项目myasset-spring-boot-starter 项目结构如下: 注意:不需要Application启动类 和 application.yml/application.properties文件 2. resources下添加spring.factories文件 # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfigu…