从上一篇博客我们得知浏览器是如何生成了HTTP消息了,但是浏览器作为应用程序,是不具备向网络中发送请求的能力,而是需要委托给操作系统的内核协议栈来发送请求。在委托协议栈之前,浏览器还要做的一件事情就是将域名转换为IP地址。
在了解这个过程之前,我们先来学习一下IP地址相关概念。
IP(Internet Protocol)网际互联协议,是TCP/IP协议中的核心部分。通常我们接触比较多的是IP地址,像 这种4组数字和3个点分隔符组成的,每组数字的取值范围是0~255,换算成2进制最大表示到28,也就是8个bit,1个字节的长度,所以1个IP地址的长度占用了4个字节。
IP地址的作用可以帮助我们在互联网中定位到某台主机。通常我们访问的网站域名都是很多字符组成,一般占用几十到几百个字节,而1个IP地址只占用4个字节,如果通过域名去定位这台主机,要远大于使用IP地址定位的使用的网络传输成本。
IP地址一般是由2部分组成,,那子网和主机又分别代表了什么呢?下面这张图就展示了他们的关系,比如几台计算机通过集线器可以组成的一个小的内网,这个内网就是子网,而每一台计算机就是子网中的主机。子网与子网之间可以通过路由器连接起来,实现访问。
既然IP地址是由子网号和主机号组成,那他们是通过什么规则组成的呢?这里就需要接触掩码地址。
掩码地址和IP地址长的是一样的,都是占用4个字节的一组号分隔的数字。掩码的表示有很多种形式,如下两种:
接下来,浏览器需要根据域名查询IP地址,这一步要借助DNS服务器,同理浏览器无法直接向DNS服务器发起请求,而是要调用操作系统Socket库中的DNS解析器程序来完成。
DNS解析器,其实就是DNS客户端,是一段实现在Socket库中的程序代码,他的作用就是接收各种域名转换IP地址的请求,将域名发送给DNS服务器,DNS服务器接收请求解析后,将IP地址返回给DNS解析器,解析器再将IP地址存放到浏览器指定的内存地址处。当然,DNS解析器也是不具备直接向网络发送请求的,同理要借助操作系统的内核协议栈来实现。接下来,浏览器就会从内存中取出IP地址,和生成的HTTP消息,交给操作系统来执行发送网络请求。
DNS服务器的主要工作就是将客户端发来的域名转换为IP地址,在DNS服务器中保存着域名与IP地址的映射表,这张表中除了保存、,还有(DNS设立之初考虑了除了互联网之外的网络,不过目前只有互联网IN这一种类型)和(A就是Adress,表示IP地址,MX表示邮件服务器)。
查找的第一步,根据我们配置的DNS地址找到对应的DNS服务器,这台DNS服务器上会缓存之前查找过的域名,当然是有过期时间的。如果有此域名,会直接返回客户端,同时也会告诉客户端这个IP地址来自缓存还是保存此地址的DNS服务器。
我们知道,域名通常是由很多层级来表示的,比如这个域名就包含了4层域名,1个是放在最后,一般隐藏不写表示根域,表示顶级域名,而表示一级域名,lab表示二级域名,www就代表了web服务器。一般来说,每层的域名会分布在不同的DNS服务器上,当然也不是那么绝对,但是上一层级的域名会记录下一层级域名的IP地址,然后所有的域名服务器都会记录根域服务器的IP地址。以上面这个域名为例:
- 根域名: 全世界的根域IP地址有13个,这样就有对应的13组服务器,大部分在美国,据说中国以前有一台,后来因为国内互联网开放程度过低,动不动就封这个网站,那个网站,被撤掉了。回到上面例子,根域服务器会记录 这个域名的服务器IP地址。
- 顶级域名: 上面例子中的是当前互联网中应用最广的域名,这个域名对应的DNS服务器中会记录下一级的域名服务器地址。
- 一级域名: 上面例子中的是一级域名,这个对应的服务器中会记录的DNS服务器IP地址。
- 二级域名: 这是最下一层的域名了,这个DNS服务器中就会记录这个域名与IP的映射记录。
因为所有的域名服务器中都会记录根域服务器的IP地址,所以不管我们电脑上配置的哪个DNS服务器,在DNS缓存无法命中的情况下,会直接将请求发给根域服务器,根域服务器将顶级域的IP地址返回到我们配置的DNS服务器,它再去寻找的DNS服务器,同理会返回域名DNS服务器的地址,依次直到最下层的域名DNS服务器,这台DNS服务就会把对应的IP地址返回给客户端,完成对此IP地址的请求。