1.HTTP 1.x
HTTP 请求构建
浏览器将域名发送给 DNS 服务器,让它解析为 IP 地址。HTTP 是基于 TCP 协议的,所以要先建立 TCP 连接(三次握手四次挥手)。
HTTP 报文分为三大部分:请求行,首部,正文实体。
请求行中常用的请求方法有几种类型:
- GET 去服务器获取资源。
- POST 发送信息给服务器。
- PUT 向指定资源上传最新内容。
- DELETE 删除资源。
- 还有 HEAD TRACE OPTIONS CONNECT 其他请求方法。
首部(请求报头)字段是以 key value 通过冒号分隔。(Accept-Charset,Content-Type,Cache-control 等)
HTTP 返回构建
- 在接收和解释请求消息后,服务器返回一个HTTP响应消息。
- HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
HTTP/1.x 的缺陷
HTTP是建立在TCP协议之上,所以瓶颈在TCP协议本身:
- 连接无法复用:导致每次请求都经历三次握手和慢启动。
- Head-Of-Line Blocking(HOLB):导致带宽无法被充分利用,以及后续健康请求被阻塞。
- 协议开销大:header里携带的内容过大,在一定程度上增加了传输的成本,并且每次请求header基本不怎么变化,尤其在移动端增加用户流量。
- 安全因素:内容明文传输,客户端和服务器端都无法验证对方的身份,这在一定程度上无法保证数据的安全性。
2.HTTP 2.0
因为HTTP/1.x的问题,我们会引入雪碧图、将小图内联、使用多个域名等等的方式来提高性能。不过这些优化都绕开了协议,直到谷歌的 SPDY 协议,主要解决HTTP/1.1效率不高的问题。降低延迟,压缩header等等,最终带来HTTP/2的诞生。
- HTTP 2.0 的头进行一定的压缩,将原来每次都要携带的大量 key value 在两端建立一个索引表,对相同的头只发送索引表中的索引。
- HTTP 2.0 还将所有的传输信息分割为更小的消息和帧,并对它们采用二进制格式编码。
- HTTP 2.0 其实是将三个请求变成三个流,将数据分成帧乱序发送到一个 TCP 连接中。
- HTTP 2.0 成功解决了 HTTP 1.1 的队首阻塞问题。
- HTTP 2.0 新特性:二进制传输,多路复用,Header 压缩,Server Push 。(多路复用)
3.HTTP 3.0
QUIC 新功能
由于TCP与丢包问题,Google 搞了一个基于 UDP 协议的 QUIC 协议,在原本的基础上新增了很多功能,并且使用在了 HTTP/3 上。
0-RTT
通过使用类似 TCP 快速打开的技术,缓存当前会话的上下文,在下次恢复会话的时候,只需要将之前的缓存传递给服务端验证通过就可以进行传输了。0RTT 建连可以说是 QUIC 相比 HTTP2 最大的性能优势。传输层(加密层) 0RTT 就能建立(加密)连接。
由于建立在 UDP 的基础上,同时又实现了 0RTT 的安全握手,所以在大部分情况下,只需要 0 个 RTT 就能实现数据发送,在实现前向加密的基础上,并且 0RTT 的成功率相比 TLS 的会话记录单要高。
多路复用
与HTTP2.0一样,同一条 QUIC连接上可以创建多个stream,来发送多个HTTP请求,但QUIC是基于UDP的,一个连接上的多个stream之间没有依赖。无需等待,就可以发给用户。
加密认证的报文
TCP 协议头部没有经过任何加密和认证,所以在传输过程中很容易被中间网络设备篡改、注入和窃听。比如修改序列号、滑动窗口。这些行为有可能是出于性能优化,也有可能是主动攻击。
除了个别报文比如 PUBLIC_RESET 和 CHLO,所有报文头部都是经过认证的,报文 Body 都是经过加密的。
这样只要对 QUIC 报文任何修改,接收端都能够及时发现,有效地降低了安全风险。
向前纠错机制
每个数据包除了它本身的内容之外,还包括了部分其他数据包的数据,因此少量的丢包可以通过其他包的冗余数据直接组装而无需重传。
向前纠错牺牲了每个数据包可以发送数据的上限,但是减少了因为丢包导致的数据重传,因为数据重传将会消耗更多的时间(包括确认数据包丢失、请求重传、等待新数据包等步骤的时间消耗)。
假如说这次我要发送三个包,那么协议会算出这三个包的异或值并单独发出一个校验包,也就是总共发出了四个包。当出现其中的非校验包丢包的情况时,可以通过另外三个包计算出丢失的数据包的内容。当然这种技术只能使用在丢失一个包的情况下,如果出现丢失多个包就不能使用纠错机制了,只能使用重传的方式了。
4.HTTPS 协议
HTTP 协议通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,内容可能被篡改。
加密与数字证书
对称加密算法中,使用的密钥是相同的。在互联网应用中,用户太多,这样是不行。
非对称加密算法中,使用的密钥是不相同的。客户端与服务器分别用对方的公钥加密,用自己的私钥解密。
非对称加密的问题在于如何将公钥传给对方,这时就需要权威部门介入,颁发数字证书。
数字证书的签名算法,取得信息的Hash值(不可逆),加密Hash值,签名与信息一起发出去。
你从访问的网站得到一个证书,从证书发布机构CA得到公钥,再用公钥解密证书签名。
确定CA公钥的可靠性,CA通过上级证书层层授信背书到 root CA,保证了非对称加密正常运转。
HTTPS的工作模式
这是HTTPS协议的总体思路:
总结:
- HTTP1.x 有连接无法复用、队头阻塞、协议开销大和安全因素等多个缺陷。
- HTTP2 通过多路复用、二进制流、Header 压缩等技术,极大地提高了性能,但是还是存在着问题。
- QUIC 基于 UDP 实现,是 HTTP3 中的底层支撑协议,该协议基于 UDP,又取了 TCP 中的精华,实现了即快又可靠的协议。
Reference:
https://github.com/i5ting/oh-http