引言:昨天接到一个电话面试,其中有个问题:浏览器输入网址之后发生了什么?之前没有具体了解过,只是以web开发经验进行理解, 只是知道记得大学计网 DNS协议作用,进行域名解析得到服务器 IP地址,以下是我查阅资料的总结
大概总的过程:
1.在客户端浏览器中输入URL。
2.发送到DNS(域名服务器)获得域名对应的web服务器的IP地址。
3.客户端浏览器与web服务器建立tcp连接.
4.客户端浏览器向对应IP地址的WEB服务器发送相应的http或https请求。
5.WEB服务器响应请求,返回指定的URL数据或错误信息。如果设定重定向,则重定向到新的URL地址。
6.客户端浏览器下载数据,解析HTML源文件,解析的过程中实现对页面的排版,解析完成后,在浏览器中显示基础界面。
7.分析页面中的超链接,显示在当前页面,重复以上过程直至没有超链接需要发送,完成页面的全部显示
详细过程
从输入网址到显示数据,在这几秒的过程中,是很多硬件和软件在各自的岗位上相互配合完成了一系列的工作。为了解答“ 浏览器输入网址后发生了什么?”,本文将介绍这一系列工作中的每一个环节。但如果对每个环节都进行详细的介绍,会让这篇文章太过冗长。我们会将每个环节抽象成一个个简单的模型,这样有助于我们对每个工作过程有一个整体的把握。
在对每个环节进行详细介绍之前,我们先对整个过程做一个简单的介绍,帮助大家不会因为看不到整体而迷失方向。我们将整个工作过程分为六块,其中包含客户端、客户端局域网、接入网、互联网、Web服务器器端局域网和服务端。在浏览器输入完网址后,以Web浏览器为起点,经过各种网络设备,最后到达终点Web服务器。
客户端
用户在浏览器输入网址后,浏览器接下来的工作会从对用户输入的网址进行解析,会根据网址的含义生成请求消息。请求消息生成以后,浏览器需要向DNS服务器查询域名对应的IP地址。查询到IP地址以后,浏览器将消息委托给操作系统发送给Web服务器。操作系统接收到委托后,协议栈通过TCP协议收发数据。IP协议控制网络包收发操作,与网卡进行配合,将数据封装成网络包,在将网络包转化成电信号或光信号发送出去。
Web浏览器
1、生成HTTP请求消息
输入网址后,浏览器会按照一定的规则去解析网址的含义,然后按照其含义生成请求消息。在探讨浏览器是怎么解析URL之前,我们首先要了解URL。URL(统一资源定位符)是因特网上标准的资源的地址,标准格式如下:
对 URL 进行解析之后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息。具体的HTTP请求消息的格式为:
2、向DNS服务器查询Web服务器的IP地址
因为浏览器本身并不具备将消息发送到网络的功能,所以需要委托操作系统来实现。在这一操作之前,我们还有一个工作需要完成,那就是DNS服务器查询网址中服务器域名对应的IP地址。
在了解如何向DNS服务器查询Web服务器的IP地址之前,先介绍一下IP地址的基本知识。
IP地址是一串32比特的数字,按照8比特为一组分成4组,分别用十进制表示,用圆点隔开。在IP地址的规则中,这32比特的数字构成了IP地址的网络号和主机号。IP地址的网络号和主机号是根据子网掩码划分的。子网掩码的长度也是32位,左边是网络位,用二进制数字“1”表示;右边是主机位,用二进制数字“0”表示。
“192.168.1.1”和子网掩码为“255.255.255.0”的二进制对照。其中,“1”有24个,代表与此相对应的IP地址左边24位是网络号;“0”有8个,代表与此相对应的IP地址右边8位是主机号。
DNS服务器中所有的信息都是按照域名以分层次的结构来保存的。DNS中的域名都是用句点来分隔的,域名中越靠右的位置表示层级越高。一个域的信息是作为一个整体存放在DNS服务器中的,不能将一个域拆来来存放在多台DNS服务器中。比如www.baidu.com,com域的下一层域是baidu域,在下一层域是www。但com域(成为顶级域)并不是最顶层的域,在com域上面还有一级域,成为根域。
互联网中有数万台DNS服务器,肯定不能一台一台的进行查找,我们可以采用下面的方法。首先将负责管理下级域的DNS服务器的IP地址注册到它们的上级DNS服务器中,然后上级DNS服务器的IP地址在注册到更上一级的DNS服务器,以此类推,直到将顶级域的IP地址注册到根域。这样我们就可以通过上级DNS服务器查询出下一级DNS服务器的IP地址。除此之外,我们还需要完成一项工作,就是将根域的DNS服务器的信息保存到所有的DNS服务器中,这样一来,任意一台DNS服务器都可以找到并访问根域的DNS服务器。
以www.baidu.com为例,其中一种查询过程为:
1、客户端首先访问最近的DNS服务器;
2、假如最近的DNS服务器没有查到域名信息,我们就需要从根域DNS服务器查找,根域服务器没有www.baidu.com的信息,但根域可以判断这个域名属于com域,因此根域会返回管理com域的DNS服务器地址给客户端计算机最近的DNS服务器;
3、然后客户端计算机最近的DNS服务器在向com域发送查询信息,com也没有www.baidu.com的域名信息,和刚才一样,com服务器会返回它下面的baidu.com域的IP地址给客户端计算机最近的DNS服务器;
4、然后客户端计算机最近的DNS服务器在向baidu.com域发送查询信息,baidu.com域将查到的www.baidu.com的IP地址返回给客户端计算机最近的DNS服务器。
5、客户端计算机最近的DNS服务器将www.baidu.com的IP地址返回给客户端计算机;
6、客户端计算机就知道Web服务器的IP地址了,也就可以对其进行访问了。
TCP模块
知道IP地址以后,就可以委托操作系统内部的协议栈向这个目标IP地址发送消息了。客户端会创建套接字,然后将管道连接到服务器的套接字上,连接成功后,客户端就可以收发数据了。在Socket连接和发送过程中,TCP模块都会创建特定的TCP头部。