HTTP/1.1已经面世20年了,被互联网界广泛应用,但是它的一些特性导致它无法适用于海量应用。HTTP/1.1会建立一个TLS保护的long-lived TCP连接,后续的交互数据都会通过这个连接传输。但是如果这个连接正在被一个耗时较长的请求占用,那么后续发出的请求只能等待,这就是队头阻塞(Head of line blocking)。
HTTP/2引入了流的概念,一个TCP连接可以包含多个双向流(Stream),每个流中可以传输若干消息(Message),每个消息由若干二进制帧(Frame)组成。客户端和服务端可以把HTTP消息分解成独立的帧交错传输,然后在另一端组装。这样即使是某一个大消息的响应时间过长,也不会影响到后续的请求,如果后发请求的响应帧先到齐,客户端可以根据帧头的信息把消息组装起来继续处理。
gRPC基于HTTP/2,gRPC的Channel利用了流的机制。Channel是一个虚拟的连接,它其实对应了多个连接以及多个流。RPC调用实际上就是HTTP/2的流,通过其中一个连接传递,RPC调用的消息以帧的形式发送,根据消息的大小,即有可能多个消息公用一个帧,也有可能一个消息分割成多个帧。