这道题应该是一个非常经典的题目,包括了HTTP、TCP连接、浏览器缓存、浏览器渲染等等。
用户输入URL后,向服务器端发起请求、如果顺利,得到网络响应之后,浏览器对资源进行解析、最后将其渲染到页面上。具体步骤如下👇

  1. 首先构建请求
  2. 查找缓存,如果命中缓存,直接使用缓存资源(包括DNS缓存)
  3. 否则进行DNS解析,将域名转换成对应的IP地址
  4. 建立TCP连接
  5. 发送HTTP请求
  6. 如果顺利得到网络响应,浏览器开始解析和渲染
  7. HTML解释器 解析HTML 为 DOM树
  8. 同时CSS解释器 解析CSS文档 为 styleSheets
  9. 创建布局树,进行布局计算
  10. 整合图层,展示页面
    我们先来分析一下HTTP请求,请求流程如下👇

    首先构建请求

    首先,浏览器构建请求行信息(如下所示),构建好后,浏览器准备发起网络请求。
    1
    GET /index.html HTTP1.1

    查找缓存

    在真正发起网络请求之前,浏览器会先在浏览器缓存中查询是否有要请求的文件。其中,浏览器缓存是一种在本地保存资源副本,以供下次请求时直接使用的技术。
    当浏览器发现请求的资源已经在浏览器缓存中存有副本,它会拦截请求,返回该资源的副本,并直接结束请求,而不会再去源服务器重新下载。
    这样做的好处有:
  11. 缓解服务器端压力,提升性能(获取资源的耗时更短了);
  12. 对于网站来说,缓存是实现快速资源加载的重要组成部分。
    当然,如果缓存查找失败,就会进入网络请求过程了。

DNS解析,将域名转换成对应的IP地址

默认端口 http为80,https为443。
DNS解析:将域名映射成对应的IP地址,这套域名映射为 IP 的系统就叫做“域名系统”,简称 DNS(Domain Name System)
DNS数据缓存服务:浏览器还提供了 DNS 数据缓存服务,如果某个域名已经解析过了,那么浏览器会缓存解析的结果,以供下次查询时直接使用,这样也会减少一次网络请求。

建立TCP连接

网络OSI七层架构(从低到高):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
计算机网络知识:HTTP在应用层,TCP在传输层,IP在网络层。
浏览器使用 HTTP 协议作为应用层协议,用来封装请求的文本信息;并使用 TCP/IP 作传输层协议将它发到网络上,所以在 HTTP 工作开始之前,浏览器需要通过 TCP 与服务器建立连接。
也就是说 HTTP 的内容是通过 TCP 的传输数据阶段来实现的,你可以结合下图更好地理解这二者的关系。

等待TCP队列:在建立TCP建立之前,可能要进入TCP队列。因为浏览器的限制,同一个域名同时最多只能建立 6 个 TCP 连接,如果在同一个域名下同时有 10 个请求发生,那么其中 4 个请求会进入排队等待状态,直至进行中的请求完成。当然如果少于6个就不用进入队列等待。
浏览器通过TCP3次握手和服务器建立连接,建立连接后进行数据传输,传输完成后,经过4次TCP握手断开连接。如下图👇

  1. TCP三次握手建立连接,http请求加上TCP头部——包括源端口号、目的程序端口号和用于校验数据完整性的序号,向下传输。
  2. 网络层在数据包上加上IP头部——包括源IP地址和目的IP地址,继续向下传输到底层。
  3. 底层通过物理网络传输给目的服务器主机,紧接着目的服务器主机网络层接收到数据包,解析出IP头部,识别出数据部分,将解开的数据包向上传输到传输层。
  4. 目的服务器主机传输层获取到数据包,解析出TCP头部,识别端口,将解开的数据包向上传输到应用层
  5. 说白就是从网络底层到高层就是对数据脱外套,相反就是穿外套。
    Connection:Keep-Alive:如果请求头里面有这个属性,数据传输完成后,不会断开TCP的。

发送HTTP请求

上面大概讲完了建立TCP连接,你可以理解TCP的连接,是为了保证浏览器跟服务器更好的通信。当然了有了上面的这个过程中, HTTP 中的数据也正是在这个通信过程中传输的。
那么我们从一张图片中来看,浏览器是如何发送信息给服务器的👇

  • 请求行请求方法请求URL HTTP协议版本
  • 请求行大概意思就是告诉服务器,我需要做上面,比如GET方法,我需要向你拿资源,POST方法通常也就是我需要向服务器提交什么数据,需要注意的就是如果是POST方法,浏览器还需要准备好数据,通过请求体发送给服务器。
  • 请求头:把浏览器的基础信息告诉服务器,比如包含了浏览器所使用的操作系统,浏览器的内核信息等,还有请求的域名信息,浏览器的Cookie信息等等。
  • 请求体:一些业务逻辑需要的数据。

得到网络响应,浏览器开始解析和渲染

我们也来看一看响应的报文吧👇

  • 响应行:HTTP协议版本 状态码,通过常见的状态码,就可以知道处理的结果。
  • 响应头:你可以理解成包含服务器自身的一些信息,比如服务器生成数据的时间,返回数据的类型(HTML,流媒体,JSON,XHTML等等)以及服务器在客户端保存的Cookie等信息。响应头中 Cache-Control 字段也很重要,这个涉及到了HTTP缓存,这个字段涵义就是设置缓存资源的时间的
  • 响应体:请求返回的内容。
    返回的状态码中有301或者302即可发生重定向;302为临时重定向,301为永久重定向。
    Content-Type:浏览器会按照这个内容类型来解析。

    HTML解释器 解析HTML 为 DOM树

    渲染进程对文档进行页面解析和子资源加载,HTML 通过HTM 解析器转成DOM Tree(二叉树类似结构的东西),CSS按照CSS 规则和CSS解释器转成CSSOM TREE,两个tree结合,形成render tree(不包含HTML的具体元素和元素要画的具体位置),通过Layout可以计算出每个元素具体的宽高颜色位置,结合起来,开始绘制,最后显示在屏幕中新页面显示出来。
    哎!,感觉后面的内容有点多,再新建一篇文章讲讲后面的内容(浏览器的渲染机制)。