从输入 URL 到浏览器显示页面发生了什么?
强缓存 200 from cache 直接从本地缓存中获取响应
Pragma
HTTP1.0时代的遗留产物, 该字段被设置为 no-cache 时, 会告知浏览器禁用本地缓存, 即每次都向服务器发送请求Expires
HTTP1.0时代用来启用本地缓存的字段, expires 值对应一个形如 Thu, 31 Dec 2037 23:55:55 GMT 的格林威治时间, 如果还没有到该时刻, 标明缓存有效, 无需发送请求受限于本地时间
Cache-Control
HTTP1.1针对 Expires 问题的解决方案, 使用 Cache-Control 告诉浏览器缓存过期的时间间隔而不是时刻- public: 可以被所有用户缓存,包括终端和CDN等中间代理服务器
- private: 只能被终端浏览器缓存
- no-cache: 不允许直接使用本地缓存, 先发起请求和服务器协商
- no-store: 禁止浏览器缓存响应, 不使用强缓存和协商缓存
- max-age = 30: 本地缓存 30s
优先级:
Pragma > Cache-Control > Expires
协商缓存 304 Not Modified
Last-Modified
通知浏览器资源的最后修改时间If-Modified-Since
得到资源的最后修改时间后, 浏览器会将这个信息通过 If-Modified-Since 提交到服务器做检查
HTTP1.1推出: 文件的指纹标识符, 如果文件内容修改, 指纹会改变
ETag
W/“5fc-15cc33b8d98”If-None-Match
W/“5fc-15cc33b8d98”
优先级:
ETag > Last-Modified
DNS 域名解析
- 首先会在本地缓存中查询 IP(浏览器缓存 系统缓存 路由缓存)
- 再去系统配置的 DNS 服务器中查询(运营商各级缓存 traceRoute)
- 还没找到则会去 DNS 根服务器查询
- 找到 com 这个
一级域名
的服务器 - 然后去该一级域名服务器查询 daidaibo
二级域名
- 找到 com 这个
- 接下来
三级域名
的查询是自己配置的,可以给 www 这个域名配置一个 IP,也可以给别的三级域名配置一个 IP
以上是 DNS迭代查询
方式,还有一种是递归查询
- 迭代查询是由客户端去做请求
- 递归查询是由系统配置的 DNS 服务器做请求,得到结果后将数据返回给客户端
DNS 是基于 UDP 做的查询
TCP 三次握手
CDN 静态加速、Nginx 负载均衡
HTTP 状态码
4xx 5xx
报错
3xx
重定向,这里会有个重定向计数器,避免过多次的重定向,超过次数也会报错
200 ok 没有用到缓存
- 服务端会响应一个 HTML 文件
- 浏览器开始解析文件,如果是 gzip 格式会先解压,然后通过文件的编码格式去解码文件
HTML 文件
- 网络传输过程中的二进制数据
- 浏览器接收后
转码
成字符串 - 再通过词法
parse
为Token - Token紧接着
构建
成Node - Node之间关联
生成
DOM树
字节流 -> 字符串 -> Token -> Node -> DOM Tree
CSS 文件
字节流 -> 字符串 -> Token -> Node -> CSSOM Tree
阻塞渲染
HTML
1 | <!-- DNS 预解析 --> |
CSS
优化选择器从右往左解析选择器
JS
- <script
defer
src=”xxx.js”>异步并行下载,HTML 解析完成后执行,执行的顺序按声明顺序来 - <script
async
src=”xxx.js”>异步并行下载,加载完立即执行,不适用于有先后依赖关系的 JS 文件
Attachment
Layout 布局
Reflow 回流 / 重排
- 页面首次渲染
- 浏览器窗口大小发生变化
- 元素尺寸或位置发生变化
- 字体大小变化
- 在页面中添加或删除某个元素
Repaint 重绘
重排必然会引起重绘
- 集中修改样式,或直接使用
class
- DOM 操作前先使用
display: none
脱离文档流 - 使用
BFC
,不影响外部的元素 - 对于频繁触发的操作(
resize
scroll
等)使用节流
和防抖
- 使用
createDocumentFragment
进行批量 DOM 操作 - 优化动画,使用
requestAnimationFrame
或者CSS3
(GPU 加速)- transform
- opacity
- 将频繁重绘或者回流的节点设置为
图层
,图层能够阻止该节点的渲染行为影响别的节点- will-change: transform;
- video、iframe 标签
总结:Cache缓存–DNS解析–TCP连接–HTTP请求–Waiting Response–Parse资源–Render页面
OSI 参考模型
名称 | 说明 | 设备 | 协议 |
---|---|---|---|
应用层 | 为应用程序提供服务,面向用户报文 |
计算机 | HTTP、Socket、Telnet、SSH、FTP、 SMTP、SNMP、POP3、DNS |
表示层 | 数据格式转换、数据编码、数据加密、解压缩 | ||
会话层 | 建立、管理和维护会话,寻址,Session层流量控制,错误控制 | SSL/TLS | |
传输层 | 建立、管理和维护端到端的连接,传输差错校验,流量拥塞控制数据段 |
防火墙 | TCP、UDP |
网络层 | IP选址及路由选择数据包 |
路由器 | IP |
数据链路层 | 提供介质访问和链路管理数据帧 |
交换机 | ARP、RARP |
物理层 | 利用传输介质提供物理连接比特流 |
网 卡 |
TCP/IP 协议
名称 | 协议 |
---|---|
应用层 | HTTP |
传输层 | TCP |
网际层 | IP |
网络接口层 | 以太网驱动程序 |
TCP 有状态
- TCP 传输控制协议
面向连接
的可靠传输
- 拥塞控制 流量控制
- 一对一
- 面向字节流
- 首部 最少20字节 最多60字节
- 适用于稳定性高的场景:文件传输
UDP
用户数据协议 无连接的不可靠传输- 一对一、一对多、多对多
- 面向IP报文
- 首部开销8字节
- 适用于时效性高的场景:音视频会议
三次握手
Client | Service |
---|---|
hello | |
hello | |
ok |
保证双方都可以正常地发送和接收请求
四次挥手
Client | Service |
---|---|
我好了 | |
等一等 | |
我也好了 | |
拜拜 |
HTTP 无状态
HTTP 报文
- 请求报文: 请求行 请求头 空行 请求体
请求行
请求方法 + URL + 协议版本 + 回车符 换行符GET /index.html HTTP/1.1
- 响应报文: 响应行 响应头 空行 响应体
状态行
协议版本 + 状态码 + 状态码短语 + 回车符 换行符HTTP/1.1 200 OK
HTTP 状态码
- 1xx 消息
- 2xx 成功
200 OK
请求成功,表示从客户端发来的请求在服务器端被正确处理- 201 Created 创建成功,请求已经被实现,而且有一个新的资源已经依据请求的需要而建立
- 202 Accepted 更新成功,请求已接受,但是还没执行,不保证完成请求
- 204 No content 删除成功,表示请求成功,但响应报文不含实体的主体部分
- 205 Reset Content,表示请求成功,但响应报文不含实体的主体部分,但是与 204 响应不同在于要求请求方重置内容
206 Partial Content
,进行范围请求
- 3xx 重定向
301 Moved Permanently,永久性重定向
,表示资源已被分配了新的 URL302 Found,临时性重定向
,表示资源临时被分配了新的 URLhttp1.0
- 303 See Other,临时重定向,和 302 含义类似,但是期望客户端使用 GET 方法向新的地址发出请求
http1.1
304 Not Modified 协商缓存
- 307 Temporary Redirect,临时重定向,和 302 含义类似,但是期望客户端保持请求方法不变向新的地址发出请求
http1.1
- 308 Permanent Redirect 保持原始请求方法永久重定向
- 4xx 客户端错误
400 Bad Request
,请求报文存在语法错误- 401 Unauthorized,表示发送的请求需要有通过 HTTP 认证的信息
403 Forbidden
,表示对请求资源的访问被服务器拒绝404 Not Found
,表示在服务器上没有找到请求的资源- 408 Request Timeout,客户端请求超时
- 409 Conflict,请求的资源可能引起冲突
- 413 Required Length Too Large,上传的文件体积太大
- 5xx 服务器错误
500 Internal Sever Error
,内部服务器错误- 501 Not Implemented,请求超出服务器能力范围,例如服务器不支持当前请求所需要的某个功能,或者请求是服务器不支持的某个方法
- 503 Service Unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
- 505 Http Version Not Supported,服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本
HTTP 1.0
最基础的 HTTP 协议
HTTP 1.1
- 引入更多的缓存策略,如
cache-control
ETag
长链接
,默认开启Connection: keep-alive
,减少 TCP 重连次数(并发多个请求需要多个 TCP 连接,限制6~8
个)管线化
,请求与请求间并行,但响应仍是串行的- 只有 GET 和 Head 请求可以管线化,而 POST 则有所限制
断点续传
,状态码206
- 新增 Method
PUT
DELETE
等,可以设计 Restful API
HTTP 2.0
- 二进制分帧 👈核心
- 在 HTTP 1.x 中,数据以
文本
的格式进行传输,解析起来比较低效 - HTTP 2.0 在传输消息时,会将消息划分为更小的消息和
帧
,然后再对其采取二进制
格式的编码,确保高效的解析
- 在 HTTP 1.x 中,数据以
- Header 压缩,只发送差异数据,以减少体积
多路复用
- 实现真正的并行请求(管线化的问题)
- 同域名只通过一个 TCP 连接就可以传输所有的请求数据,也间接实现全速传输,每新开一个 TCP 连接都需要
慢启动
- HTTP/1 浏览器限制了一个域名下同时请求的数量,雪碧图、Base64、使用多个域名等优化将变得多余
服务器端推送
- 服务端可以在发送⻚面 HTML 时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 时再发送这些请求
- 服务端可以主动推送,客户端也有权利选择是否接收。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送 RST_STREAM 帧来拒收。主动推送也遵守同源策略,服务器不会随便推送第三方资源给客户端
HTTP 3.0
HTTP/2 使用了多路复用,一般来说同一域名下只需要使用一个 TCP 连接。当这个连接中出现了丢包的情况,那就会导致 HTTP/2 的表现情况反倒不如 HTTP/1 了
在出现丢包的情况下,整个 TCP 都要开始等待重传,也就导致了后面的所有数据都被阻塞了
但是对于 HTTP/1 来说,可以开启多个 TCP 连接,出现这种情况反倒只会影响其中一个连接,剩余的 TCP 连接还可以正常传输数据
HTTPS
HTTP + SSL/TLS = HTTPS
SSL 被标准化改名为 TLS
- HTTPS 还是通过了 HTTP 来传输信息,但是信息通过 TLS 协议进行了加密
- TLS 协议位于传输层之上,应用层之下的会话层
- 在 TLS 中使用了两种加密技术,分别为:
对称加密
和非对称加密