1.2 向DNS服务器查询Web服务器的IP地址
1.2.1 IP地址的基础知识
“在生成 HTTP 消息之后,下一个步骤就是根据域名查询 IP 地址”

“子网掩码的格式如图 1.10 ②所示,是一串与 IP 地址长度相同的 32 比特数字,其左边一半都是 1,右边一半都是 0。其中,子网掩码为 1 的部分表示网络号,子网掩码为 0 的部分表示主机号。”

“全 0:表示整个子网”
“全 1:表示向子网上所有设备发送包,即“广播”
主机号的第一个通常为网关
1.2.2 域名和IP地址并用的理由
为什么不直接使用域名
- “IP 地址的长度为 32 比特,也就是 4 字节,相对地,域名最短也要几十个字节,最长甚至可以达到 255 字节。换句话说,使用 IP 地址只需要处理 4 字节的数字,而域名则需要处理几十个到 255 个字节的字符,这增加了路由器的负担,传送数据也会花费更长的时间 。”
- “域名并不仅是长,而且其长度是不固定的。处理长度不固定的数据比处理长度固定的数据要复杂,这也是造成效率低下的重要原因之一。”
“于是,现在我们使用的方案是让人来使用名称,让路由器来使用 IP 地址。为了填补两者之间的障碍,需要有一个机制能够通过名称来查询 IP 地址,或者通过 IP 地址来查询名称,这样就能够在人和机器双方都不做出牺牲的前提下完美地解决问题。这个机制就是 DNS”
1.2.3 Socket库提供查询IP地址的功能
与浏览器向Web服务器发送请求类似,这里也需要向DNS服务器发送请求来查询域名对应的IP地址。
浏览器是与Web服务器对应的客户端,而与DNS服务器对应的客户端叫做解析器,他实际上是系统Socket库中的一种程序组件
1.2.4 通过解析器向DNS服务器发出查询
解析器的使用非常简单,一句代码搞定,就像IOS里面调用系统Api一样

浏览器调用系统Socket库中的解析器组件向最近的一台DNS服务器查询域名的IP地址
1.2.5 解析器的内部原理

- “发送消息这个操作并不是由解析器自身来执行,而是要委托给操作系统内部的协议栈(也叫协议驱动、TCP/IP驱动)来执行。这是因为和浏览器一样,解析器本身也不具备使用网络收发数据的功能。”
- “HTTP 消息是用文本编写的,但 DNS 消息是使用二进制数据编写的。”
网友评论