从浏览器输入网址到显示网站页面之间到底发生了什么?系列(二)

本文详细介绍了DNS解析的工作原理,包括域名与IP地址的关系、DNS服务器的角色、域名层次结构、DNS解析的过程及缓存机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人博客网站文章地址:http://blog.mclink.xyz/index/article/index/id/27.html    

  在上一篇文章我们已经知道了浏览器是如何发送消息请求以及web服务器如何发送响应消息的,但是我们都知道域名总是千奇百怪的长短也不一,如果使用域名来进行标识,那么好处是域名是比较容易记住的,但是对服务器来说,过长的域名会使路由器和服务器的压力增大,所以我们引入ip地址的概念,在网络中,所有的设备都会被分配一个地址,这个地址类似于我们学校的宿舍分布,例如B11-111,我们可以简单来说,B11对应的可以当做一个子网,然后房间号111就是主机号,但是子网是什么呢?通俗点来说,如果学校当做一个局域网,那么某一栋楼就可以假设为这个局域网的一个分支,分布类似树形分布,我们也可以把子网当做使用集线器连接起来的几台计算机的单位,多个子网通过路由器进行连接,就可以形成一个小网络。因为在网络中我们是使用ip地址来进行寻址的,所以就一定要有可以将域名转换成ip地址的东西,它就是DNS服务器,这里我不会讲太多关于ip地址的东西,因为这不是本篇文章的重点,不过如果想搞明白网络,就必须了解ip地址,例如如何表示,超网的构造,子网的划分,ipv4和ipv6的区别以及表示,子网掩码的概念等等,我假设你已经知道了这些基础的东西或者你可以先了解这些东西再来看这篇文章,

 ipv4:

    下面我简单说下ipv4,顾名思义,它是ip的第四版本,实际上一般它是有4个字节组成的十进制地址,一个字节是八比特,所以一个ip地址有32比特,一个比特为一个二进制,0或者是1,每个字节由“.”来区分,例如IP地址:192.168.1.1 (10进制),如果写成二进制的形式的话就是:11000000.10101000.00000001.00000001(2进制),不过一般来说我们日常见的大都是10进制的表示形式,但是在进行相关的计算时,我们还是需要转化成2进制来计算,如果有一串ip地址,我们还需要子网掩码来进行网络号和主机号的划分,

域名和ip地址并用的一些理由:

  我们都知道,如果我们直接在地址栏使用ip地址进行访问也是可以生效的,但是哪个ip地址对应哪个网站我们可能记得住吗?一般来说使用域名的好处就是便于记住,我还是举例百度,ping百度首页得到的地址是:

 

百度的首页ip地址是:111.13.101.208  我觉得应该没什么会去记得这么一串数字,但是它的域名:https://www.baidu.com怕是大家都知道,所以这是域名的一大好处,便于记忆。                                                                                                                     但是我们前面也说了。域名的长度不一,一般都有几十个字节,最长有255字节,使用域名传输的话。增加了路由器的负担,传送数据也会花费更长的是按,但是IP地址(ipv4)却只有4个字节啊。虽然进行数据传输时当然是用IP地址啦,                      前面铺垫了那么多,该说说DNS解析的过程了,首先我们要知道电脑是如何向DNS服务器进行ip的查询的。

 socket库提供查询ip地址的功能:

  什么是socket库呢?socket库是咋加州大学伯克利分校开发的UNIX系操作系统BSD中开发的C语言库。互联网中所使用的大多数功能都是基于socket库来开发的,是用于调用网络功能的程序组件集合,也可以说,socket库是网络开发中的一种标准库。            在我们的计算机里,有着相应的DNS客户端来进行向服务器发送查询信息和接收响应消息,但是一般我们不叫它客户端,而是叫它为DNS解析器或者解析器,实际上它是一段程序,所以我们可以直接对其进行代码调用,例如:

 

   在这段程序运行完成后,服务器的ip地址就会被写入我们指定的内存地址中,接下来浏览器向web服务器发送消息时只要在这个指定的内存地址取出数据即可。那么调用解析器的中间过程又是如何的呢?                                                                         大致是这样的几个步骤:

(1)在web应用程序中调用gethostbyname()函数

  (2)进行控制流程转移,socket中向DNS服务器发送查询消息

(3)操作系统内部的协议栈发送UDP消息

(4)通过网卡进行数据的传输,让消息到达DNS服务器

(5)DNS把返回响应消息,通过网卡到达计算机

(6)操作系统内部的协议栈接收UDP消息

(7)在socket中接收DNS服务器返回的响应消息并返回该函数的结果

(8)web浏览器使用该查询结果

(协议栈:操作系统内部的网络控制软件,也叫“协议驱动”“TCP/IP驱动”等。)

上面已经说了解析器与DNS服务器之间的交互过程。接下来应该讲讲DSN服务器是怎么工作的了。

DNS服务器的基本工作

  我们知道,DNS服务器的基本工作就是接收来自客户端的查询消息,然后根据消息的内容返回响应。一般来说,来自于客户端的查询消息会包含三种信息:

①域名 

服务器,邮件服务器(邮件地址@后面的部分)的名称

②Class

在最早设计DNS方案时,DNS在互联网以外其他网络中的应用也被考虑到,而Class就是用来识别网络的信息。不过,如今的网络除了互联网就没有其他的网咯了,因此class的值永远都是代表互联网的IN.

③记录类型

 是表示域名对应何种类型的记录,主要是两种,A类型(IP地址),MX类型(邮件服务器)

DNS服务器上会事先保存好这些记录,例如:

记录表
      域名Class记录类型响应的数据
www.baidu.comINA192.168.1.1
glasscom.comINMX10 mail.glasscom.com
http://www.gzhu.edu.cn/INA202.192.18.247
..........

从记录表中我们可以看出,在响应的数据中,A记录类型的响应数据只有一条,也就是你查询域名的IP地址,而MX记录类型的响应数据却有两条,如上图中我们查询glasscom.com的时侯,它响应了10和mail.glasscom.com这两条数据,其实第一个数据是优先级来着,数值越小代表其优先度越高,那第二条数据为啥不是给我们一条IP地址呢?因为因为MX的查询第一步只会给你该邮件的服务器域名,然后你还需要再一步再查询这个服务器域名的ip地址

 虽然我是以表格的形式来进行展示的,但是实际上这些信息是保存在配置文件中的,表格中的一行数据被称为一条资源记录。

域名和DNS的层次结构 

     但是难道DNS服务器只有一台吗?全世界那么多条记录,很明显是不可能的,实际上世界上是有上万台的,不同的DNS服务器之间相互之间形成树状结构,在理解DNS的层次结构前,我们应该先搞懂域名的层次结构,再拿百度视频的域名来说明,该域名为www.v.baidu.com  分析这个域名,它有四部分组成,每个部分我们可以说是一个层级,也就是一个域。而且,越靠右的位置表示其层级越高,也就是说在这个域名中。com域的层级是最高的,然后baidu域是他的一个子分支,v域是baidu域的一个子分枝,依次类推,这种具有层级结构的域名会注册到DNS服务器中,每个域都是作为一个整体存放在DNS服务器中,但是一个DNS服务器中都有多个域,为了避免太复杂,我们先假设一台服务器只有一个域,这时候,DNS服务器也是可以由此类比出树形结构了,学过数据结构的同学应该很容易就能想象出来,但是根节点是谁呢?是最右边的域吗?com域吗?其实不然,com,jp这些域还有一个比他们等级更高的,我们称之为根域,根域是没有名字的,因此在写域名的时候一般被忽略,但是如果要是想明确表示根域也是可以的,就是在最右边加个“.”,不过一般我们都不写这个点,这样的分级管理,每个子分支IP地址都是需要注册到它上一级的DNS服务器中的,所以我们就可以通过上级DNS服务器查询出下级DNS服务器的ip地址,

客户端计算机如何一步步进行DNS解析

  那么说了那么多,我们的计算机是如何通过域名服务器来查到ip地址的呢?

  假设我们的计算机想查www.baidu.com的ip地址,那么它会这么做,首先每台DNS服务器都会有根域的信息,计算机首先会先找到最近的DNS服务器,一般是你电脑设置的那个,例如:

 

找到这个最近的DNS服务器后,它就会问它最大的老板,www.baidu.com的ip是多少啊,老板说不晓得但是它看了一下最后是com结尾,所以它就说你去问问我的com小弟吧,于是最近的DNS服务器又去问com老大,com老大也说不知道,但是它知道是他手下baidu.com域管的,它就说你去问我小弟baidu.com吧,依次类推,最后找到了www.baidu.com域,这个小弟终于知道了,于是计算机就再向这个小弟发送请求信息,最终得到www.baidu.com的ip地址,要知道的是,当最近的DNS服务器找到了www.baidu.com域后,会告诉计算机,然后由计算机直接去问他拿IP地址的,而不是通过最近的DNS服务器。没有缓存机制的并且假设一个DNS服务器只有一个域的步骤大致就是这样。

 缓存机制加快DNS服务器的响应

  如果每次都照着上面的步骤进行查询,是不是感觉很麻烦佷花时间呢?如果你去问一个人图书馆在哪里?你找到后,你以后每次去图书馆还会一直问人图书馆怎么走吗?缓存机制类似我们的记忆缓存,如果你已经之前已经查询过这个域名了,那么就可以把查到的ip进行储存,下一次如果用到这个域名就可以直接从缓存中得到ip地址,这样就可以加快网页打开的速率,而且如果查询的域名并不在缓存中,就可以进行正常的查询,然后再把结果写入缓存中,下次再访问时也可以加快。这时候你会问,难道电脑会把所有我们浏览过的域名的ip地址一值保存在缓存中吗?久而久之,这样不是很占硬盘的内存,实际上,缓存的数据也是有有效期的,类似于我们在浏览器中使用的cookie,如果时间超过了就会自动删除,而且在进行查询的时候,DNS也会告诉客户端这个响应的结果到底是从缓存中来的还是从负责管理该域名的DNS服务器中来的,这样就可以避免当原本的注册信息改变时,我们缓存的信息就有可能是不正确的问题了。

  DNS服务器解析ip地址的我就大致写到这了。下一篇是电信号传输TCP/IP数据。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MClink

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值