输入网址回车或者刷新页面到页面传染出来的整个流程

  1. DNS 解析
  2. HTTP三次握手 -> TCP/IP连接
  3. 浏览器发送请求
  4. 服务器返回请求的文件 (html)
  5. 浏览器渲染

1. DNS 解析

  1. 查找缓存

    • Chrome搜索自身的DNS缓存,看有没有该域名对应的IP地址(chrome://net-internals/#dns)
    • Chrome会搜索操作系统自身的DNS缓存(浏览器没有找到缓存或者缓存已经失效)
    • 读取本地的HOST文件(操作系统的缓存没有找到)(mac: etc/host)
  2. 浏览器发起一个DNS的一个系统调用(向本地主控DNS服务器,一般由宽带运营商提供的,发起的一个域名解析请求)
    • 宽带运营商服务器查看本身缓存,有没有过期。
    • 运营商服务器代替浏览器发起一个迭代DNS解析的请求(baidu.com的IP地址是多少?1、寻找根域的DNS IP地址,2、COM域的顶级域的IP地址,3、baidu.com域的IP地址)(以123.com为例,COM 是根域名,123.com是人们经常提到的顶级域名,主域名可以理解为你的网站的访问域名,一般是www.123.com
    • 运营商服务器把结果返回操作系统内核同时缓存以来
    • 操作系统内核把结果返回浏览器
    • 最终浏览器拿到了www.imooc.com对应的IP地址

2. HTTP三次握手 -> TCP/IP连接

  1. 浏览器获得域名对应的IP地址后,发起HTTP“三次握手”

    • 浏览器会以一个随机端口,向服务器的web程序发起TCP连接请求
    • 应用层会下发数据给传输层,然后下发给网络层。网络层中的 IP 协议会确定 IP 地址,并且指示了数据传输中如何跳转路由器。然后包会再被封装到数据链路层的数据帧结构中,最后就是物理层面的传输
    • TCP链接请求通过层层的路由设备,到达服务器端以后,首先进入网卡,然后进入内核的TCP/IP协议栈,经过防火墙的过滤,最后到达服务端,建立起TCP/IP的连接
    • 数据在进入服务端之前,可能还会先经过负责负载均衡的服务器,它的作用就是将请求合理的分发到多台服务器上

3. 浏览器发送请求

  1. TCP/IP连接建立起来以后,浏览器就可以向服务器发送HTTP请求了使用了。(例如:用HTTP的GET方法请求一个根域里的一个协议,协议可以采用HTTP 1.0的一个协议)

    • 浏览器在每次发起请求时,都会现在浏览器缓存中查找该请求的结果以及标识
    • 如果没有请求的缓存结果和缓存标识,那么就会发起HTTP请求
    • 如果该请求的缓存结果失效,只有缓存标识,则携带该资源的缓存标识,发起HTTP请求,若协商缓存生效,则返回304
    • 如果存在请求的缓存结果,且未失效,则直接返回。(强制缓存可以在network中的size查看,代表该缓存存放的位置。from memory cache内存中的缓存[图片、js] ,from disk cache硬盘中的缓存[css])

4. 服务器返回请求的文件 (html)

  1. 服务器端接受到了这个请求,根据路径参数,经过后端的一些处理以后,把处理后的一个结果的数据返回给浏览器。

    • 服务器会将缓存规则放入HTTP响应报文的HTTP头中和请求结果一起返回给浏览器,控制强制缓存的字段分别是ExpiresCache-Control,控制协商缓存的字段分别是Last-Modified/if-Modified-SinceEtag/if-None-Match
    • 浏览器每次拿到返回的请求结果都会将该结果和缓存标识存入浏览器中缓存中。

5. 浏览器渲染

  1. 浏览器拿到了服务器返回的HTML页面代码,在解析和渲染这个页面时候,里面的JS/CSS、图片静态资源,他们同样也是HTTP请求,都需要经过上面的步骤。
  2. 浏览器根据拿到的资源对页面进行渲染,最终把一个完整的页面呈现给了用户。
    • HTML parser:根据 HTML 构建 DOM 树。
    • CSS parser:根据 CSS 构建 CSSOM 树。
    • 如果遇到 script 标签的话,会判断是否存在 async 或者 defer ,前者会并行进行下载并执行 JS,后者会先下载文件,然后等待 HTML 解析完成后顺序执行。如果以上都没有,就会阻塞住渲染流程直到 JS 执行完毕。遇到文件下载的会去下载文件,这里如果使用 HTTP/2 协议的话会极大的提高多图的下载效率。
    • Attachment:CSSOM 树和 DOM 树构建完成后会开始生成 Render 树。
    • Layout: 布局。确定页面元素的布局、样式等等诸多方面的东西。
    • GPU painting: 像素绘制页面,将内容显示在屏幕上了。

输入URL到页面渲染的更多相关文章

  1. 一文摸透从输入URL到页面渲染的过程

    一文摸透从输入URL到页面渲染的过程 从输入URL到页面渲染需要Chrome浏览器的多个进程配合,所以我们先来谈谈现阶段Chrome浏览器的多进程架构. 一.Chrome架构 目前Chrome采用的是 ...

  2. 从浏览器输入URL到页面渲染的过程

    零.背景 一个web安全工程师在学习web安全和web渗透时候,非常有必要了解整个WEB工作过程. 一.输入URL 这里是最基本的知识:URL是URI的一种实际应用,URI统一资源表示符,URL统一资 ...

  3. 从输入URL到页面渲染完成 -戈多编程

    1.输入URL地址 2.浏览器根据域名查询IP地址 3.浏览器发送HTTP请求到web服务器 4.服务器返回一个永久重定向响应 5.浏览器会跟踪重定向地址 6.服务器处理请求 7.服务器返回一个HTM ...

  4. 从输入 URL 到页面加载完的过程中都发生了什么---优化

    这篇文章是转载自:安度博客,http://www.itbbu.com/1490.html 在很多地方看到,感觉不错,理清了自己之前的一些思路,特转过来留作记录. 一个HTTP请求的过程 为了简化我们先 ...

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

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

  6. 【原】老生常谈-从输入url到页面展示到底发生了什么

    刚开始写这篇文章还是挺纠结的,因为网上搜索“从输入url到页面展示到底发生了什么”,你可以搜到一大堆的资料.而且面试这道题基本是必考题,二月份面试的时候,虽然知道这个过程发生了什么,不过当面试官一步步 ...

  7. 从输入url到页面加载完成发生了什么?——前端角度

    这是一道经典的面试题,这道面试题不光前端面试会问到,后端面试也会被问到.这道题没有一个标准的答案,它涉及很多的知识点,面试官会通过这道题了解你对哪一方面的知识比较擅长,然后继续追问看看你的掌握程度.当 ...

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

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

  9. 一个页面从输入url到页面加载显示完成,中间都经历了什么

    第一种解释: 一般会经历以下几个过程: 1.首先,在浏览器地址栏中输入url 2.浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容.若没有,则跳到第三步操作. 3 ...

随机推荐

  1. 从0开始编写webpack插件

    1. 前言 插件(plugins)是webpack中的一等功臣.正是由于有了诸多插件的存在,才使得webpack无所不能.在webpack源码中也是使用了大量的内部插件,插件要是用的好,可以让你的工作 ...

  2. linux 自启动 | 三种方式自启动

    linux 实现自启动有多种方式,通过Linux 底层启动原理介绍,便可以理解以下几种方式 这里简单介绍一下这几种方式 一.自定义开机程序   /etc/rc.d/rc.local  1.vim  / ...

  3. HTTP的请求方式

    GET 请求获取 Request-URI 所标识的资源POST 在 Request-URI 所标识的资源后附加新的数据HEAD  请求获取由 Request-URI 所标识的资源的响应消息报头PUT ...

  4. diff算法

    diff算法的作用计算出Virtual DOM中真正变化的部分,并只针对该部分进行原生DOM操作,而非重新渲染整个页面. 传统diff算法 通过循环递归对节点进行依次对比,算法复杂度达到 O(n^3) ...

  5. flume安装和介绍

    一.安装1.flume-ng-1.5.0-cdh5.3.6.tar.gz 下载链接:https://pan.baidu.com/s/1AWPGP2qnY6_VpYr_iSnJ3w 密码:tiog2.对 ...

  6. boost.asio新框架的设计概念总结

    1.66版本,boost.asio库重新设计了框架,目前最新版为1.71.读了几天代码后,对框架中相关概念总结.因为是泛型编程的库,所以分析的概念层的设计. 可通过boost官方文档,strand的1 ...

  7. 逆向libbaiduprotect(二)

    首先要确保你所使用的gdb和gdbserver是配对的,最好(或必须)是sdk内相同platform(api level)下的gdb和gdbserver.否则你使用的gdb可能与运行测试机上的gdbs ...

  8. bert+seq2seq 周公解梦,看AI如何解析你的梦境?【转】

    介绍 在参与的项目和产品中,涉及到模型和算法的需求,主要以自然语言处理(NLP)和知识图谱(KG)为主.NLP涉及面太广,而聚焦在具体场景下,想要生产落地的还需要花很多功夫. 作为NLP的主要方向,情 ...

  9. pwnable.kr 第一天

    1.FD 直接通过ssh连接上去,然后,看下源代码. #include <stdio.h> #include <stdlib.h> #include <string.h& ...

  10. pdf 在线预览之 pdfobject插件

    支持到ie9 可以不用安装  如果安装 npm i pdfobject 第一步:引入pdfObject包 申明一个变量 const { PDFObject } = require("../. ...