工作每天都在用的 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 地址告诉本机

图片

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

图片

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

肺癌文献阅读2

第四篇 Neoadjuvant therapy in non-small cell lung cancer IF:6.2 中科院分区:2区 医学WOS 分区:Q1 之前有了解到新辅助治疗与辅助治疗都是在术前为增加疗效而进行的,这篇文章讲到I-III期的NSCLC更倾向于切除,这个时间点可分为早期与晚期。这个III期应…

Qt获取字符串大小

可以用成员函数size、length和count来获取字节数组的大小。除了名字不同,这3个函数是等同的,函数的原型声明如下: int size(); int length(); int count(); 这3个函数返回字节数组中的字节数。Size()函数的用法如下: QByteAr…

代码随想录day2:数组part02(有序数组的平方 ,长度最小的子数组 ,螺旋矩阵II,数组章节总结)

数组part02 一、有序数组的平方 法一&#xff1a;暴力&#xff0c;先把每个元素平方再排序&#xff0c;时间复杂度O(n nlogn) class Solution { public:vector<int> sortedSquares(vector<int>& nums) {for(int i0;i<nums.size();i) nums[i]*nums[i];so…

Domino自带应用免费开源,免费共享

大家好&#xff0c;才是真的好。 作为一个强大的、综合性的、高安全的企业级应用平台&#xff0c;Domino同时也拥有业界首屈一指的应用程序开发能力。不过&#xff0c;让Domino有强大竞争力的&#xff0c;也应该包含它自带的数十个开箱即用的Notes应用程序。 我在前面很多篇幅…

JavaScript-BOM-笔记

1.页面加载 一般情况:先写标签,再写js 页面加载:可以实现先写js代码 再写标签 window.onload = function(){ js代码 } 只能写一次,如果多次以最后一次为准 window.addEventListener(load,function(){ 代码 }) 使用多次 window.onload = function () { console.log(doc…

c++的this指针

this指针是c类中的概念&#xff0c;this英文翻译是这&#xff0c;这个&#xff0c;其实在类中就是这个意思。 this指针的使用 this指针主要用于类中的非静态成员方法&#xff0c;在这些方法中&#xff0c;this指针就指向当前调用此方法的这个对象。 1. this的使用场景一: 当…

2024年人工智能有哪些证书可以报考呢?

由国家工信部权威认证的人工智能证书是跨入人工智能行业的敲门砖&#xff0c;随着人工智能技术的发展越来越成熟&#xff0c;相关的从业人员也会剧增&#xff0c;证书的考取难度也会变高。如果已经从事或者准备从事人工智能行业的人员&#xff0c;对于考证宜早不宜迟&#xff0…

数据库软件详解一

MySQL 的安装 MySQL 的安装可去参考下这篇文章&#xff0c;比较详细&#xff0c;在此就不多啰嗦了&#xff01; MySQL 的卸载 如果你并不是第一次安装 MySQL &#xff0c;或者安装 MySQL 不对&#xff0c;需要将 MySQL 卸载干净才能将下一个版本的 MySQL 安装成功 卸载步骤 …

Javaweb之SpringBootWeb案例开发规范的详细解析

1.2 开发规范 了解完需求也完成了环境搭建了&#xff0c;我们下面开始学习开发的一些规范。 开发规范我们主要从以下几方面介绍&#xff1a; 1、开发规范-REST 我们的案例是基于当前最为主流的前后端分离模式进行开发。 在前后端分离的开发模式中&#xff0c;前后端开发人员…

uniapp 设置底部导航栏

uniapp 设置原生 tabBar 底部导航栏。 设置底部导航栏 一、创建页面&#xff0c;一定要在 pages.json 文件中注册。 二、在 pages.json 文件中&#xff0c;设置 tabBar 配置项。 pages.json 页面 {"pages": [...],"globalStyle": {...},"uniIdRout…

Flex布局--常用好用

1.什么是Flex布局&#xff1f; flex 是 flexible Box 的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性&#xff0c;任何一个容器都可以 指定为 flex 布局。 当我们为父盒子设为 flex 布局以后&#xff0c;子元素的 float、clear 和 ve…

地推拉新任务管理助手程序开发

拉新地推任务管理分销助手程序开发&#xff0c;旨在为企业提供一套专业、高效的管理工具&#xff0c;以优化地推任务分配、提高销售业绩。 以下是该程序的核心功能说明&#xff1a; 任务管理模块&#xff1a;允许管理员创建、分配和管理地推任务。管理员能够精确地指派任务给…

java返回文件时为图片或pdf等设置在线预览或下载

设置Content-Disposition响应头类型 "inline"查看预览 &#xff1b; "attachment"下载&#xff1b; inline&#xff1a;表示回复中的消息体会以页面的一部分或者整个页面的形式展示 attchment&#xff1a;以附件形式被下载到本地&#xff1b;/*** 文件或图…

[Android自定义View]实现一个环形进度条控件

[Android View]实现一个环形进度条 导言 之前的文章里我们已经介绍了自定义View相关的知识了&#xff0c;本篇文章我们就来实战一下&#xff0c;从零到一&#xff0c;实现一个环形进度条的控件。 具体实现 大体框架 我们说过&#xff0c;如果要实现一个自定义控件的话一般有…

JavaScript系列——Promise

文章目录 概要Promise三种状态状态改变Promise链式调用Promise处理并发promise.all()promise.allSettled&#xff08;&#xff09;Promise.any()promise.race() 小结 概要 Promise中文翻译过来就是承诺、预示、有可能的意思。 在JavaScript里面&#xff0c;Promise 是一个对象…

是什么因素让 PLC 比单片机更可靠?单片机为何不能做到这些?

PLC&#xff08;可编程逻辑控制器&#xff09;和单片机&#xff08;微控制器&#xff09;在工业控制和自动化领域中都扮演着重要的角色&#xff0c;但它们在设计、性能和应用方面有显著的不同&#xff0c;这些差异导致PLC在某些方面比单片机更可靠&#xff1a; 环境适应性和耐用…

C语言课程设计之好友通讯录系统项目实现

好友通讯录系统项目实现 程序使用软件visual Studio 2022&#xff1b; 文章目录 好友通讯录系统项目实现题目描述分析与设计代码实现 题目描述 建立一个通讯录&#xff0c;可以对通讯录中的好友信息进行增加、删除、修改、查找以及对通讯录中的好友信息进行显示打印&#xff0…

软件测试|解析selenium.common.exceptions.ElementClickInterceptedException错误及解决方法

导言 在自动化测试中&#xff0c;Selenium是一个广泛使用的工具&#xff0c;用于模拟用户在网页上的操作。然而&#xff0c;有时候在执行点击操作时&#xff0c;可能会遇到ElementClickInterceptedException异常&#xff0c;这可能是由于多种原因导致的。本文将深入探讨这个错…

【算法练习】leetcode算法题合集之数组和哈希表篇

重建数组&#xff08;高频&#xff09; LeetCode283.移动零 LeetCode283.移动零 双指针&#xff0c;记录已经处理好的序列的尾部 class Solution {public void moveZeroes(int[] nums) {int k 0;for (int i 0; i < nums.length; i) {if (nums[i] ! 0) {swap(nums, i, k)…

JavaScript 异步编程解决方案-上篇

1、JavaScript 异步编程 1、传统的方案 :JavaScript 中的异步操作函数往往通过回调函数来实现异步任务的结果处理 场景:fs 文件操作 数据库操作 AJAX 定时器 eg: 1、setTimeout 函数 //异步回掉,通过函数回调解决function printInfo() {document.getElementsByTagName(d…