接上篇:
所以,浏览器在查询目标地址的IP地址时,只需要调用Socket库中的gethostbyname程序即可,如下图所示:
调用解析器后,解析器会向DNS服务器发送查询消息,然后DNS服务器会返回响应消息。响应消息中包含查询到的IP地址,解析器会取出IP地址,并将其写入浏览器指定的内存地址中。只要运行图1.11中的这一行程序,就可以完成前面所有这些工作,我们也就完成了IP地址的查询。接下来,浏览器在向Web服务器发送消息时,只要从该内存地址取出IP地址,并将它与HTTP请求消息一起交给操作系统就可以了。
下面讲解析器内部查询IP的原理,如下图:
它也需要讲请求消息委托给操作系统的协议栈,然后发送给就近的DNS服务器,只是就近的DNS服务器的IP地址,操作系统中已提前设置上,不需要再去查询。
发送给就近的服务器后,需要全世界的DNS服务器大接力,才能查找到目标IP。
三、DNS服务器查询的过程
DNS内部查询时,根据客户端发送过来的域名、CLASS和记录类型,和表格中这三个数据进行对比,找到相应的响应数据即IP地址或邮件服务器域名等。现在互联网所有class均为IN,记录类型中A表示IP,MX表示邮件服务器等。
域名中越靠后越大,最大的为根服务器“/”,其次为cn,com,jp等。根服务器一共对应13个ip地址,每个ip地址对应多个DNS服务器遍布全球各地,每个DNS服务器都注册了根服务器的地址,所以就近的服务器在查找目标IP时,自身服务器没有,边可直接讲请求消息告诉根服务器,然后根服务器告诉其下一级DNS服务器如com的IP,然后向该级服务器查找,逐次向下级服务器查找,直到找到目标IP,如下图:
为了加快DNS服务器的响应速度,就近的DNS服务器会进行一定时期的缓存。
四、委托协议栈发送消息
具体过程如下:
首先,建立套接字,每一个窗口都会建立一个套接字,创建套接字后,浏览器会收到一个描述符,使用客户端内部,讲套接字和每个页面对应,同时会有一个端口号,供与网络中服务器使用。
然后进行连接,连接时需要服务器IP地址和端口号,这里服务器的端口号一般有规则,如web服务器,端口号统一使用80,同时也将客户端的IP地址和该套接字对应的端口号告诉服务器。
之后,就可以进行发送和接收,将接受到的数据放在缓存区。
最后,进行关闭通道。刚开始,每次发送完消息,服务器会触发close,但是每次都需要这四个过程,服务器效率太低,所以在http1.1中,当浏览器所有的请求数据完成后,浏览器触发close。