你在浏览器输入url到发起http请求,这过程到底发生了什么?

2020-12-18  本文已影响0人  Null丶sleep

     大家后,我是 sleep,本次给大家分享的是一个很基础的知识,当你在浏览器输入URL,这其中究竟发生了什么,我们来一探究竟!

· 简述

  1. 浏览器根据请求的URL交给DNS来解析,找到真实存在的ip地址,向服务器发送请求
  2. 服务器交给后台来处理完成后的返回数据,浏览器接受到html,css,javascript文件
  3. 浏览器根据接收到的文件,开始加载对应的资源,对html,css,javascript等等,进行语法解析,构建对应的内部数据结构,也就是dom树,css树,render树;
  4. 载入页面。解析到资源文件,触发页面渲染,完成。
以上只是简单的浏览器访问的一个过程。而详细过程有许多操作,我们来深入理解其中的奥妙。

· 详述

  1. 浏览器会首先开启一个线程来处理这个请求,对URL分析判断,若是http协议就按照web的方式来处理。
  2. 接着浏览器会对URL进行解析,解析其 -协议头-主机域名-ip地址-端口号-请求路径-查询参数等,然后开启网络请求来发出一个完整的http请求。
  3. URL一般是服务器域名,此时DNS通过域名查询得到对应的ip地址。
  4. 此时DNS会先查看我们浏览器的DNS缓存,若是没有就会查询计算机本地缓存,若是还没有就会询问递归式DNS服务器,也就是网络供应商中自己的缓存,如果还是没有缓存,就会根据根域名,和TLD域名服务器来指到对应的权威DNS服务器,并且缓存到递归式服务器中,然后递归式服务器会将记录发送给本地。
  5. 有了ip地址以后,此时网络层会开始寻找对应的服务器的物理地址。
  6. 寻到服务器地址后,此时便开始我们常说的三次握手,客户端在网络传输层便可以和服务器通过三次握手建立起tcpip连接。
  7. 建立起来连接后,网络数据链层会将数据包装成帧。
  8. 然后物理层,会通过物理介质进行物理传输。
  9. 到了服务器,就会通过相反的方式,将数据一层一层的返回出去。
  10. 请求到了服务器,就要开始验证了,一般服务器会有统一的验证,比如安全验证啊,跨域验证啊,或者是否合法啊等等,若是不合法或直接返回相应的请求报文。
  11. 验证通过以后会直接进入后台代码开始执行后台代码逻辑,执行对应的操作,增删改查等等。
  12. 如果浏览器访问过此页面,且缓存上有对应的资源,便会与服务器时间进行最后的对比,一致的话就会返回304,告诉浏览器可以使用本地缓存。
  13. 此时前端页面收到成功的报文以后开始下载网页。
  14. 下载完成后此时浏览器内核开始介入工作了,也就是渲染进程。
    (1). 根据顶部DTD类型来进行对应的解析方式。
    (2). 渲染的进程是多线程的,网页的解析将由内部的GUI渲染线程来做处理。
    (3). 首先渲染线程中的HTML解析器会将HTML网页和资源从字节流转换为字符流
    (4). 紧接着是词法分析器,又将字符流解释为词语。
    (5). 之后就是经过语法分析器根据语法来构建成节点,最后通过这些节点来组建一个DOM树。
    (6). 在这个过程中,如果遇到的DOM节点是javascript就会调用JavaScript引擎对JavaScript代码进行解释并且执行,此时JavaScript引擎是和GUI渲染线程互斥的,GUI渲染线程就会被挂起,渲染过程停止;如果JavaScript引擎对运行中的DOM树进行了更改,那么就会造成回流重绘。重新加载DOM资源。
    (7). 如果节点需要其他资源,图片或者CSS等,便会调用网络模块的资源加载器来加载他们,但是他们是异步的,不会阻塞当前的DOM树的构建;
    (8). 如果遇到的是JavaScript资源URL没有被标记异步,则会停止当前DOM树的创建,待到JavaScript的资源被加载完毕后,JavaScript引擎才会继续创建DOM。
    (9). 对于CSS,CSS解释器会将其解释为内部的表示结构的,生成CSS规则树。
    (10). 紧接着就是合并CSS规则树,和DOM树,生成render渲染树。
    (11). 最后就是对render树进行布局和绘制。并将结果通过IO线程传给Browser控制显示。
上一篇下一篇

猜你喜欢

热点阅读