### HTTP的发展历史及各版本的差异点
HTTP/0.9
- **发布时间**:1991年
- **特点**:
- 最初的HTTP协议版本,非常简单。
- 只支持GET方法,不支持请求头和响应头。
- 响应仅为纯文本,无法传输图片、音频等多媒体资源。
- 通过TCP连接请求一个资源后立即关闭连接。
HTTP/1.0
- **发布时间**:1996年(RFC 1945)
- **特点**:
- 支持更多的请求方法,如POST、HEAD等。
- 引入了HTTP头部,支持传输更多的元数据。
- 支持多种内容类型,通过`Content-Type`头部进行标识。
- 每次请求/响应都会建立和关闭一个TCP连接,效率较低。
HTTP/1.1
- **发布时间**:1997年(RFC 2068),1999年更新(RFC 2616),2014年进一步更新(RFC 7230-7235)
- **特点**:
- 连接复用(Persistent Connection):默认使用持久连接(Keep-Alive),在同一个TCP连接上可以进行多个请求和响应,减少了连接的开销。
- 支持管道化(Pipelining):允许在一个连接中同时发送多个请求,尽管响应仍然按顺序返回。
- 增加了许多新的头部字段,如`Host`、`If-Modified-Since`、`Range`等,支持更丰富的功能。
- 增强了缓存机制,支持分块传输编码(Chunked Transfer Encoding),可以逐步传输响应内容。
- 支持内容协商(Content Negotiation),客户端和服务器可以就内容的格式进行协商。
连接复用(Persistent Connections)
在HTTP/1.0中,每次请求/响应都需要建立一个新的TCP连接,这种方式效率较低。在HTTP/1.1中,引入了连接复用(也叫持久连接)的概念,默认启用了持久连接,即一个TCP连接可以用于多个请求和响应,不需要每次都重新建立和关闭连接。持久连接通过在头部字段中加入Connection: keep-alive
来实现。
意义
- 减少延迟:复用连接减少了频繁建立和关闭TCP连接的开销,从而降低了延迟。
- 节省资源:减少了服务器和客户端资源的消耗,因为建立和关闭连接需要额外的计算资源和网络资源。
管道化(Pipelining)
概念
管道化是HTTP/1.1的一个特性,允许客户端在同一个TCP连接上发送多个HTTP请求,而不必等待前一个请求的响应到达后再发送下一个请求。
实现和问题
- 实现:客户端可以在第一个请求的响应返回之前,继续发送后续的请求。服务器按照请求的顺序依次处理并返回响应。
- 问题:虽然管道化可以提高效率,但如果前面的请求处理时间较长,后面的请求会被阻塞,出现队头阻塞(Head-of-line blocking)问题。由于这个原因,管道化并未得到广泛使用和支持。
HTTP/2
- **发布时间**:2015年(RFC 7540)
- **特点**:
- 二进制分帧层:HTTP/2将HTTP消息分割成更小的帧,并在传输层进行二进制编码,而不是HTTP/1.x的纯文本格式。
- 多路复用(Multiplexing):在一个TCP连接上同时发送多个请求和响应,消除了HTTP/1.x中的队头阻塞问题。
- 头部压缩(Header Compression):使用HPACK算法对头部进行压缩,减少了头部数据的传输开销。
- 服务器推送(Server Push):服务器可以在客户端请求之前推送资源,从而提高性能。
- 流量优先级(Stream Prioritization):客户端可以为请求设置优先级,服务器可以根据优先级进行资源分配。
HTTP/2中的多路复用(Multiplexing)
概念
多路复用是HTTP/2中的一个核心特性,它通过在一个TCP连接上同时处理多个请求和响应,彻底解决了HTTP/1.1中的队头阻塞问题。
实现
- 二进制分帧:HTTP/2将HTTP消息分割成更小的帧(Frame),并在传输层进行二进制编码,而不是HTTP/1.x的纯文本格式。
- 流:每个请求/响应对被分配一个唯一的流(Stream ID)。多个流可以在同一个TCP连接上并行传输,不需要按顺序处理。
- 优先级:每个流可以有优先级,服务器可以根据优先级分配资源。
优点
- 消除队头阻塞:多路复用允许在同一个连接上并行处理多个请求和响应,不受前一个请求的处理时间影响。
- 提高传输效率:二进制分帧和头部压缩(HPACK算法)进一步减少了数据传输的开销。
http1.1里管道化与多路复用的区别
-
顺序处理 vs 并行处理:
- 管道化:在同一个TCP连接上顺序发送多个请求,但响应也必须按顺序返回。如果某个请求处理时间长,后续请求会被阻塞。
- 多路复用:在同一个TCP连接上并行处理多个请求和响应,不受顺序影响,消除了队头阻塞问题。
-
实现方式:
- 管道化:基于HTTP/1.1的文本协议,要求客户端按照顺序发送请求,服务器按顺序返回响应。
- 多路复用:基于HTTP/2的二进制协议,通过流ID标识请求和响应,允许在一个连接上同时处理多个流。
-
性能:
- 管道化:提升有限,受队头阻塞影响较大。
- 多路复用:显著提升,消除队头阻塞,并且通过二进制分帧和头部压缩提高了传输效率。
综述
- 连接复用:HTTP/1.1中引入,通过持久连接减少频繁建立和关闭TCP连接的开销。
- 管道化:HTTP/1.1中的特性,允许顺序发送多个请求,但受队头阻塞影响。
- 多路复用:HTTP/2中的核心特性,通过二进制分帧和流的概念,在同一个TCP连接上并行处理多个请求和响应,彻底解决队头阻塞问题,提高了传输效率和性能。
HTTP/3
- **发布时间**:2020年(草案阶段,IETF QUIC工作组)
- **特点**:
- 基于QUIC协议:HTTP/3运行在QUIC协议之上,而不是传统的TCP协议。QUIC是一种基于UDP的传输层协议,提供更快的连接建立和恢复。
- 改进的多路复用:在HTTP/2的多路复用基础上进一步优化,消除了TCP中的队头阻塞问题。
- 更低的延迟:通过更快速的握手过程和连接迁移功能,提高了传输效率和可靠性。
- 集成了TLS 1.3:内置加密,简化了安全连接的建立过程。
HTTP和HTTPS的区别
协议层次
- **HTTP**:运行在TCP协议之上,默认端口是80。
- **HTTPS**:运行在SSL/TLS协议之上,再在其上运行HTTP,默认端口是443。
安全性
- **HTTP**:数据以明文形式传输,存在被窃听、篡改和伪装的风险。
- **HTTPS**:通过SSL/TLS对数据进行加密传输,确保数据的保密性、完整性和真实性。
性能
- **HTTP**:不进行加密和解密处理,性能开销较小。
- **HTTPS**:由于加密和解密操作,性能开销较大,但通过硬件加速和协议优化,可以减小性能影响。
使用场景
- **HTTP**:适用于对安全性要求不高的场景,如公共信息的查询、静态资源的加载等。
- **HTTPS**:适用于对安全性要求较高的场景,如登录认证、在线支付、敏感数据传输等。
综述
- **HTTP/0.9**到**HTTP/3**:随着版本的升级,HTTP协议在功能、性能、安全性等方面得到了显著提升。
- **HTTPS**:在HTTP的基础上通过SSL/TLS提供了安全的通信保障,是现代互联网中广泛使用的安全通信协议。