一、IP 地址的基本知识
生成 HTTP 消息之后,下一个步骤就是根据域名查询 IP 地址
互联网内部的局域网是基于 TCP/IP 的思路来设计的,TCP/IP 的结构就是由一些小的子网,通过路由器连接起来组成一个大的网络,这里的子网可以理解为用集线器连接起来的几台计算机
IP 地址是一串 32 bit 的数字,按照 8 bit 为一组分成 4 组,由网络号和主机号两部分组成。通过附加信息——子网掩码来区别网络号和主机号,1 的部分表示网络号,0 的部分表示主机号
(a) IP 地址主体的表示方法
10.11.12.13
(b) 采用与 IP 地址主体相同的格式表示子网掩码的方法
10.11.12.13/255.255.255.0
(IP地址主体)(子网掩码)
(c) 采用网络号比特数来表示子网掩码的方法
10.11.12.13/24
(IP地址主体)(子网掩码)
(d) 表示子网的地址
10.11.12.0/24
(主机号部分的 bit 全部为 0,这个地址表示的不是单独一台计算机,而是代表整个子网)
(e) 表示子网内广播的地址
10.11.12.255/24
(主机号部分的 bit 全部为 1,这个地址表示对整个子网进行广播)
IP 地址主机号:
- 全 0:表示整个子网
- 全 1:表示向子网上所有设备发送包,即“广播”
二、域名和 IP 地址并用的理由
TCP/IP 网络是通过 IP 地址来确定通信对象的,因此在委托操作系统发送消息时,必须先查询好对方的 IP 的地址
网址中直接写 IP 地址不好吗,为什么还要域名?
- 直接用 IP 地址是可以的,但是记住一串数字的 IP 地址和相对于记域名来讲更难记哪
为了好记,直接用名称来确定通信对象不好吗?
- 对于网络设备,使用 IP 地址只需要处理 4 字节的数字,相对地,处理字符串无疑增加了路由器负担
三、Socket 库提供查询 IP 地址的功能
查询 IP 地址的方法就是:
- 询问最近的 DNS 服务器“www.baidu.com”的 IP 地址是什么?
- DNS 服务器会回答说“该服务器的 IP 地址是 xxx.xxx.xxx.xxx”
对于 DNS 服务器,我们计算机上一定有相应的 DNS 客户端,而相当于 DNS 客户端的部分称为 DNS 解析器
通过 DNS 查询 IP 地址的操作称为域名解析,因此负责执行解析这一操作的工具就叫做解析器了
解析器实际上是一段程序,它包含在操作系统的 Socket 库中
库是一段通用程序组件的集合,其他的应用程序都需要使用其中的组件
- 库有很多好处:首先,使用线程的组件搭建应用程序可以节省编程工作量,其次,多个程序使用相同的组件可以实现程序的标准化
- 除此之外还有很多其他的好处,因此使用库来进行软件开发的思路已经非常普及,库的种类和数量也非常多
- Socket 其中包含的程序组件可以让其他的应用程序调用操作系统的网络功能,
- 而解析器就是这个库中的其中一种程序组件
- Socket 库中包含很多用于发送和接收数据的程序组件
Socket 库是用于调用网络功能的程序组件集合
四、通过解析器向 DNS 服务器发出查询
解析器的用法非常简单。Socket 库中的程序都是标准组件,只要从应用程序中进行调用就可以了
<应用程序名> (<参数>)
{
...
...
<内存地址> = gethostbyname("www.baidu.com")
(解析器的程序名)(要查询的服务器域名)
...
...
<发送 HTTP 消息>
...
}
调用解析器后,解析器会向 DNS 服务器发送查询消息,然后 DNS 服务器会返回响应消息
响应消息中包含查询到的 IP 地址,解析器会取出 IP 地址,并将其写入浏览器指定的内存地址中
五、解析器的内部原理
#1 应用程序(Web 浏览器)
...
...
<内存空间> = gethostbyname("www.baidu.com")
下一行
...
...
#2 Socket
gethostbyname{
生成发送给 DNS 服务器查询消息;
向 DNS 服务器发送查询消息;
接收 DNS 服务器返回的响应消息;
从响应消息中取出 IP 地址,存放到 <内存地址> 中;
返回应用程序;
}
#3 操作系统内部的协议栈
发送 UDP 消息{
发送操作
}
接收 UDP 消息{
接收操作
}
#4 网卡
#5 DNS 服务器
调用解析器时计算机内部的工作流程:通过让多个程序按顺序执行操作,数据就被发送出去了
向 DNS 服务器发送消息时,也需要知道 DNS 服务器的 IP 地址,只不过这个 IP 地址作为 TCP/IP 的一个设置项目实现设置好的,不需要再去查询了,不同的操作系统中 TCP/IP 的设置方法也有差异。
「@浪里淘沙的小法师」