一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
往期文章
前言
上一篇文章中我们学习到了浏览器是如何解析网址并生成了 HTTP 消息。但是浏览器其实并不具备将消息发送到网络中的功能。因此这一功能需要委托操作系统来实现。操作系统通过 Socket 库来实现发送消息、接收数据的功能。
然而,委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是它的 IP 地址。
因此,今天我们主要学习的是如何通过网址中提供的域名来获取 IP 地址。
IP 地址的基本知识
我们先来学习一下 IP 地址相关知识。
数据传输过程概述
互联网和公司内部的局域网都是基于 TCP/IP 的思路来设计的,TCP/IP 可以理解为是 由一些小的子网,通过路由器连接起来组成一个大的网络。子网可以理解为用集线器连接起来的几台计算机,我们将它看作一个单位,称为子网,将子网通过路由器连接起来,就形成了一个网络。
在网络中,所有的设备都会被分配一个 IP 地址。通过 IP 地址我们可以判断出访问对象服务器的位置,从而将消息发送到服务器。
消息传送的过程简单描述如下:发送者发出的消息首先经过子网中的集线器,转发到距离发送者最近的路由器上。接下来,路由器会根据消息的目的地判断下一个路由器的位置,然后将消息发送到下一个路由器,即消息再次经过子网内的集线器被转发到下一个路由器。前面的过程不断重复,最终消息就被传送到了目的地。
IP 协议和 IP 地址
IP 协议是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则。任何厂家生产的计算机系统,只要遵守 IP 协议就可以与因特网互连互通。
IP 协议中还有一个非常重要的内容,那就是给因特网上的每台计算机和其它设备都规定了一个唯一的地址,叫做“IP 地址”。由于有这种唯一的地址,才保证了用户在连网的计算机上操作时,能够高效而且方便地从千千万万台计算机中选出自己所需的对象来。
IP 地址是一个 32 位的二进制数,通常被分割为 4 个“8 位二进制数”(也就是 4 个字节)。IP 地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d 都是 0~255 之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是 32 位二进制数(01100100.00000100.00000101.00000110)。
IP 地址类型
公有地址
公有地址(Public address)由 Inter NIC(Internet Network Infomation Center:因特网信息中心)负责。这些 IP 地址分配给注册并向 Inter NIC 提出申请的组织机构。通过它直接访问因特网。
私有地址
私有地址(Private address)属于非注册地址,专门为组织机构内部使用。
IP 地址编码方式
最初设计互联网时,为了便于寻址以及层次化构造网络,每个 IP 地址包括两个标识码(ID),即网络 ID 和 主机 ID。网络号用于识别主机所在的网络,主机号用于识别该网络中的主机 同一个物理网络上的所有主机都使用同一个网络 ID,网络上的一个主机(包括网络上工作站、服务器等)有一个主机 ID 与其对应。IP 地址根据网络 ID 的不同分为 A,B,C,D,E 五类。
A 类 IP 地址
一个 A
类 IP 地址由 1
字节的网络地址和 3
字节的主机地址 组成,其特点如下:
-
最高位:网络地址的最高位必须是
0
; -
地址范围:
1.0.0.1-126.255.255.254
; -
网络、主机个数:共
126(2^7-2)
个网络,每个网络可以容纳2^24-2
台主机; -
私有地址:
10.X.X.X
(私有地址就是在互联网上不适用,而被用在局域网中的地址); -
保留地址:
-
127.X.X.X
:供本地软件的环回测试使用; -
0.x.x.x
:网络地址全 0 表示本网络;
B 类 IP 地址
一个 B
类 IP 地址由 2
字节的网络地址和 2
字节的主机地址 组成,其特点如下:
-
最高位:网络地址的最高位必须是
10
; -
地址范围:
128.0.0.1—191.255.255.254
;实际规定 B 类地址不指派128.0.0.0
,191.255.255.255
为广播地址; -
网络、主机个数:共
16384(2^14)
个网络,65534(2^16-2)
个主机; -
私有地址:
172.16.0.0~172.31.255.255
为私有地址; -
保留地址:
169.254.X.X
是保留地址。如果你的 IP 地址是自动获取 IP 地址,而你在网络上又没有找到可用的 DHCP 服务器。就会得到其中一个 IP。
C 类 IP 地址
一个 C
类 IP 地址由 3
字节的网络地址和 1
字节的主机地址 组成,其特点如下:
-
最高位:网络地址的最高位必须是
110
; -
地址范围:
192.0.0.1-223.255.255.254
;同上无192.0.0.0
和223.255.255.255
; -
网络、主机个数:共有
2^22
个网络254(256-2)
个主机; -
私有地址:
192.168.X.X
是私有地址。
D 类 IP 地址
D 类 IP 地址在历史上被叫做多播地址(multcast address),即组播地址。在以太网中,多播地址命令了一组应该在这个网络中应用接收到一个分组的站点,其特点如下:
-
最高位:网络地址的最高位必须是
1110
; -
地址范围:
224.0.0.0-239.255.255.255
;
特殊的网址
-
每一个字节都为 0 的地址(
0.0.0.0
)对应于当前主机; -
IP 地址中每一个字节都为 1 的 IP 地址(
255.255.255.255
)是当前子网的广播地址; -
IP 地址中凡是以
11110
开头的 E 类 IP 地址都保留用于将来和试验时候用; -
IP地址中不能以十进制
127
作为开头,该类地址中数字127.0.0.1
到127.255.255.255
用于回路测试,如127.0.0.1
可以代表本机 IP 地址,用http://127.0.0.1
就可以测试本机中配置的 Web 服务器; -
网络 ID 的第一个 6 位组也不能全置为
0
,全0
表示本地网络。
子网掩码
子网掩码是一串与 IP 地址长度相同的 32 比特数字,其左边一半都是 1,右边一半都是 0。其中,子网掩码为 1 的部分表示网络号,子网掩码为 0 的部分表示主机号。
子网掩码表示网络号与主机号之间的边界。IP 地址通过与子网掩码做 &
的方式,可以判断这个 IP 地址是否属于这个子网。
引入子网掩码,从逻辑上把一个大网络划分成一些小网络。
域名和 IP 地址并用的理由
接着我们再来看一下域名和 IP 地址并用的理由。
实际上,如果用 IP 地址来代替服务器名称也是能够正常工作的。然而,就像你很难记住电话号码一样,要记住一串由数字组成的 IP 地址也非常困难。因此,相比 IP 地址来说,网址中还是使用服务器名称比较好。
使用 IP 地址只需要处理 4 字节的数字,而域名则需要处理几十个到 255 个字节的字符,这增加了路由器的负担,传送数据也会花费更多的时间。
域名并不仅是长,而且其长度是不固定的。处理长度不固定的数据比处理长度固定的数据更复杂,这也是造成效率低下的重要原因之一。
于是,现在我们使用的方案是让人来使用名称,让路由器来使用 IP 地址。为了填补两者之间的障碍,需要有一个机制能够通过名称来查询 IP 地址,或者通过 IP 地址来查询名称,这样就能够在人和机器双方都不做出牺牲的前提下完美地解决问题。这个机制就是 DNS。
通过解析器向 DNS 服务器发出查询
那么我们如何通过域名查询到对应的 IP 地址的?其实很简单,只需要询问最近的 DNS 服务器,xxx 网址的 IP 地址是什么就可以了。
那么浏览器是如何向 DNS 服务器发出查询的呢?其实是依赖我们计算机上的 DNS 客户端。
对于 DNS 服务器,我们的计算机上会有相应的 DNS 客户端,而相当于 DNS 客户端的部分称为 DNS 解析器,或者简称解析器。通过 DNS 查询 IP 地址的操作称为域名解析,一次负责执行解析这一操作就叫做解析器了。解析器实际上是一段程序,它包含在操作系统的 Socket 库中。而库呢则是一堆通用组件的集合,其他的应用程序都需要使用其中的组件,这里不详细介绍。
顺带一提,向 DNS 服务器发送消息时,我们当然也需要知道 DNS 服务器的 IP 地址。只不过这个 IP 地址是作为 TCP/IP 的一个设置项目事先设置好的,不需要再去查询了。
Mac 系统 DNS 配置位置如下:
总结
在这篇文章中,我们主要学习的是如何通过网址中提供的域名来获取 IP 地址。浏览器通过计算机内置的 DNS 解析器向 DNS 服务器查询,获取到域名对应的 IP 地址。DNS 服务器的 IP 地址也被设置在计算机中。
需要通过域名获取 IP 地址的原因是:但是浏览器其实并不具备将消息发送到网络中的功能。因此这一功能需要委托操作系统来实现。操作系统通过 Socket 库来实现发送消息、接收数据的功能。然而,委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是它的 IP 地址。因此我们需要获取到 IP 地址。
希望这篇文章对大家有所帮助!
参考文档
-
《网络是怎样连接的》—— 户根勤