HTTP
HTTP
1、概念
HyperText Transfer Protocol(超文本传输协议)
1 |
|
无状态:每个HTTP请求独立,不保存客户端的状态信息。
如何实现有状态的应用:
1 |
|
2、和TCP的关系
🌼💎TCP 连接的建立总是先于 HTTP 请求
1 |
|
特性 | TCP | HTTP |
---|---|---|
协议层 | 传输层 | 应用层 |
主要功能 | 可靠数据传输 | 定义Web资源请求/响应的格式和语义 |
连接方式 | 面向连接(三次握手) | 无连接(基于TCP连接) |
数据单位 | 数据段(segment) | 消息(message) |
面向连接:
发送方和接收方之间通过三次握手建立的逻辑通信链路
具体来说,这个连接包含以下核心要素:
- 双方需记录彼此的 IP 地址、端口号,以及传输过程中的序列号、确认号、窗口大小等状态信息(保存在各自的 TCP 连接表中)。
- 连接建立后,双方才能基于这些状态进行有序、可靠的数据传输(如通过序列号保证顺序,通过确认机制保证不丢失)。
- 连接是 “双向的”,允许双方同时发送和接收数据,且传输结束后需通过四次挥手主动关闭,释放相关状态资源。
数据分段、传输和重组:
- TCP 负责将应用层的数据(如 HTTP 请求和响应)分割成多个较小的段(TCP 报文段),每个段包含 TCP 头部和数据部分。
- 这些段通过网络传输到目标端点后,TCP 会将它们重新组合成原始的数据流,确保数据的完整性和顺序。
3、HTTP/1.1 相比 HTTP/1.0 有哪些改进?
1. 持久连接
- HTTP/1.0:每个请求/响应都需要新建和关闭一个 TCP 连接,三次握手/四次挥手开销
- HTTP/1.1:默认启用
Connection: keep-alive
,单个 TCP 连接可复用处理多个请求
2. 流水线
- HTTP/1.0:严格串行,必须等上一个请求完成才能发送下一个请求(队头阻塞)。
- HTTP/1.1:支持管道化,允许客户端无需等待响应即可发送多个请求(但服务器必须按顺序返回响应,仍存在队头阻塞问题)。
3. 分块传输编码
- HTTP/1.0:必须通过
Content-Length
提前知道响应体大小,否则无法传输动态生成的内容。 - HTTP/1.1:允许服务器将响应体分成多个块(chunks)依次发送给客户端,每个块都有自己的大小信息
4. 缓存控制增强
- HTTP/1.0:仅依赖
Expires
头控制缓存 - HTTP/1.1:新增
Cache-Control
(如max-age
、no-cache
表示资源需要在使用前验证其有效性)、ETag
、Last-Modified
等更精细的缓存策略。
5. 主机头(Host )支持
- HTTP/1.0:一个 IP 只能绑定一个域名,无法支持虚拟主机。
- HTTP/1.1:强制要求请求头包含
Host: example.com
,多个网站可以共享同一个 IP 地址(虚拟主机)。
6. 状态码扩展
- HTTP/1.0:仅支持部分状态码(如 200、404、500)。
- HTTP/1.1:新增状态码如:
100 Continue
(客户端可先发请求头,确认后再发请求体)206 Partial Content
(支持断点续传)307 Temporary Redirect
(临时重定向)
7. 带宽优化
- HTTP/1.0:不支持范围请求。
- HTTP/1.1:通过
Range
和Accept-Ranges
头支持断点续传(如大文件下载)。
8. 其他改进
新增方法:
OPTIONS
(查询服务器支持的方法)、PUT
、DELETE
、TRACE
等。1
2
3
4OPTIONS:查询服务器支持的 HTTP 方法。
PUT:上传资源到服务器,用于创建或更新资源。
DELETE:删除服务器上的资源。
TRACE:回显客户端发送的请求,用于调试。
局限性
虽然 HTTP/1.1 显著提升了性能,但仍存在:
- 队头阻塞(Head-of-Line Blocking):管道化中一个慢请求会阻塞后续请求。
- 冗余头部:每个请求都携带完整的头部(如 Cookie),未压缩。
- 并发限制:浏览器对同一域名限制 TCP 连接数(通常 6-8 个)。
4、HTTP/2 有哪些新特性
1. 二进制分帧(Binary Framing)
- HTTP/1.1:基于文本格式(明文),解析复杂且容易出错
- HTTP/2:将请求/响应分解为二进制帧(Frame),帧头包含帧的类型、长度、标志等信息,帧体包含实际的数据。
- 优势:更高效解析
2. 多路复用(Multiplexing)
- HTTP/1.1:管道化仍有队头阻塞问题,并发需多个 TCP 连接。
- HTTP/2:单个 TCP 连接上并行传输多个请求/响应,帧通过流(Stream)标识归属。每个流代表一个请求/响应对。
- 优势:
- 彻底解决队头阻塞
- 减少 TCP 连接数
3. 头部压缩(HPACK)
- HTTP/1.1:每次请求重复发送冗余头部(如 Cookie、User-Agent)。
- HTTP/2:使用 HPACK 算法压缩头部:
- 静态字典(预定义常用头部字段)
- 动态字典(缓存自定义字段)
- Huffman 编码,字段更短的二进制
4. 服务器推送(Server Push)
HTTP/1.1:客户端需主动请求所有资源(如 CSS、JS)。
HTTP/2:服务器可主动推送客户端可能需要的资源。
- 例如:请求
index.html
时,服务器直接推送style.css
。
- 例如:请求
优势:减少往返延迟(RTT),提升页面加载速度。
1
RTT:从发送方发送数据开始,到接收方返回响应数据为止的总时间。
5. 流优先级(Stream Prioritization)
- HTTP/1.1:资源加载顺序由浏览器猜测(如 CSS 优先)。
- HTTP/2:客户端可为流设置优先级和依赖关系:
- 例如:优先加载 HTML,CSS 依赖 HTML,图片优先级最低。
- 优势:优化关键渲染路径,提升用户体验。
6. 其他改进
- 流量控制:基于流的流量控制(类似 TCP 滑动窗口)。
- 更安全的默认:要求 TLS(加密)虽然不是强制,但主流浏览器只支持 HTTP/2 over HTTPS。
- 协议升级机制:通过
Upgrade
头或 ALPN(TLS 扩展)协商。
HTTP/2 的局限性
- 仍依赖 TCP:TCP 层的队头阻塞问题未解决(丢包重传会阻塞所有流)。
- 服务器推送的采用率低:难以准确预测客户端需要的资源。
5、HTTP3
- HTTP/3:基于 QUIC(Quick UDP Internet Connections)
- 运行在 UDP 之上(而非 TCP)
- 内置 **TLS **加密
- 实现可靠传输的替代方案
① 零 RTT 连接建立:在首次握手后实现零 RTT 的连接建立
② 彻底解决队头阻塞:
- HTTP/2 的局限:虽然应用层多路复用,但 TCP 层仍有队头阻塞
- HTTP/3 方案:
- 每个流(Stream)独立传输
- 单个数据包丢失只影响其所属流
③ 连接迁移
- 移动端痛点:WiFi 切 4G 需要重建 TCP 连接
- HTTP/3 方案:使用连接 ID(而非 IP+端口)标识连接,网络切换时无需重新握手
④ 前向纠错(FEC):发送冗余数据包,在丢包时无需重传即可恢复
6、HTTP缓存
强缓存(浏览器不发请求):
Cache-Control: max-age=3600
Expires
协商缓存(请求发出,看是否修改):
ETag + If-None-Match
Last-Modified + If-Modified-Since