HTTP/2与HTTP/3是否仍为请求响应协议及相关技术疑问
关于HTTP/2、HTTP/3及双向通信的疑问解答
问题背景
HTTP/1.1的RFC文档明确说明:
HTTP协议是一种请求/响应协议。
而HTTP/2规范提到每个流是双向的帧序列,客户端与服务器均可发起流的创建(不过服务器发起流仅与已废弃的H2服务器推送相关,且需响应客户端请求)。同时,gRPC与Websocket都基于单个客户端发起的HTTP/2流实现了双向通信。
针对以下疑问,逐一解答:
1. HTTP/2和HTTP/3是否不再属于请求响应型协议?
不是。HTTP/2和HTTP/3本质上依然是请求响应型协议,核心协议模型未变:所有通信必须由客户端先发起请求,服务器的任何响应(包括双向流中的数据发送)都基于客户端初始请求触发。
HTTP/2的双向流只是在传输层面优化了数据交互方式,允许同一流中客户端和服务器交替发送帧,但流本身必须由客户端发起,服务器无法主动创建新流(已废弃的服务器推送除外)。HTTP/3基于QUIC协议,同样遵循这一核心模型,所有通信的起点都是客户端请求。
2. 单个HTTP/2流是否支持全双工?
支持。HTTP/2的流设计本身就是双向的,客户端和服务器可在同一个流中同时发送帧(只要遵循流的优先级和流量控制规则)。这里的全双工指单一流上双方可同时进行读写操作,无需等待对方响应完成再发送数据。
比如gRPC的双向流式调用中,客户端和服务器可在同一个HTTP/2流上同时互发消息,无需严格遵循请求-响应顺序,这正是HTTP/2流全双工能力的体现。
3. 服务器能否主动向客户端发送消息(排除服务器推送)?若不能,gRPC和Websocket如何实现双向通信?
服务器不能主动发起新的通信,所有服务器发送的消息都必须基于客户端已发起的某个流,但这并不影响双向通信的实现:
- gRPC:无论是客户端流式、服务器流式还是双向流式调用,均由客户端先发起HTTP/2请求(创建流),之后在该已建立的流上,服务器可随时向客户端发送消息,客户端也可继续发数据,双方交互基于同一客户端发起的流,并非服务器主动发起新通信。
- Websocket over HTTP/2:Websocket握手由客户端发起HTTP/2请求,请求升级到Websocket协议,服务器响应握手后,在该HTTP/2流上建立Websocket连接,之后双方可在这个流上双向发消息,所有通信都基于客户端初始的握手请求,服务器并未主动发起新流或通信。
简言之,服务器无法"主动"发起新会话,但在客户端发起的会话(流)中,可随时发送数据,以此实现双向通信。
内容的提问来源于stack exchange,提问作者ns15
相关产品推荐
相关产品推荐

