【网络面试(2)】DNS原理-域名和IP地址的查询转换

 从上一篇博客我们得知浏览器是如何生成了HTTP消息了,但是浏览器作为应用程序,是不具备向网络中发送请求的能力,而是需要委托给操作系统的内核协议栈来发送请求。在委托协议栈之前,浏览器还要做的一件事情就是将域名转换为IP地址。
 在了解这个过程之前,我们先来学习一下IP地址相关概念。

1. IP地址

 IP(Internet Protocol)网际互联协议,是TCP/IP协议中的核心部分。通常我们接触比较多的是IP地址,像 192.168.0.1 这种4组数字和3个点分隔符组成的,每组数字的取值范围是0~255,换算成2进制最大表示到28,也就是8个bit,1个字节的长度,所以1个IP地址的长度占用了4个字节。

 IP地址的作用可以帮助我们在互联网中定位到某台主机。通常我们访问的网站域名都是很多字符组成,一般占用几十到几百个字节,而1个IP地址只占用4个字节,如果通过域名去定位这台主机,要远大于使用IP地址定位的使用的网络传输成本。

 IP地址一般是由2部分组成,子网号+主机号,那子网和主机又分别代表了什么呢?下面这张图就展示了他们的关系,比如几台计算机通过集线器可以组成的一个小的内网,这个内网就是子网,而每一台计算机就是子网中的主机。子网与子网之间可以通过路由器连接起来,实现访问。

在这里插入图片描述

1.1 掩码

 既然IP地址是由子网号和主机号组成,那他们是通过什么规则组成的呢?这里就需要接触掩码地址。
 掩码地址和IP地址长的是一样的,都是占用4个字节的一组.号分隔的数字。掩码的表示有很多种形式,如下两种:

在这里插入图片描述
 掩码理解起来其实比较简单,掩码掩码,遮掩起来的就是子网号,剩下的就是主机号,原理上如下,首先将IP地址和掩码地址转换为2进制表示,然后做拆分转换,如下:

在这里插入图片描述
 这样我们就可以拿到子网号和主机号了,路由器可以根据子网号定位到子网,集线器可以定位到具体的主机。
 还有一种简单的方式表示掩码,就是上面的(c)表示法,24其实就是二进制表示方法中,从左往右24个数字1。

2. 查询IP地址

 接下来,浏览器需要根据域名查询IP地址,这一步要借助DNS服务器,同理浏览器无法直接向DNS服务器发起请求,而是要调用操作系统Socket库中的DNS解析器程序gethostbyname()来完成。

 DNS解析器,其实就是DNS客户端,是一段实现在Socket库中的程序代码,他的作用就是接收各种域名转换IP地址的请求,将域名发送给DNS服务器,DNS服务器接收请求解析后,将IP地址返回给DNS解析器,解析器再将IP地址存放到浏览器指定的内存地址处。当然,DNS解析器也是不具备直接向网络发送请求的,同理要借助操作系统的内核协议栈来实现。接下来,浏览器就会从内存中取出IP地址,和生成的HTTP消息,交给操作系统来执行发送网络请求。

在这里插入图片描述
 通常,DNS服务器的地址是作为TCP/IP设置的一个配置项提前设置好的,DNS地址有很多,比如有阿里的223.5.5.5,谷歌的8.8.8.8等等。

在这里插入图片描述

3. DNS服务器的工作原理

 DNS服务器的主要工作就是将客户端发来的域名转换为IP地址,在DNS服务器中保存着域名与IP地址的映射表,这张表中除了保存域名IP地址,还有Class(DNS设立之初考虑了除了互联网之外的网络,不过目前只有互联网IN这一种类型)和记录类型(A就是Adress,表示IP地址,MX表示邮件服务器)。

在这里插入图片描述
 客户端的入参中,会包含域名、Class类型、记录类型等参数,以此来确定最终的IP地址。
 在全世界有很多的WEB服务器,如果只有一台DNS服务器来记录相关的域名和IP地址是不现实的,所以这么多的映射记录肯定是分散保存在不同的WEB服务器上的。下面我们就来看下,如何根据域名找到最终的IP地址。

3.1 DNS服务器缓存

 查找的第一步,根据我们配置的DNS地址找到对应的DNS服务器,这台DNS服务器上会缓存之前查找过的域名,当然是有过期时间的。如果有此域名,会直接返回客户端,同时也会告诉客户端这个IP地址来自缓存还是保存此地址的DNS服务器。

3.2 DNS接力查找

 我们知道,域名通常是由很多层级来表示的,比如www.lab.glasscom.com这个域名就包含了4层域名,1个是.放在最后,一般隐藏不写表示根域,com表示顶级域名,而glasscom表示一级域名,lab表示二级域名,www就代表了web服务器。一般来说,每层的域名会分布在不同的DNS服务器上,当然也不是那么绝对,但是上一层级的域名会记录下一层级域名的IP地址,然后所有的域名服务器都会记录根域服务器的IP地址。以上面这个域名为例:

  • 根域名: 全世界的根域IP地址有13个,这样就有对应的13组服务器,大部分在美国,据说中国以前有一台,后来因为国内互联网开放程度过低,动不动就封这个网站,那个网站,被撤掉了。回到上面例子,根域服务器会记录 com这个域名的服务器IP地址。
  • 顶级域名: 上面例子中的com是当前互联网中应用最广的域名,这个域名对应的DNS服务器中会记录下一级glasscom的域名服务器地址。
  • 一级域名: 上面例子中的glasscom是一级域名,这个对应的服务器中会记录lab的DNS服务器IP地址。
  • 二级域名: 这是最下一层的域名了,这个DNS服务器中就会记录lab.glasscom.com这个域名与IP的映射记录。

 因为所有的域名服务器中都会记录根域服务器的IP地址,所以不管我们电脑上配置的哪个DNS服务器,在DNS缓存无法命中的情况下,会直接将请求发给根域服务器,根域服务器将顶级域com的IP地址返回到我们配置的DNS服务器,它再去寻找com的DNS服务器,同理会返回glasscom域名DNS服务器的地址,依次直到最下层的lab.glasscom.com域名DNS服务器,这台DNS服务就会把www.lab.glasscom.com对应的IP地址返回给客户端,完成对此IP地址的请求。

在这里插入图片描述
 经常上面的这些步骤查找,浏览器就可以得到我们输入的URL中域名对应的IP地址,下一步就可以将网络请求委托给操作系统了。

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

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

相关文章

gn入门(Chromium)

Chromium是用gn和ninja进行编译的,即gn把.gn文件转换成.ninja文件,然后ninja根据.ninja文件将源码生成目标程序。gn和ninja的关系就与cmake和make的关系差不多。 代码下载:https://download.csdn.net/download/arv002/88668243 1. 环境配置 在我们自己的项目中,也可以使用…

java进阶(三)

IO与网络编程 3 输入输出流IO3.1 基础定义3.2 IO框架3.3 读取字节输入流-InputStream3.3.1 InputStream.read3.3.2 FileInputStream类说明 3.4读取字符输入流Reader3.4.1 Reader.read3.4.2 FileReader类说明 3.5 字节输出流OutputStream3.5.1 OutputStream.write3.5.2 FileOutp…

NumPy 中级教程——通用函数(ufuncs)

Python NumPy 中级教程:通用函数(ufuncs) NumPy 中的通用函数(ufuncs)是一种能够对数组进行元素级操作的函数,支持数组的快速、逐元素的操作,是进行数据处理的关键工具之一。在本篇博客中&…

nodejs微信小程序+python+PHP特困救助供养信息管理系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

分库分表之Mycat应用学习四

4 分片策略详解 分片的目标是将大量数据和访问请求均匀分布在多个节点上,通过这种方式提升数 据服务的存储和负载能力。 4.1 Mycat 分片策略详解 总体上分为连续分片和离散分片,还有一种是连续分片和离散分片的结合,例如先 范围后取模。 …

基于AT89C51单片机可做实物的温度烟雾火灾报警设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/88658141?spm1001.2014.3001.5503 C 源码仿真图毕业设计实物制作步骤02 摘要 随着现代家庭用火、用电量的增加,家庭火灾发生的频率越来越高。火灾报警…

快排例题——第k个数

做道简单一点的题巩固一下 基本思路 与上一个整体相似,通过快速排序将长度为n的整数数列变为从小到大的有序数组,在拿出其中第k个数。 题目描述 给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大…

浅学lombok

Lombok(Project Lombok)是一个用于 Java 编程语言的开源库,旨在减少 Java 代码中的冗余和样板代码,提高开发人员的生产力。它通过使用注解来自动生成 Java 类的常见方法和代码,从而使开发人员能够编写更简洁、更具可读…

ColibriSM v1.4.2 已注册– 仿脸书类社交网络PHP源码

ColibriSM:当代社交网络平台的崛起 一、开篇与概述 在信息时代的浪潮中,社交媒体成为了人们日常生活中不可或缺的一部分。ColibriSM,作为一个仿照脸书(Facebook)、推特(Twitter)和照片墙&#…

C++的一些知识

一. 语法 move怎么用 https://blog.csdn.net/zhangmiaoping23/article/details/126051520 这个文章讲的很好,其中有一些疑惑的点 (1) 左值引用不能接右值 class T1{int a; }; int main(){T1 t1 T1();T1 && t1_temp T1(); //T1()是一个临时对象&#xf…

WPF 新手指引弹窗

新手指引弹窗介绍 我们在第一次使用某个软件时,通常会有一个“新手指引”教学引导。WPF实现“新手指引”非常方便,且非常有趣。接下来我们就开始制作一个简单的”新手指引”(代码简单易懂,便于移植),引用到我们的项目中又可添加一…

Windows电脑引导损坏?按照这个教程能修复

前言 Windows系统的引导一般情况下是不会坏的,小伙伴们可以不用担心。发布这个帖子是因为要给接下来的文章做点铺垫。 关注小白很久的小伙伴应该都知道,小白的文章都讲得比较细。而且文章与文章之间的关联度其实还是蛮高的。在文章中,你会遇…

Go语言程序设计-第6章--方法

Go语言程序设计-第6章–方法 对象就是简单的一个值或者变量,并且拥有其方法,而方法是某种特定类型的函数。 6.1 方法的声明 方法的声明和普通函数的声明类似,只是在函数名字前面多了一个参数。这个参数把这个方法绑定到这个参数对应的类型…

【影像组学入门百问】#58---#62

#58-使用PyRadiomics能提取出多少影像组学特征? 当前支持以下特征类别: 第一阶段统计量 基于形状的(3D) 基于形状的(2D) 灰度共生矩阵(GLCM) 灰度共生长度矩阵(GLRLM&a…

springboot接口文档

Swagger 在Spring Boot中生成和维护接口文档的一个常用方法是使用Swagger。Swagger是一个开源软件框架,它帮助开发者设计、构建、记录和使用RESTful Web服务。下面是在Spring Boot项目中使用Swagger来创建接口文档的详细步骤:1. 添加Swagger依赖 在你的Spring Boot项目的pom…

Go语言中的包管理工具之Go Path的使用

GoLang 中常用的包管理的方式 1 )概述 常用的有三种 Go PathGo VendorGo Modules 2 )发展历程 早期go的包管理存在很大缺陷,甚至可以说没有官方统一的包管理工具 一方面官方在努力发布一些实验性的包管理工具。同时也出现了很多社区开发…

使用uni-app editor富文本组件设置富文本内容及解决@Ready先于onload执行,无法获取后端接口数据的问题

开始使用富文本组件editor时,不知如何调用相关API设置富文本内容和获取内容,本文将举例详解 目录 一.了解editor组件的常用属性及相关API 1.属性常用说明 2.富文本相关API说明 1)editorContext 2) editorContext.setContents…

JAVA进化史: JDK8特性及说明

JDK 8(Java Development Kit 8)是Java平台的一个重大版本,于2014年3月发布。该版本引入了许多令人期待的新特性,其中一些改变了Java语言的面貌,提供了更丰富、灵活和现代的编程体验。以下是JDK 8的一些主要特性&#x…

线性投影(linear projection)

1、线性投影介绍 线性投影在数学、统计学、机器学习以及经济学等多个领域都有重要作用,其基本思想是将一个高维空间中的向量或点映射到该空间的某个子空间中。以下是线性投影的一些关键作用 1.1 维度降低(Dimensionality Reduction)&#xf…

【Leetcode】第 378 场周赛

文章目录 100166. 检查按位或是否存在尾随零题目题意代码 100185. 找出出现至少三次的最长特殊子字符串 I题目思路代码 100184. 找出出现至少三次的最长特殊子字符串 II 100166. 检查按位或是否存在尾随零 题目 题意 这里题目要求的是或运算,所以原数组中只需要有…