探索浏览器内部——向DNS服务器查询Web服务器的IP地址

1、IP地址的基本知识:

上一篇文章从宏观上讲解了在浏览器输入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地址主体)/255.255.255.0(子网掩码)

(c)采用网络号比特数来表示子网掩码的方法

10.11.12.13(IP地址主体)/24(子网掩码)

(d)表示子网的地址

10.11.12.0(主机号部分的比特全部为0,这个地址表示的不是单独一台计算机,而是代表整个子网)/24

(e)表示子网内广播的地址

10.11.12.255(主机号部分的比特数全为1,这个地址表示对整个子网进行广播)/24

大家可能对子网掩码比较好奇,其实这只是一种表示方式,我们只要记住子网掩码中为1部分对应的IP地址主体代表网络号,为0部分对应的IP地址主体代表主机号就可以了。

2、域名和IP地址并用的理由:

正如前面所述,我们需要通过域名得知IP地址之后才能够将消息发送给对应的目标,那么,理所当然的,如果将URL中域名部分改为对应的IP地址同样也是可以发送成功的,只是这样不方便我们记忆和操作,所以一般不这么做。

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

查询IP地址只要询问最近的DNS(Dimain Name System 域名服务系统)服务器就可以了。向DNS服务器发出查询,也就是向DNS服务器发送查询消息,并收到服务器返回的响应消息,那么我们的计算机上就必须有相应的DNS客户端,一般我们称DNS客户端为DNS解析器,而通过DNS查询IP地址的操作称为域名解析。

解析器其实就是一段程序,它包含在操作系统的Socket库(是在加州大学伯克利分校开发的UNIX系操作系统BSD中开发的C语言库,互联网中所使用的大多数功能都是基于Socket库来开发的)中的,其它应用程序可以通过Socket库调用系统的网络功能。

4、通过解析器向DNS服务器发出查询:

前面讲了解析器其实就是一段程序,那么下面以C语言为例,简单描述应用程序调用解析器的过程(其中gethostbyname为解析器的程序名):

<应用程序名> (参数)
{
    ...
    ...
    <内存地址> = gethostbyname("www.lab.glasscom.com");
    ...
    ...
    <发送HTTP消息>
    ...
}

5、解析器的内部原理:

当程序运行到 <内存地址> = gethostbyname("www.lab.glasscom.com");这行代码的时候,程序的控制流程就会转移到解析器的内部,也就是说,此时应用程序会暂停,控制流程会进入到Socket库中的gethostbyname(...)方法并生成将要发送给DNS服务器的查询消息。当然了解析器并不会亲自发送查询消息,同样的而是委托给了操作系统内的协议栈(操作系统内部的网络控制软件,也叫“协议驱动”或者“TCP/IP驱动”等)来执行。那么控制流程会进入协议栈并最后通过网卡将消息发送给DNS服务器。DNS服务器在接收到请求消息之后会进过一个复杂的查询(先不在这里详述)将对应的IP地址放入响应消息并返回,最终以发送消息相反的形式从协议栈再一步步回到应用程序。

其实,当目前为止还有一个我们忽略的前提,那就是在进行DNS解析之前,我们需要事先知道DNS服务器的IP地址,但是一般这个IP地址不用我们亲自设置,操作系统会默认设置。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值