二、 查询web服务器的IP
1. IP地址
因为浏览器不具备发送消息给服务器的功能,所以在生成HTTP消息后,浏览器会委托操作系统将消息发送给web服务器。但是还有一个工作需要在这之前完成——查询网址中服务器域名对应的IP地址。
域名的出现是因为IP地址实在是太难记了,比如www.naver.com就是域名,而其对应的IP地址是222.122.195.5。域名会通过DNS服务器,现将其变为IP地址,之后才真正接入网站。
互联网与公司内部的局域网都是基于TCP/IP的思想设计的。而TCP/IP网络是由小的子网通过路由器连接起来组成的大的网络。而子网可以看成是用集线器连接起来的几台计算机,而多个子网又是由路由器连接起来形成一个网络。
网络中所有设备都会被分配一个地址,即IP地址。IP地址是由网络号+主机号组成的,这里的网络号是分配给整个子网的,也就是说整个子网的网络号都是一样的,而主机号就对应子网中每一个设备,主机号中有两个特殊的号,全0和全1,全0表示整个子网,而全1表示向子网上所有的设备发包,即广播。还有一个子网掩码的概念,子网掩码表示网络号与主机号之间的边界,子网掩码与IP地址的长度相同,其左边一半是1,右边一半是0,1占了多少位就表示IP地址中网络号占了多少位,0占了多少位句表示主机号占了多少位。
通过IP地址可以判断对象服务器的位置,从而将消息发送到服务器。发送的消息会首先经过子网中的集线器,转发到最近的路由器上,然后路由器会根据消息的目的地址判断下一个路由器的位置,并将消息发送给这个路由器,不断重复上述的过程,最终消息会被传送到目的地。
路由器和集线器都是一种对包进行转发的设备。
2. 根据域名查询IP地址(域名解析)
那么到底怎么根据域名查找IP地址?
浏览器通过DNS解析器向DNS服务器发出查询消息,并接收服务器返回的响应消息。说白了解析器就是包含在操作系统的socket库中的一段程序或者说一个函数,socket库是用于调用网络功能的程序组件集合。
也就是说浏览器程序在编写时就会规定在什么情况下会调用解析器函数(gethostbyname),这样在满足条件的情况下,程序会调用到解析器函数(gethostbyname)。
DNS服务器返回响应消息,响应消息中包含查询到的IP地址,获得IP地址后,并将其写入浏览器指定的内存地址中。
接下来,浏览器取出IP地址,并向web服务器发送消息。
其实想向DNS服务器发消息也是需要DNS服务器的IP地址,只是这个地址是作为TCP/IP的一个设置项事先已经设置好了,所以不需要再去查询。
补充: DNS服务器
DNS的基本工作:接收来自客户端的查询消息,包括域名,网络类型class,域名对应的类型。DNS服务器上事先是保存着这3种信息对应的数据的,DNS服务器所做的就是根据客户端传送的这些请求信息查找对应的数据并且对客户端作出响应。
例:客户端向DNS服务器发送以下信息:
网络类型class:IN
域名对应的类型:A
然后DNS服务器会从域名和IP地址的对照表中查找匹配的记录,然后将对应的IP地址192.0.2.226返回给客户端。
对于公司这样的内部网络所有信息保存在一台DNS服务器上是可以实现的,因为数据相对较少。但是在互联网这种超大型网络,数据需要被保存在很多DNS服务器中,那么就会出现在一台服务器中找不到的情况。
互联网将信息分布保存在多台DNS 服务器中,这些DNS 服务器相互接力配合,从而查找出要查询的信息。
那么数据是根据什么样的规律来保存的?首先,DNS 服务器中的所有信息都是按照域名以分层次的结构来保存的。一个域的信息是作为一个整体存放在DNS 服务器中的,一台DNS 服务器中也可以存放多个域的信息。
如何找到相应的DNS 服务器中存放的信息?关键在于如何找到我们要访问的Web 服务器的信息归哪一台DNS 服务器管。首先,将负责管理下级域的DNS 服务器的IP 地址注册到它们的上级DNS 服务器中,然后上级DNS 服务器的IP 地址再注册到更上一级的DNS 服务器中,以此类推。也就是说,负责管理lab.glasscom. com 这个域的DNS 服务器的IP 地址需要注册到glasscom.com 域的DNS服务器中,而glasscom.com 域的DNS 服务器的IP 地址又需要注册到com域的DNS 服务器中。这样,我们就可以通过上级DNS 服务器查询出下级DNS 服务器的IP 地址,也就可以向下级DNS 服务器发送查询请求了。
在互联网中,com 和jp 的上面还有一级域,称为根域。像www.lab.glasscom.com.这样在域名的最后再加上一个句点,而这个最后的句点就代表根域。根域的DNS 服务器中保管着com、jp 等的DNS 服务器的信息。由于上级DNS 服务器保管着所有下级DNS 服务器的信息,所以我们可以从根域开始一路往下顺藤摸瓜找到任意一个域的DNS 服务器。实际上分配给根域的IP地址全世界仅有13个,所以可以将根域的DNS 服务器信息保存在互联网中所有的DNS 服务器中。因此任意一台DNS服务器都能访问根域,然后在顺藤摸瓜的找到某台目标DNS服务器。
现实中上级域和下级域有可能共享同一台DNS 服务器。在这种情况下,访问上级DNS 服务器时就可以向下跳过一级DNS 服务器,直接返回再下一级DNS 服务器的相关信息。
此外,有时候并不需要从最上级的根域开始查找,因为DNS 服务器有一个缓存A 功能,可以记住之前查询过的域名。如果要查询的域名和相关信息已经在缓存中,那么就可以直接返回响应,接下来的查询可以从缓存的位置开始向下进行。这个缓存机制中有一点需要注意,那就是信息被缓存后,原本的注册信息可能会发生改变,这时缓存中的信息就有可能是不正确的。因此,DNS 服务器中保存的信息都设置有一个有效期,当缓存中的信息超过有效期后,数据就会从缓存中删除而且,在对查询进行响应时,DNS 服务器也会告知客户端这一响应的结果是来自缓存中还是来自负责管理该域名的DNS 服务器。