大体过程

  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. DBCP、c3p0、Druid三大连接池区别

    DBCP.c3p0.Druid三大连接池区别 一.连接池优势 如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源: 如果创建一个池,用池来管理Connection,这样就可以 ...

  2. AJAX 与 Python 后台通信

    Ajax 简介 Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术. Ajax = 异步 ...

  3. djando 项目用django自己服务器在局域网中被访问设置

    这是一个相当操蛋的东西,害老子搞了那么久,其实嘞,也用不着那么恨,都是自己做的孽!! -----------------人工分割线----------------------------------- ...

  4. 计算两个集合的差集——第六期 Power8 算法挑战赛

    第六期Power8大赛 1.1 比赛题目 题目: 计算两个集合的差集: 详细说明: 分别有集合A和B两个大数集合,求解集合A与B的差集(A中有,但B中无的元素),并将结果保存在集合C中,要求集合C中的 ...

  5. python脚本监控获取当前Linux操作系统[内存]/[cpu]/[硬盘]/[登录用户]

    此脚本应用在linux, 前提是需要有python和python的psutil模块 脚本 #!/usr/bin/env python # coding=utf-8 import sys import ...

  6. 20145220韩旭飞《网络对抗》Exp2 后门原理与实践

    20145220韩旭飞<网络对抗>Exp2 后门原理与实践 常用后门工具实践 Windows获得Linux Shell 在Windows下,先使用ipconfig指令查看本机IP: 使用n ...

  7. 【前端】javascript实现鼠标跟随特效

    实现效果: 实现代码: <!DOCTYPE html> <html> <head> <title>鼠标跟随</title> <meta ...

  8. C#中dll附加配置文件

    DLL-with-configuration-file带配置文件的dll http://www.codeproject.com/Tips/199441/DLL-with-configuration-f ...

  9. cent os下搭建简单的服务器

    作为常和网络打交道的程序员,经常会遇到需要服务器的场合,比如搭建一个web服务器,一个代理服务器,又或者一个小型的游戏服务器. 我时常和朋友一起玩一款叫我的世界的游戏,为了能够长期稳定地联机玩,所以特 ...

  10. 函数递归简单题-hdoj-2044 2018-一只小蜜蜂 母牛的故事

    题目:一只小蜜蜂 递归做法: #include<cstdio> #include<iostream> #include<stdlib.h> #include< ...