Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
TieMuZhen opened this issue Mar 14, 2022 · 0 comments

Comments

@TieMuZhen
Copy link
Owner

TieMuZhen commented Mar 14, 2022

一、简单分析

简单的分析,从输入URL到回车后发生的行为如下:

  • URL解析
  • DNS 查询
  • TCP 连接
  • HTTP 请求
  • 响应请求
  • 页面渲染

二、详细分析

URL解析

首先判断你输入的是一个合法的URL还是一个待搜索的关键词,并且根据你输入的内容进行对应操作

URL的解析第过程中的第一步,一个url的结构解析如下:

DNS查询

在之前文章中讲过DNS的查询,这里就不再讲述了

整个查询过程如下图所示:

最终,获取到了域名对应的目标服务器IP地址

TCP连接

在之前文章中,了解到tcp是一种面向有连接的传输层协议

在确定目标服务器服务器的IP地址后,则经历三次握手建立TCP连接,流程如下:

发送 http 请求

当建立tcp连接之后,就可以在这基础上进行通信,浏览器发送http请求到目标服务器

请求的内容包括:

  • 请求行
  • 请求头
  • 请求主体

响应请求

当服务器接收到浏览器的请求之后,就会进行逻辑操作,处理完成之后返回一个HTTP响应消息,包括:

  • 状态行
  • 响应头
  • 响应正文

在服务器响应之后,由于现在http默认开始长连接keep-alive,当页面关闭之后,tcp链接则会经过四次挥手完成断开

注意

为什么数据传输是用对称加密?

公钥加密数据速度太慢,系统消耗大。对称加密算法性能是非对称的1000倍这个数量级,而 http 的应用场景中通常端与端之间存在大量的交互,非对称加密的效率是无法接受的。

另外:在 HTTPS 的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以HTTPS 中内容传输加密采取的是对称加密,而不是非对称加密。

页面渲染

当浏览器接收到服务器响应的资源后,首先会对资源进行解析:

  • 查看响应头的信息,根据不同的指示做对应处理,比如重定向,存储cookie,解压gzip,缓存资源等等
  • 查看响应头的Content-Type的值,根据不同的资源类型采用不同的解析方式

关于页面的渲染过程如下:

  • 解析HTML,构建DOM
  • 解析CSS,生成CSS规则树
  • 合并DOM树和CSS规则,生成render
  • 布局render树(Layout / reflow),负责各元素尺寸、位置的计算
  • 绘制render树(paint),绘制页面像素信息
  • 浏览器会将各层的信息发送给GPUGPU会将各层合成( composite ),显示在屏幕上

参考文献

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant