HTTP

HTTP

img

1、概念

HyperText Transfer Protocol(超文本传输协议)

1
基于 TCP,无状态,默认端口是 80,HTTPS 是 443

无状态:每个HTTP请求独立,不保存客户端的状态信息。

如何实现有状态的应用:

1
2
3
4
5
1、Cookie:服务器发送小数据片段存储在客户端,每次请求自动发送:
2Session:服务器端存储状态,通过 Session ID 识别客户端
3、Token:如 JWT,将状态信息编码到令牌中由客户端保存
4、URL附加状态
5、隐藏表单字段

2、和TCP的关系

🌼💎TCP 连接的建立总是先于 HTTP 请求

1
2
3
4
HTTP 应用层协议:
依赖于下层TCP提供的可靠传输,定义web通信的语义和格式,规定了客户端和服务器之间如何交互
TCP 传输层协议:
可靠的面向连接的字节流服务,数据分段、传输和重组,按需到达不丢失
特性 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-ageno-cache表示资源需要在使用前验证其有效性)、ETagLast-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:通过 RangeAccept-Ranges 头支持断点续传(如大文件下载)。

8. 其他改进

  • 新增方法:OPTIONS(查询服务器支持的方法)、PUTDELETETRACE 等。

    1
    2
    3
    4
    OPTIONS:查询服务器支持的 HTTP 方法。
    PUT:上传资源到服务器,用于创建或更新资源。
    DELETE:删除服务器上的资源。
    TRACE:回显客户端发送的请求,用于调试。

局限性

虽然 HTTP/1.1 显著提升了性能,但仍存在:

  1. 队头阻塞(Head-of-Line Blocking):管道化中一个慢请求会阻塞后续请求。
  2. 冗余头部:每个请求都携带完整的头部(如 Cookie),未压缩。
  3. 并发限制:浏览器对同一域名限制 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 的局限性

  1. 仍依赖 TCP:TCP 层的队头阻塞问题未解决(丢包重传会阻塞所有流)。
  2. 服务器推送的采用率低:难以准确预测客户端需要的资源。

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