做为前端工程师,几乎是天天都要与各类浏览器打交道。html
理解浏览器是如何工做的,对咱们作业务的技术选型、架构设计等都有很是重要的做用,可让咱们准确的评估web开的项目的可行性,站在更高维度审视页面,以及在快节奏的技术迭代中把握住问题的本质。前端
那么咱们就从一道面试题在浏览器里面,从输入URL到展现页面,这过程发生了什么?
来解开浏览器神秘的面纱web
在了解流程以前咱们先来看一下浏览器的架构:面试
当代现有的浏览器主要由:chrome
那么在了解完浏览器的架构以后,再来看一下URL的解析过程数据库
当发送一个url请求时,无论这个url是web页面的url仍是web页面上的每一个资源的url,浏览器都会开启一个线程处理该请求,同时在远程DNS服务器上启动一个DNS查询,这能使浏览器得到请求对应的IP地址后端
网址的解析是一个从右向左的过程: com -> google.com -> www.google.com;浏览器
事实上,真正的网址是www.google.com.,这个.对应的就是根域名服务器,默认状况下全部的网址的最后一位都是.,既然是默认状况下,为了方便用户,一般都会省略,浏览器在请求DNS的时候会自动加上,全部网址真正的解析过程为: . -> .com -> google.com. -> www.google.com.。缓存
名称 | 说明 | 示例 |
---|---|---|
根域 | DNS域名使用时,规定由尾部局点(.)来指定名称位于根或者更高级的域层次结构 | 单个句点(.)或者句点用于末尾的名称 |
顶级域 | 用于指示某个国家/地区或者组织使用的名称类 | .com |
第二层域 | 我的或者组织在Internet上使用的注册名称 | baidu.com |
子域 | 已注册的二级域名派生的域名,同属的讲就是网站名 | www.baidu.com |
主机名 | 一般状况下,DNS域名的最左侧的标签标示网络上的特定计算机,如h1 | h1.www.baidu.com |
在http消息发送前,须要创建客户端与服务器的TCP连接,也就是进行所谓的三次握手。
TCP是因特网中的传输层协议,使用三次握手协议)创建链接。当主动方发出SYN链接请求后,等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种创建链接的方法能够防止产生错误的链接,TCP使用的流量控制协议是可变大小的滑动窗口协议。服务器
TCP三次握手的过程以下:
三次握手完成,TCP客户端和服务器端成功地创建链接,能够开始传输数据了。
进过TCP3次握手以后,浏览器发起了http的请求;
chrome浏览器查看报文首部信息:
如今请求只是成功达到了服务器,接下来服务器须要响应浏览器的请求。
服务器端收到请求后的由web服务器(准确说应该是http服务器)处理请求,诸如Apache、Ngnix、IIS等。web服务器解析用户请求,知道了须要调度哪些资源文件,再经过相应的这些资源文件处理用户请求和参数,并调用数据库信息,最后将结果经过web服务器返回给浏览器客户端。
在HTTP里,有请求就会有响应,哪怕是错误信息。这里咱们一样看下响应报文的组成结构:
在响应结果中都会有个一个HTTP状态码,好比咱们熟知的200、30一、40四、500等。经过这个状态码咱们能够知道服务器端的处理是否正常,并能了解具体的错误。
状态码由3位数字和缘由短语组成。根据首位数字,状态码能够分为五类:
状态码 | 类别 | 说明 |
---|---|---|
1-- | 信息性状态码 | 接收的请求正在处理 |
2-- | 成功状态码 | 请求正常处理完毕 |
3-- | 重定向状态码 | 须要进行附加操做已完成请求 |
4-- | 客户端错误状态码 | 服务器没法处理请求 |
5-- | 服务器错误状态码 | 服务器处理请求出错 |
从上面的URL请求咱们能看到headers里面的Accept是text/html类型,这部分头部说明了浏览器将响应内容做为HTML渲染,而不是做为文件下载。浏览器将使用头部决定如何解释响应结果,固然也会考虑其余因素,好比URL的扩展状况。
当浏览器得到一个html文件时,会“自上而下”加载,并在加载过程当中进行解析渲染。
解析: