认识Web浏览器(三)

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

解析器与DNS服务器的交互

IP地址介绍

  1. 为了将生成的消息发送到网络,需要委托操作系统来实现。而且前提是提供其通信对象的IP地址。
  2. 在了解了TCP/IP协议(由一些小的子网,通过路由器连接起来组成一个大的网络。这里的子网可以理解为用集线器连接起来的几台计算机 ,我们将它看作一个单位,称为子网。将子网通过路由器连接起来,就形成了一个网络)后,
  3. 在网络中的所有设备会被分配一个地址——相当于现实中某条路上的“×× 号 ×× 室”
  4. 其中“号”对应的号码是分配给整个子网的,而“室”对应的号码是分配给子网中的计算机的,这就是网络中的地址。
    “号”对应的号码称为网络号,“室”对应的号码称为主机号,这个地址的整体称为IP地址。

在TCP/IP中消息IP的发送:
发送者发出的消息首先经过子网中的集线器 (这里的数据以包的形式传递) ,转发到距离发 送者最近的路由器上(图 1.8 ①)。接下来,路由器会根据消息的目的地判断下一个路由器的位置,然后将 消息发送到下一个路由器,即消息再次经过子网内的集线器被转发到下一个路由器(图 1.8 ②)。前面的过 程不断重复,最终消息就被传送到了目的地。
在这里插入图片描述

  1. 实际IP地址的解释:

即一串32bit的数字,按照 8 比特(1字节)为一组分成4组,分别用十进制 表示然后再用圆点隔开。这就是我们平常经常见到的 IP地址格式,
在 IP 地址的规则中,网络号和主机号连起来总共是 32 比特,但这两部分的具体结构是不固定的。
在组建网络时,用户可以自行决定它们之间的分配关系在这里插入图片描述
,因此,我们还需要另外的附加 信息来表示 IP 地址的内部结构。
这里的附加信息就是“子网掩码“
它是一串与 IP 地址长度相同的32bit数字,其左边一半都是1,右边一半都是 0。其中,子网掩码为 1 的部分表示网络号,子网掩码为 0 的部分表示主机号。
将子网掩码按照和 IP 地址一样的方式以每 8 比特为单位用圆点分组后写在 IP 地址的右侧,这就 是图 1.9(b)的方法。
这种写法太长,我们也可以把 1 的部分的比特数用十进制表示并写在 IP 地址的右 侧,如图 1.9(c) 所示。这两种方式只是写法上的区别,含义是完全一样的。
注:主机号部分的比特全部为 0 或者全部为 1 时代表两种特殊的含义。主机号部分全部为 0 代表整个子网而不是子网中的某台设备(图 1.9(d))。此外,主机号部分全部为 1 代表向子网上所有设备发送包, 即广播(图 1.9(e))。

在这里插入图片描述
IP 地址的主机号
全 0:表示整个子网
全 1:表示向子网上所有设备发送包,即“广播”

域名和 IP 地址并用的理由

由上文,我们知道TCP/IP网络是通过IP地址来确定通信对象,
现在我们使用的方案是让人来使用名称,让路由器来使用 IP 地址。为了填补两者之间的障碍,需要 有一个机制能够通过名称来查询 IP 地址,或者通过 IP 地址来查询名称,这样就能够在人和机器双方都不做 出牺牲的前提下完美地解决问题。这个机制就是 DNS 。

Domain Name System,域名服务系统。将服务器名称和 IP 地址进行关联是 DNS 最常见的用法,但 DNS 的功能并不仅限于此,它还 可以将邮件地址和邮件服务器进行关联,以及为各种信息关联相应的名称。

Socket库提供查询IP地址的功能

Socket 库是用于调用网络功能的程序组件集合

查询 IP 地址的方法非常简单,只要询问最近的 DNS 服务器“www.lab.glasscom.com 的 IP 地址是什么”就可以 了,DNS 服务器会回答说“该服务器的 IP 地址为 xxx.xxx.xxx.xxx”。这一步非常简单,那么浏览器是如何向 DNS 服务器发出查询的呢?

因此介绍DNS
使用DBS时,就是向DNS服务器发送查询消息,接受服务器返回的响应消息,因此在我们计算机上一定有与之相应的DNS客户端,我们称为DNS解析器。——通过DNS查询IP地址称为域名解析。
解析器是一段程序,包含在操作系统的Socket库中。

库就是一堆通用程序组件的集合,其应用程序都需要使用其中的组件。
库的好处:
首先,使用现成的组件搭建应用程序可以节省编程工作量;其次,多个程序使用相 同的组件可以实现程序的标准化。除此之外还有很多其他的好处,因此使用库来进行软件开发的思路已经非常普及。
库的种类和数量也非常之多。
Socket 库也是一种库,其中包含的程序组件可以让其他的应用程序调用操作系统的网络功能,而解析器就是这个库中的其中一种程序组件。
Socket库中包含很多用于发送和接受数据的程序组件。

发出查询

通过解析器向DNS服务器发出查询。
至于解析器的用法——在Socket库中直接调用。

这里是引用

  1. 运行该程序,IP地址就写入了浏览器指定的内存地址中
  2. 浏览器向Web服务器发送消息(从该内存地址中取出IP地址,并将它与 HTTP 请求消息一起交给操作系统)

解析器

即调用解析器时,解析器内部的工作
图解:
在这里插入图片描述

  1. 程序的控制流程转移到解析器

一般来说,应用程序编写的操作内容是从上往下按顺序执行的,当到达需要调用解析器的部分时,对应的那 一行程序就会被执行,应用程序本身的工作就会暂停(图 1.12 ①)。然后,Socket 库中的解析器开始运行 (图 1.12 ②),完成应用程序委托的操作。像这样,由于调用了其他程序,原本运行的程序进入暂停状 态,而被调用的程序开始运行,这就是“控制流程转移”

  1. 解析器生成发生过DNS服务器的查询消息

与浏览器生成要发 送给 Web 服务器的 HTTP 请求消息的过程类似,
解析器会根据 DNS 的规格,生成一条表示“请告诉我www.lab.glasscom.com 的 IP 地址”的数据,
并将它发送给 DNS 服务器(图 1.12 ③)。
发送消息这个操作并不是由解析器自身来执行,而是要委托给操作系统内部的协议栈 (操作系统内部的网络控制软件,也叫“协议驱动”“TCP/IP 驱动”等。)来执行。
因为和浏览器一样,解析器本身也不具备使用网络收发数据的功能。
但两者在消息形式还是有所差别:
HTTP 消息是用文本编写的,但 DNS 消息是使用二进制数据编写的。

解析器调用协议栈后,控制流程会再次转移,协议栈会执行发送消息的操作,然后通过网卡将消息发送给 DNS 服务器(图 1.12 ④⑤)。

  1. DNS服务器收到后,按照查询内容进行查询。
posted @ 2022-06-21 14:35  Luciferpluto  阅读(1)  评论(0)    收藏  举报  来源