Skip to main content

HTTP

HTTP/1.1

http 1.1 是目前所有微服务架构下使用场景最广泛的协议之一了。

轻量,无状态,容易调试,Server 和 Client 玩的能比花还花了。

没什么好讲的,但是要明白,这个协议的下一层是 TCP,TCP 是一个流协议,也就是说 HTTP 要解决流式传输下怎么去正确截断。HTTP 并不是一个可靠的协议,但是你要明白 TCP 是怎么解决可靠性问题的,比如 ACK,重传,重复。

RESTful

一套理想的、完全满足 REST 风格的系统应该满足以下六大原则

  • 服务端与客户端分离(Client-Server)
  • 无状态(Stateless)
  • 可缓存(Cacheability)
  • 分层系统(Layered System)
  • 统一接口(Uniform Interface)
  • 按需代码(Code-On-Demand)

H2C(HTTP/2 Cleartext)

HTTP/2 增加了很多特性,例如二进制帧,多路复用,头信息压缩。

HTTP/2 要比 1.1 性能更好,但是在服务间调用,用不上很高级别的加密,所以 H2C 可以享受这些特性,但同时又可以 减负。

不强制使用 TLS 加密, HTTP/2 可以运行在普通的 http:// 地址上(默认端口 80),而非 HTTPS 的 443 端口.

H2C 能带来更低的延迟和更少的 CPU 消耗。同时,它也免去了证书管理和更新的运维负担。

协商

由于直接使用 HTTP 明文,H2C 的协议协商方式也有所不同。它通常通过 HTTP/1.1 的 Upgrade 头部来从 HTTP/1.1 升级到 HTTP/2,或者依靠客户端和服务器的直接协商。

# 协商
curl -v --http2 --location "http://localhost:8000/web/demo/version"
# 不协商
curl -v --http2-prior-knowledge --location "http://localhost:8000/web/demo/version"

HTTP/3

HTTP/3 对于移动端的支持非常非常强力,尤其是 1-RTT,连接ID,但是对于 Server-Side, 这些特性都用不上甚至会拖慢速度。(HTTP/3 在超高 QPS 下性能并不比 HTTP/1.1 快)

HTTP/3 的核心新特性在于它进行了一次传输层的彻底革新:从依赖 TCP 全面转向了基于 UDP 的 QUIC 协议。

将传输和加密握手合并,首次连接只需 1-RTT,对之前连接过的服务器支持 0-RTT 快速恢复。

使用连接ID识别连接,网络切换时连接可以无缝迁移而不中断。

强制默认加密,TLS 1.3 内置于 QUIC 协议中。