Java HTTP 协议版本差异全览
一 核心差异总览
| 维度 | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|---|
| 连接模型 | 短连接 | 长连接 Keep-Alive(默认),支持管道化(实践中常禁用) | 多路复用(单一连接并发交错传输) | 多路复用(基于 QUIC) |
| 传输协议 | TCP | TCP | TCP | QUIC(基于UDP) |
| 队头阻塞 | 存在(连接内串行) | 存在(管道化下更严重) | HTTP 层解决,但 TCP 层仍存在 | 彻底解决(丢包只影响单个流) |
| 头部压缩 | 无 | 无 | HPACK | QPACK |
| 服务器推送 | 不支持 | 不支持 | 支持 | 支持 |
| 安全 | 不强制 | 不强制 | 主流实现要求 HTTPS/TLS | 内建加密(TLS 1.3+) |
| 连接建立 | 3-RTT(TCP 三次握手 + 应用) | 3-RTT | 1–3 RTT(TLS 握手叠加) | 通常 1-RTT,支持 0-RTT |
| 连接迁移 | 不支持 | 不支持 | 不支持 | 支持(基于连接 ID) |
| 典型并发 | 每域名约 6–8 个 TCP 连接 | 同左 | 单连接数百并发流 | 单连接多流,抗丢包更强 |
| 以上差异决定了不同版本在延迟、并发、弱网与移动网络体验上的显著不同。 |
二 Java 对各版本的支持与启用要点
HttpClient.newBuilder().version(HttpClient.Version.HTTP_2) 指定),默认协商到可用的最高版本;HTTP/1.1 作为兼容基线。示例:HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2) // 显式启用 HTTP/2
.build();
在 Spring Boot 2.7+ / Tomcat 10+ 等常见栈中,启用 HTTP/2 通常需要配置 TLS/HTTPS;HTTP/3 在 Java 标准库层面尚未内置,需要依赖外部网关/代理(如 Nginx 的实验性支持)或第三方库。三 对 Java 后端与架构实践的影响
四 选型建议
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。