查看原文
其他

一文读懂,关于 “ HTTP ” 那些事

前端小贾 前端学苑 2021-07-15

关注“前端学苑” ,坚持每天进步一点点


「~http的那些事~」

2015 年 HTTP/2 标准发表后,大多数主流浏览器也于当年年底支持该标准。此后,凭借着多路复用、头部压缩、服务器推送等优势,HTTP/2 得到了越来越多开发者的青睐。不知不觉的 HTTP 已经发展到了第三代,基于 UDP 协议的 QUIC 协议。而这个就是 HTTP/3,它真正“完美”地解决了“队头阻塞”问题。目前B 站 也已经接入 QUIC。很多项目也在逐渐使用 HTTP/3。

一、HTTP 历史

先简单看下 HTTP 的历史

随着网络技术的发展,1999 年设计的 HTTP/1.1 已经不能满足需求,所以 Google 在 2009 年设计了基于 TCP 的 SPDY,后来 SPDY 的开发组推动 SPDY 成为正式标准,不过最终没能通过。不过 SPDY 的开发组全程参与了 HTTP/2 的制定过程,参考了 SPDY 的很多设计,所以我们一般认为 SPDY 就是 HTTP/2 的前身


无论 SPDY 还是 HTTP/2,都是基于 TCP 的,TCP 与 UDP 相比效率上存在天然的劣势,所以 2013 年 Google 开发了基于 UDP 的名为 QUIC 的传输层协议,QUIC 全称 Quick UDP Internet Connections,希望它能替代 TCP,使得网页传输更加高效。后经 提议,互联网工程任务组正式将基于 QUIC 协议的 HTTP (HTTP over QUIC)重命名为 HTTP/3。


HTTP与 HTTPS 区别

HTTP 是明文传输协议,连接简单,是无状态的。

HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。

HTTP 是未经安全加密的协议,它的传输过程容易被攻击者监听、数据容易被窃取、发送方和接收方容易被伪造;

HTTPS 是安全的协议,它通过 密钥交换算法 - 签名算法 - 对称加密算法 - 摘要算法 能够解决上面这些问题。

注:HTTP 的默认端口是 80,而 HTTPS 的默认端口是 443。


二、HTTP/1.1,HTTP/2 和 HTTP/3

1、HTTP1.1 的缺陷

1)队头阻塞

队头阻塞是指当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据。

2)无状态特性

无状态是指协议对于连接状态没有记忆能力。纯净的 HTTP 是没有 cookie 等机制的,每一个连接都是一个新的连接。上一次请求验证了用户名密码,而下一次请求服务器并不知道它与上一条请求有何关联,换句话说就是掉登录态。

3)不安全性

传输内容没有加密,中途可能被篡改和劫持。

4)SPDY 协议

SPDY 是由 google 推行的改进版本的 HTTP1.1 (那时候还没有 HTTP2)。

特性:

多路复用 — 解决队头阻塞

SPDY 允许在一个连接上无限制并发流。因为请求在一个通道上,TCP 效率更高(参考 TCP 拥塞控制 中的慢启动)。更少的网络连接,发出更密集的包。

头部压缩 — 解决巨大的 HTTP 头部

使用专门的 HPACK 算法,每次请求和响应只发送差异头部,一般可以达到 50% ~90% 的高压缩率。

请求优先级 — 先获取重要数据

虽然无限的并发流解决了队头阻塞的问题,但如果带宽受限,客户端可能会因防止堵塞通道而阻止请求。在网络通道被非关键资源堵塞时,高优先级的请求会被优先处理。

服务端推送 — 填补空缺

服务端推送(ServerPush),可以让服务端主动把资源文件推送给客户端。当然客户端也有权利选择是否接收。

提高安全性

支持使用 HTTPS 进行加密传输。


2、HTTP/2

HTTP/2 基于 SPDY,专注于性能,最大的一个目标是在用户和网站间只用一个连接

新增特性:

1)二进制分帧 - HTTP2 性能增强的核心

首先,HTTP2 没有改变 HTTP1 的语义,只是在应用层使用二进制分帧方式传输。因此,也引入了新的通信单位:帧、消息、流。

分帧有什么好处?服务器单位时间接收到的请求数变多,可以提高并发数。最重要的是,为多路复用提供了底层支持。


2)多路复用 - 解决串行的文件传输和连接数过多

一个域名对应一个连接,一个流代表了一个完整的请求-响应过程。帧是最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。多路复用,就是在一个 TCP 连接中可以存在多个流。


HTTP2 的缺陷

1)TCP 以及 TCP+TLS 建立连接的延时

2)TCP 的队头阻塞并没有彻底解决

3)多路复用导致服务器压力上升

4)多路复用容易 Timeout


3、HTTP/3

Google在推 SPDY 的时候就已经意识到了这些问题,于是就另起炉灶搞了一个基于 UDP 协议的 QUIC 协议。而这个就是 HTTP3。它真正“完美”地解决了“队头阻塞”问题。

主要特点

1)改进的拥塞控制、可靠传输

2)快速握手

3)集成了 TLS 1.3 加密

4)多路复用

5)连接迁移


TCP VS UDP 对比:

TCP 是面向连接的协议

UDP 是无连接的协议

TCP 在发送数据前先需要建立连接,然后再发送数据

UDP 无需建立连接就可以直接发送大量数据

TCP 会按照特定顺序重新排列数据包

UDP 数据包没有固定顺序,所有数据包都相互独立

TCP 传输的速度比较慢

UDP 的传输会更快

TCP 的头部字节有 20 字节

UDP 的头部字节只需要 8 个字节

TCP 是重量级的,在发送任何用户数据之前,TCP需要三次握手建立连接。

UDP 是轻量级的。没有跟踪连接,消息排序等。

TCP 会进行错误校验,并能够进行错误恢复

UDP 也会错误检查,但会丢弃错误的数据包。

TCP 有发送确认

UDP 没有发送确认

TCP 会使用握手协议,例如 SYN,SYN-ACK,ACK

无握手协议

TCP 是可靠的,因为它可以确保将数据传送到路由器

在 UDP 中不能保证将数据传送到目标。

三、 HTTP 速度测试

前端小贾有话说

我们首先分析了HTTP/2中所存在的一些问题,主要包括了TCP的队头阻塞、建立TCP连接的延时、TCP协议僵化等问题。

这些问题都是TCP的内部问题,因此要解决这些问题就要优化TCP或者“另起炉灶”创造新的协议。由于优化TCP协议存在着诸多挑战,所以官方选择了创建新的QUIC协议。


HTTP/3正是基于QUIC协议的,可以把QUIC看成是集成了“TCP+HTTP/2的多路复用+TLS等功能”的一 套协议。这是集众家所长的一个协议,从协议最底层对Web的文件传输做了比较彻底的优化,所以等生态相对成熟时,可以用来打造比现在的HTTP/2还更加高效的网络。


虽说这套协议解决了HTTP/2中因TCP而带来的问题,不过由于是改动了底层协议,所以推广起来还会面临 着巨大的挑战。关于HTTP/3的未来有下面两点判断:

1)从标准制定到实践再到协议优化还需要走很长一段路;

2)因为动了底层协议,所以HTTP/3的增长会比较缓慢,这和HTTP/2有着本质的区别。

思考总结:HTTP/3都做了哪些性能上的改进?它所面临的挑战又是什么?

觉得本文对你有帮助?请分享给更多人

关注「前端学苑」加星标,提升前端技能

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存