上一篇文章从宏观上讲解了在浏览器输入URL或者通过点击超级链接等方式之后,浏览器所做的工作(解析URL和生成HTTP消息),那么在生成HTTP消息之后,我们就需要委托操作系统将消息发送给Web服务器。没错,浏览本身并不具备将消息发送到网络的功能。
但是在委托操作系统发送消息之前,还需要查询网址中服务器域名对应的IP地址。接下来,先简单了解一下IP地址。
在网络中,所有设备都会被分配一个地址,这与现实中的所谓的地址类似。例如“xx号xx室”,“号”相当于是分配给整个子网的,“室”是分配给子网中的计算机的,它们分别对应的是IP地址中的网络号和主机号。那么,什么称为子网呢?基本上可以理解为是多个单一的网络设备或者多个已经成组的网络设备组合而成的。以TCP/IP思路为例,下图很形象的描述了子网的概念:
消息先经过子网中的集线器,转发到距离发送者最近的路由器上,接下来,路由器会根据消息的目的地判断下一个路由器的位置,然后不断的重复,最终消息到达目的地。
在了解了TCP/IP的基本思路之后,反过来再看IP地址,目前的大环境下我们使用的还是IPv4,所以我们现在的IP地址是一串32比特的数字,按照8比特(一字节)为一组分四组。常用的IP表示法如下:
(a)IP地址主体的表示方法
10.11.12.13
(b)采用与IP地址主体相同的格式表示子网掩码的方法
10.11.12.13(IP地址主体)/...0(子网掩码)
(c)采用网络号比特数来表示子网掩码的方法
10.11.12.13(IP地址主体)/24(子网掩码)
(d)表示子网的地址
10.11.12.0(主机号部分的比特全部为0,这个地址表示的不是单独一台计算机,而是代表整个子网)/24
(e)表示子网内广播的地址
10.11.12.(主机号部分的比特数全为1,这个地址表示对整个子网进行广播)/24
大家可能对子网掩码比较好奇,其实这只是一种表示方式,我们只要记住子网掩码中为1部分对应的IP地址主体代表网络号,为0部分对应的IP地址主体代表主机号就可以了。
2、域名和IP地址并用的理由:正如前面所述,我们需要通过域名得知IP地址之后才能够将消息发送给对应的目标,那么,理所当然的,如果将URL中域名部分改为对应的IP地址同样也是可以发送成功的,只是这样不方便我们记忆和操作,所以一般不这么做。
3、Socket库提供查询IP地址的功能:查询IP地址只要询问最近的DNS(DimainNameSystem域名服务系统)服务器就可以了。向DNS服务器发出查询,也就是向DNS服务器发送查询消息,并收到服务器返回的响应消息,那么我们的计算机上就必须有相应的DNS客户端,一般我们称DNS客户端为DNS解析器,而通过DNS查询IP地址的操作称为域名解析。
解析器其实就是一段程序,它包含在操作系统的Socket库(是在加州大学伯克利分校开发的UNIX系操作系统BSD中开发的C语言库,互联网中所使用的大多数功能都是基于Socket库来开发的)中的,其它应用程序可以通过Socket库调用系统的网络功能。
4、通过解析器向DNS服务器发出查询:前面讲了解析器其实就是一段程序,那么下面以C语言为例,简单描述应用程序调用解析器的过程(其中gethostbyname为解析器的程序名):
应用程序名(参数)
{
...
...
内存地址=gethostbyname("