大体过程

  1. 浏览器的地址栏输入URL并按下回车
  2. 浏览器检查当前URL是否存在缓存,并比较缓存是否过期
  3. DNS解析URL对应的IP
  4. 根据IP建立TCP连接(三次握手)
  5. HTTP发起请求
  6. 服务器处理请求,浏览器接收HTTP响应
  7. 渲染页面,构建DOM树
  8. 关闭TCP连接(4次挥手)

具体过程的理解

浏览器缓存

大体上来说,可以分为强缓存和协商缓存

  • 强缓存

    • 强缓存主要通过http响应头中的Cache-Control和Expires两个字段来控制的
    Expires: Wed, 21 Oct 2015 07:28:00 GMT
    • Expires是HTTP/1.0标准下的字段,上例表示该资源会在Wed, 21 Oct 2015 07:28:00 GMT之后过期,在这个时间点之前都是直接读取缓存不会发起请求的。这种方式有一个很大的问题就是服务器时间和本地时间可能不一致或者说是修改了本地时间也会造成缓存失败。
    Cache-control: max-age=30
    • Cache-Control出现于HTTP/1.1,优先级高于Expires,上面这个表示该资源会在30秒之后过期,还有其他值可选,详情查看文档
  • 协商缓存
    • 如果缓存过期了,我们就要用协商缓存来解决问题,也就是说协商缓存是需要请求的,如果缓存有效会返回304。协商缓存通过HTTP的Last-modified,Etag字段进行判断
    • Last-Modified是一个响应头字段,包含的是服务器认定的资源做出修改的日期及时间。下次请求时If-Modified-Since这个请求头字段会将Last-Modified发送给服务器,问服务器在该日期之后资源是否有更新,没有更新的话返回一个不带消息主体的304响应,有更新的话会返回新资源,并且响应头中会的Last-Modified会带有最新文件修改时间。
    • ETag是一个响应头字段,类似于文件指纹,If-None-Match会将当前的ETag发送给服务器,服务器验证目前文件的ETag跟请求的ETag是否一致,如果一致,就返回不带任何内容的304未修改状态,如果不一致就返回最新资源。

DNS解析

DNS解析实际上就是将我们熟悉的域名解析成IP地址,也就是说当你在浏览器地址栏输入www.baidu.com时实际上访问的是这个域名对应的唯一IP地址,之所以当初要这样设计,是因为IP地址是由纯数字组成的,不便于记忆,而通过几级域名这种方式是便于我们人类记忆的。

DNS解析是一个递归查询的过程,从右到左解析的,有一个专门的DNS解析服务器,据说要经历8个步骤,具体过程我们了解不多,就不过多解释了。

建立TCP连接的三次握手

这一块InterviewMap讲的比较详细了

浏览器渲染页面的过程

  1. 处理HTML并构建DOM树
  2. 处理CSS构建CSSOM树
  3. 将DOM树和CSSOM树合并成一个渲染树
  4. 根据渲染树来布局,计算每个节点的位置(回流)
  5. 调用GPU绘制,合成图层,显示在屏幕上(重绘)

总结

既然大体知道了浏览器从输入URL到页面加载的过程,那就可以针对这个过程一些可优化的点做优化,这也成了前端性能优化的一个重要部分,关于这部分,我会另写一篇文章来总结。

参考文章

从输入URL到页面加载发生了什么的更多相关文章

  1. 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 3

    备注: 因为文章太长,所以将它分为三部分,本文是第三部分. 第一部分:深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1 第二部分:深入浅出经典面试题:从浏览器中输入URL ...

  2. 【ASP.NET Core】EF Core - “影子属性” 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1

    [ASP.NET Core]EF Core - “影子属性”   有朋友说老周近来博客更新较慢,确实有些慢,因为有些 bug 要研究,另外就是老周把部分内容转到直播上面,所以写博客的内容减少了一点. ...

  3. (四)从输入URL到页面加载发生了什么

    一.从输入URL到页面加载发生了什么 1.在浏览器中输入URL 如:https://www.cnblogs.com/loveapple/ URL分成协议.地址.路径三部分 协议:http.https. ...

  4. 从输入URL到页面加载发生了什么?

    总体来说分为以下几个过程: DNS解析 TCP连接 发送HTTP请求 服务器处理请求并返回HTTP报文 浏览器解析渲染页面 连接结束 具体内容点这里

  5. 从输入 URL 到页面加载完成的过程中都发生了什么事情?

    这个问题是老生常谈的问题啦,虽然说到处百度都有的答案,还是希望自己能总结一下. 如今有很多答案,都是从硬件开始讲起,比如键盘的响应或者触屏的响应,然后CPU处理到OS的内核等等.这里不作为重点来讲,要 ...

  6. 从输入 URL 到页面加载完成的过程中都发生了什么

    从输入 URL 到页面加载完成的过程中都发生了什么 过程描述 浏览器查找域名对应的 IP 地址: 浏览器根据 IP 地址与服务器建立 socket 连接: 浏览器与服务器通信: 浏览器请求,服务器处理 ...

  7. 从浏览器中输入URL到页面加载的发生了什么-转载

    转:https://www.cnblogs.com/confach/p/10050013.html 背景 “从浏览器中输入URL到页面加载的发生了什么“,这是一道经典的面试题,涉及到的知识面非常多,但 ...

  8. 一个页面从输入URL到页面加载完成发生了...待细化

    一个页面从输入URL到页面加载完成发生了... 1.查找浏览器缓存 2.寻址:DNS解析 查找该域名对应的IP地址, 如果需要重定向(301),则再次发起请求 3. 进行HTTP协议会话 4.客户端发 ...

  9. 【转】 从输入 URL 到页面加载完成的过程中都发生了什么事情?

    该问题总结 一. 往浏览器输入URL后给你一个页面,你天天在使用的东西,学过计算机网络的知道是怎么回事,就DNS解析然后页面的回馈,不过要讲好还是有难度. 之前fex团队的nwind专门写过这个问题的 ...

随机推荐

  1. MIME协议(详解范例)

    转载一:http://blog.csdn.net/bripengandre/article/details/2192982 转载二:http://blog.csdn.net/flfna/article ...

  2. python中的迭代器和生成器学习笔记总结

    生成器就是一个在行为上和迭代器非常类似的对象.   是个对象! 迭代,顾名思意就是不停的代换的意思,迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次“迭代”,而 ...

  3. Python3基础 list remove 删除元素

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  4. 小朋友排队|2014年蓝桥杯B组题解析第十题-fishers

    小朋友排队 n 个小朋友站成一排.现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友. 每个小朋友都有一个不高兴的程度.开始的时候,所有小朋友的不高兴程度都是0. 如果某个小朋 ...

  5. dubbo 配置属性

    1,服务方 <dubbo:application name="demo-provider" /> <!-- 使用zookeeper注册中心暴露服务地址 --> ...

  6. Python 逗号的几种作用

    转自http://blog.csdn.net/liuzx32/article/details/7831247 最近研究Python  遇到个逗号的问题 一直没弄明白 今天总算搞清楚了 1.逗号在参数传 ...

  7. 2018 leetcode

    2018-8-6 Lowest Common Ancestor of a Binary Tree(二叉树) Merge Intervals(排序) 2018-8-7 Maximal Square (动 ...

  8. BZOJ 1009: [HNOI2008]GT考试(kmp+dp+矩阵优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 思路:真的是好题啊! 对于这种题目,很有可能就是dp,$f[i][j]$表示分析到第 ...

  9. mysql 对比两个表的一致性

    -- A和B两个表 数据是否一致select 自定义 from A left join B on A.id = B.id where B.id is null 注释:这样查询的结果是A表中有而B表中没 ...

  10. C++基础-string截取、替换、查找子串函数

    1. 截取子串 s.substr(pos, n)    截取s中从pos开始(包括0)的n个字符的子串,并返回 s.substr(pos)        截取s中从从pos开始(包括0)到末尾的所有字 ...