当前位置: 首页 > news >正文

HTTP协议-4-浏览器是怎么抉择HTTP版本的?

浏览器或客户端(如服务端的HttpClient)选择HTTP版本的过程是一个协商机制,涉及客户端和服务器的兼容性

1、浏览器如何选择HTTP版本?

1、初始请求的版本选择

  • HTTP/1.1:如果浏览器和服务器没有特殊配置,初始请求默认使用HTTP/1.1
  • HTTP/2:
    • 浏览器在发起HTTPS请求时,会在TLS握手中通过ALPN(Application-Layer Protocol Negotiation)扩展告知服务器支持的协议(如h2和http/1.1)。
    • 服务器如果支持HTTP/2,会在TLS握手中返回h2,后续通信使用HTTP/2。
  • HTTP/3:
    • HTTP/3基于QUIC协议(UDP),无法通过TLS握手协商。
    • 浏览器首次请求仍使用HTTP/1.1或HTTP/2,服务器通过响应头中的Alt-Svc字段告知客户端支持HTTP/3
    • 示例响应头:Alt- Svc: h3=“:443”; ma=86400
    • 客户端收到后,后续请求会尝试使用HTTP/3。

2、浏览器版本与协议支持

  • 浏览器版本决定支持的协议:
    • 旧版本浏览器(如IE11)仅支持HTTP/1.1
    • 现代浏览器(如Chrome、Firefox、Edge)支持HTTP/2和HTTP/3(需依赖操作系统和TLS库的支持)
    • 例如:Chrome 80+支持HTTP/3,但需要操作系统支持QUIC协议

3、如何查看浏览器使用的HTTP版本?

Chrome示例:
(1)、按F12打开开发者工具。
(2)、切换到Network标签。
(3)、右键点击表头,勾选Protocol列。
(4)、请求列表中会显示协议版本(如h2表示HTTP/2,h3表示HTTP/3)。

如图:
在这里插入图片描述

2、服务端如何处理不同版本的HTTP请求?

1、服务端能否支持所有版本?

服务端的处理能力取决于以下因素:

(1)、Web服务器/容器的版本
  • Tomcat:Tomcat 9+支持HTTP/2(需配置SSL和启用协议),但不支持HTTP/3
  • Nginx:Nginx 1.25+支持HTTP/3(需启用QUIC模块)
  • Apache HTTP Server:Apache 2.4.43+支持HTTP/2(需启用mod_http2)。
(2)、SSL/TLS配置
  • HTTP/2和HTTP/3强制要求HTTPS,服务器必须配置有效的TLS证书
(3)、协议兼容性
  • 如果服务器不支持客户端请求的协议版本(如客户端要求HTTP/3,但服务器不支持),服务器会返回505 HTTP Version Not Supported,或自动降级到HTTP/1.1

2、Tomcat是否需要支持特定HTTP版本?

  • Tomcat 9+支持HTTP/2
    • 需要启用SSL并配置protocol="org.apache.coyote.http11.Http11NioProtocol"或protocol=“org.apache.coyote.http2.Http2Protocol”。

示例server.xml配置:

<Connector port="8443" protocol="org.apache.coyote.http2.Http2Protocol"
sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"keystoreFile="path/to/keystore" keystorePass="password"/>
  • Tomcat不支持HTTP/3
    • HTTP/3基于QUIC协议(UDP),而Tomcat仅支持TCP协议,因此无法直接支持HTTP/3。需要使用反向代理(如Nginx)处理HTTP/3请求,再转发到Tomcat。

3、服务端通过HttpClient发起请求时如何选择HTTP版本?

1、HttpClient的版本决定支持的协议

  • Apache HttpClient 4.x
    • 仅支持HTTP/1.1
    • 不支持HTTP/2或HTTP/3。
  • Apache HttpClient 5.x
    • 支持HTTP/2(需Java 8+和依赖库支持)。
    • 不支持HTTP/3。
  • Java 11+内置的HttpClient
    • 支持HTTP/1.1和HTTP/2(默认启用)。
    • 通过HttpClient.Version.HTTP2强制指定版本。
    • 代码示例:
HttpClient client = HttpClient.newBuilder().version(HttpClient.Version.HTTP2).build();

2、如何查看HttpClient使用的协议?

  • Apache HttpClient:

    • 默认使用HTTP/1.1,无法直接查看协议版本。
    • 若使用HttpClient 5.x的HTTP/2支持,需通过日志或调试工具(如Wireshark)观察流量。
  • Java 11+内置HttpClient:

    • 可通过响应对象获取协议版本:
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.version()); // 输出HTTP/1.1或HTTP/2

4、同一个浏览器对不同服务端可能使用不同的HTTP版本吗?

是可以的!而且这是现代浏览器的正常行为
浏览器会根据每个目标服务器的支持能力,动态选择使用哪种HTTP版本。

浏览器的决策过程如下:
在这里插入图片描述

示例:
假设你用Chrome打开三个网站。
在这里插入图片描述
同一个浏览器,对不同服务器可以使用了不同的HTTP版本

5、各HTTP版本对比

在这里插入图片描述
说明:

  • 现代浏览器只在HTTPS上启用HTTP/2和HTTP/3
  • 现代浏览器选择版本顺序:HTTP/3 > HTTP/2 > HTTP/1.1(按服务器支持情况降级)。

6、HTTP/3和QUIC简介

  • HTTP/3使用QUIC协议(基于UDP),不再依赖TCP。
  • 优势:
    • 减少连接建立时间(0-RTT恢复)
    • 避免队头阻塞(TCP的痛点)
    • 更适合移动网络
  • 支持者:Google、Cloudflare、Facebook、部分国内大厂(如腾讯、阿里云逐步支持)

7、总结与建议

在这里插入图片描述
实际应用建议:
(1)、浏览器端

  • 确保服务器启用HTTPS和HTTP/2(如Nginx或Apache配置)。
  • 如果需要支持HTTP/3,需使用支持QUIC的反向代理(如Nginx QUIC模块)。

(2)、服务端开发

  • 使用Java 11+内置的HttpClient或Apache HttpClient 5.x以支持HTTP/2。
  • 对于HTTP/3,需依赖外部库(如OkHttp 4.9+或QUIC客户端库)。

(3)、容器配置

  • Tomcat仅支持HTTP/1.1和HTTP/2,HTTP/3需通过反向代理实现

通过合理配置客户端和服务器,可以充分利用新协议的性能优势(如HTTP/2的多路复用、HTTP/3的低延迟)。

向阳前行,Dare To Be!!!

http://www.lryc.cn/news/624267.html

相关文章:

  • LeetCode 45.跳跃游戏II:贪心策略下的最少跳跃次数求解
  • 如何在windows下使用usbview查看USB设备信息
  • 局域网视频软件BeeWorks,内网顺畅沟通
  • CloudBase AI ToolKit + VSCode Copilot:打造高效智能云端开发新体验
  • 8.19 note
  • AI心理助手开发文档
  • 《Python学习之使用标准库:从入门到实战》
  • ST05跟踪MRP的运行(MD01)过程
  • Day8--滑动窗口与双指针--1004. 最大连续1的个数 III,1658. 将 x 减到 0 的最小操作数,3641. 最长半重复子数组
  • vite+react+antd,封装公共组件并发布npm包
  • 实践笔记-VSCode与IDE同步问题解决指南;程序总是进入中断服务程序。
  • RocksDB 解密可逆哈希:BijectiveHash的设计奥秘
  • Vue diff简介
  • Rust学习笔记(六)|Rust 中的常用集合(Vector、String、HashMap)
  • MiniMax Agent 上线 Market Place ,AI一键复制克隆网站
  • 部署 HAProxy 高可用
  • python 数据拟合(线性拟合、多项式回归)
  • Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin(2)
  • 云计算:企业数字化转型的核心引擎
  • Kubernetes(K8s)常用命令全解析:从基础到进阶
  • 【Kubernetes】在 K8s 上部署 Prometheus
  • C语言基础:变量与进制详解
  • K8s的命名空间需要创建吗
  • 工具集成强化学习:AI数学推理能力的新跃迁
  • Java基础(九):Object核心类深度剖析
  • 图神经网络分享系列-node2vec(二)
  • 基于51单片机WIFI心率计脉搏体温测量仪APP设计
  • HTML应用指南:利用POST请求获取全国华为旗舰店门店位置信息
  • 《若依》权限控制
  • 上下文切换及线程操作相关内容