在地址栏输入URL后按下回车,会发生那些事情?
在浏览器中输入URL到页面加载完成的过程中,涉及到了一系列复杂的HTTP技术及流程,主要包括以下步骤:
1.1 URL检测
- 作用:检查和纠错
- 当在浏览器中输入一个URL比如
baidu.com
时,浏览器首先解析用户输入的URL,补全协议、主机名、路径、端口
- 地址栏中写入一些中文会进行转义ascii码
1.2 DNS解析
缓存查找过程:
- 浏览器缓存:⾸先,浏览器会检查它的缓存中是否有这个域名的记录,因为之前访问过的⽹址的解析结果可能会被存储在浏览器缓存中
- 操作系统缓存:如果浏览器缓存中没有找到,浏览器会询问操作系统,因为操作系统也可能有⾃⼰的DNS缓存
- 路由器缓存:如果操作系统中也没有找到,请求会发送到本地⽹络的路由器,它同样可能有⾃⼰的DNS缓存
- ISP(Internet service provider)缓存:如果以上都没有缓存记录,请求最终会发送到你的互联⽹服务提供商(ISP),它们通常会有更⼤范围的DNS缓存
DNS递归解析:
如果所有本地缓存查找都失败,DNS查询就变成了⼀个递归查询过程,涉及到多个DNS服务器:
- 根域名服务器:⾸先,你的DNS查询会被发送到根域名服务器。根服务器是最⾼级别的DNS服务器,负责重定向到负责管理顶级域名(如.com、.net等)的顶级域名服务器
- 顶级域名服务器(TLD服务器):根服务器会告诉你的ISP的DNS服务器去查询哪个顶级域名服务器来找到.com 域的信息。这个服务器掌握所有.com 域名及其相应服务器的信息
- 权威域名服务器:⼀旦你的DNS查询到达了正确的顶级域名服务器,它会进⼀步定向到负责example.com的权威服务器。权威服务器有该域名对应的具体IP地址
IP地址的获取:
缓存结果:⼀旦IP地址被找到,它通常会被存储在浏览器、操作系统、路由器或ISP的DNS缓存中,以便未来的查询可以更快得到解析
1.3 建立TCP连接
-
虽然我们是发送的HTTP请求,但是HTTP协议是应⽤层协议,它是建⽴在TCP传输层协议之上的,所以我们需要先进⾏TCP连接。
-
TCP的连接会经常三次握⼿,客户端发送SYN包,服务器接收到后返回⼀个SYN-ACK包,客户端再次发送⼀个ACK包,完成握⼿过程。
-
此时TCP连接建⽴完成,双⽅就可以开始传输数据了。
1.4 准备请求
1.5 发送HTTP请求
1.6 服务器处理请求
- 路由解析:服务器根据URL路径解析请求,决定由哪个后端服务或脚本来处理。
- 处理:服务器处理请求,
- 可能涉及数据库查询(mysql/redis)
- 也可能是一个BFF层、也可能是后端服务器,也可能是一个微服务架构,也可能是一个反向代理
- 也可能是文件读取、业务逻辑处理等操作。
- 响应:服务器处理完成后,构造HTTP响应报文,包括状态码(如200表示成功)、响应头(如Content-Type、Set-Cookie等)和响应体(如HTML页面、图片数据、JSON数据等)。
1.7 接收响应
- 浏览器接收服务器返回的HTTP响应,分为两步先解析响应头后解析响应体
- 首先处理响应头:对Cookie进行处理,对content-type(服务器发送过来的是什么东西,图片、网页、css等等)进行处理,对缓存进行一些处理,对状态码(302进行重定向,500错误处理)进行处理
- 处理响应体:收到多少内容处理多少内容(比如大的图片就是先显示上面的,后显示下面的图片),比如处理html::
1.8 渲染页面
- 第一步解析html
- 解析过程中遇到css就解析css,遇到js就解析js
- 解析完之后就会得到DOM树和CSSOM树,浏览器的默认样式、内部样式、外部样式、行内样式均包含在CSSOM树中
- 第二步样式计算
- 为树中的每个节点计算出来最终的样式,比如说样式的优先级,比如说
red
转换为rgb(255,0,0)
,比如说相对单位em
会变为px
- 这一步之后就会得到一颗带有样式的DOM树
- 第三步布局
- 布局阶段会依次遍历DOM额每个节点,计算每个节点的几何信息,例如宽高相对位置等等
- 第四步分层
- 主线程会使用一套复杂的策略来对整个布局树进行分层
- 分层的好处在于,将来改变的时候只是对这一层进行修改
- 第五步绘制
- 为每个层进行绘制,完成绘制后,将每个图层的绘制信息交给合成线程,剩下的工作由合成线程完成
- 合成线程会将每个图层划分为更新的区域,然后从线程池中拿取多个线程来完成分块工作
- 第六步光栅化
- 合成线程将块信息交给GPU来处理,以极高的速度完成光栅化
- GPU会开启多个线程来完成光栅化,并且优先处理靠近视口的块
- 光栅化的结果,就是一块一块的位图
- 第七步画
-
合成线程拿到了每个层每个块的位图,生成一个个指引的信息
-
指引信息会标识出每个位图所在屏幕的位置,是否旋转、缩放等等
-
然后交给GPU处理,完成最终的屏幕成像
1.9 连接管理
数据已经传输完毕后,根据实际的情况(connection:keep-alive)是否断开连接:四次挥手
1.9 页面交互
- 页面加载完成后,用户可以与页面交互,触发更多HTTP请求,如Ajax请求,此过程可能重复上述部分步骤。
以上流程概括了从输入URL到页面完全加载完成涉及的主要HTTP技术和流程,展示了浏览器与服务器间复杂的交互和数据交换过程。