• 在浏览器地址栏输入URL,按下回车后究竟发生了什么?


    1.背景介绍

           当你在浏览器地址栏输入一个URL后回车,将会发生的事情?这是一道经典的面试题,同时也是一道复杂的题目,涉及到很多东西,不同的软件开发者对于此道问题有不同的答案,对于其中的某一点也能无限深究,今天我们就来侧重于web前端来看一下究竟发生了什么。

     

    2.知识剖析

     

    基本流程:

    ①查询ip地址

    ②建立tcp连接,接入服务器

    ③浏览器发起http请求

    ④服务器后台操作并做出http响应

    ⑤网页的解析与渲染

    3.常见问题

    具体步骤?

    4.解决方案

    查询ip地址

    ①浏览器解析出url中的域名。

    ②查询浏览器的DNS缓存。

    ③浏览器中没有DNS缓存,则查找本地客户端hosts文件有无对应的ip地址。

    ④hosts中无,则查找本地DNS服务器(运营商提供的DNS服务器)有无对应的DNS缓存。

    ⑤若本地DNS没有DNS缓存,则向根服务器查询,进行递归查找。

    ⑥递归查找从顶级域名开始(如.com),一步步缩小范围,最终客户端取得ip地址。

    tcp连接与http连接

    ①http协议建立在tcp协议之上,http请求前,需先进行tcp连接,形成客户端到服务器的稳定的通道。俗称TCP的三次握手。

    ②tcp连接完成后,http请求开始,请求有多种方式,常见的有get,post等。

    ③http请求包含请求头,也可能包含请求体两部分,请求头中包含我们希望对请求文件的操作的信息,请求体中包含传递给后台的参数。

    ④服务器收到http请求后,后台开始工作,如负载平衡,跨域等,这里就是后端的工作了。

    ⑤文件处理完毕,生成响应数据包,响应也包含两部分,响应头和相应体,响应体就是我们所请求的文件。

    ⑥经过网络传输,文件被下载到本地客户端,客户端开始加载。

    html渲染

    ①客户端浏览器加载了html文件后,由上到下解析html为DOM树(DOM Tree)。

    ②遇到css文件,css中的url发起http请求。

    ③这是第二次http请求,由于http1.1协议增加了Connection: keep-alive声明,故tcp连接不会关闭,可以复用。

    ④http连接是无状态连接,客户端与服务器端需要重新发起请求--响应。

    在请求css的过程中,解析器继续解析html,然后到了script标签。

    ⑤由于script可能会改变DOM结构,故解析器停止生成DOM树,解析器被js阻塞,等待js文件发起http请求,然后加载。这是第三次http请求。js执行完成后解析器继续解析。

    ⑥由于css文件可能会影响js文件的执行结果,因此需等css文件加载完成后再执行。

    ⑦浏览器收到css文件后,开始解析css文件为CSSOM树(CSS Rule Tree)。

    ⑧CSSOM树生成后,DOM Tree与CSS Rule Tree结合生成渲染树(Render Tree)。

    ⑨Render Tree会被css文件阻塞,渲染树生成后,先布局,绘制渲染树中节点的属性(位置,宽度,大小等),然后渲染,页面就会呈现信息。

    ⑩继续边解析边渲染,遇到了另一个js文件,js文件执行后改变了DOM树,渲染树从被改变的dom开始再次渲染。

    ⑪继续向下渲染,碰到一个img标签,浏览器发起http请求,不会等待img加载完成,继续向下渲染,之后再重新渲染此部分。

    ⑫DOM树遇到html结束标签,停止解析,进而渲染结束。

    5.编码实战

     

    6.扩展思考

    有那些网站优化的方法?

    ①减少DNS查询:将服务器域名的ip信息加入本地host文件。

    ②减少http请求数量,对于图片使用雪碧图,对于html文件和css文件,js文件分别进行合并操作。

    ③减少下载时间:压缩图片,使用压缩应用压缩文档中的空格,删除文件多余的语句和注释,创造自己的js精简库和精简框架,使用本地浏览器缓存。

    ④提前渲染开始时间:将css链接放在html头部。

    ⑤减轻解析器的阻塞:将js链接放在body尾部。

    7.参考文献

    参考一:http://www.jianshu.com/p/5b069ae8c4f2

    参考二:http://blog.csdn.net/android1514/article/details/51281494



    作者:xiaoyudesu
    链接:http://www.jianshu.com/p/69c2cf84b407
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    解决SharePoint 文档库itemadded eventhandler导致的上传完成后,编辑页面保持报错的问题,错误信息为“该文档已经被编辑过 the file has been modified by...”
    解决SharePoint 2013 designer workflow 在发布的报错“负载平衡没有设置”The workflow files were saved but cannot be run.
    随机实例,随机值
    Spring4笔记
    struts2笔记(3)
    struts2笔记(2)
    获取文本的编码类型(from logparse)
    FileUtil(from logparser)
    DateUtil(SimpleDateFormat)
    struts2笔记
  • 原文地址:https://www.cnblogs.com/midiyu/p/7905554.html
Copyright © 2020-2023  润新知