一、背景
Http2入门 这篇文章我们讲了采用多路复用技术来实现一个TCP连接承载多个HTTP并行请求,但它具体是如何实现的呢,因为HTTP2的多路复用是gRPC高性能最主要的原因之一,下面我们就来详细了解一下。
二、HTTP2多路复用基本原理
1、帧
HTTP2在HTTP1基础上引入了二进制分帧层,数据封包给下层协议之前将数据打散成更小的帧并以二进制的方式进行编码传输。

帧结构


2、流
流是一个虚拟的概念,我们把一次请求/响应中,拥有同一流标识符的所有帧抽象成一个流。

在流的层面数据是有序的,但在TCP层面数据是无序的。将多个HTTP消息分解为互不依赖的帧,然后交错发送(对于同一个HTTP消息是按顺序发送的),在另一端依据流标识符组装起来,这样就实现了多路复用。

三、gRPC案例抓包分析
我们首先将 gRPC初体验 中Server端打包部署在测试环境 118.178.255.158(内部IP:172.16.79.224),然后在本机运行客户端代码进行抓包实验。
tcpdump -ieth0 port 50051 -w grpc.pcap用WireShark打开后需要设置50051端口采用HTTP2协议解析

完整数据包如下:

Protocol协议有TCP、HTTP2、GRPC三种。
通过数据包我们分析出客户端与服务端交互过程如下
1、 第 1~3个包 TCP 三次握手
2、 第4个包 服务端->客户端 帧类型为 SETTINGS 设置连接的参数及管理流控制窗口。
3、 第5个包 客户端的应答
4、 第6个包 客户端->服务端 帧类型为Magic主要作用是对使用HTTP2协议的确认,确定启用HTTP2连接。
5、 第7~8个包,服务端->客户端,服务端的应答及SETTINGS 帧
6、 第9~11个包,客户端->服务端,管理流控制窗口、应答、SETTINGS 帧。
7、 第12个包,服务端->客户端 ,应答。
8、 第13个包,GRPC客户端->服务端,发送HEADERS帧,HEADERS帧用来传递HTTP头信息,另外还发送了DATA帧,包括两部分GRPC Message和ProtoBuf。

9、第14个包 服务端->客户端 ,发送HEADERS帧和DATA帧

10、第15~18 TCP四次挥手
总结
1、gRPC在TCP三次握手之后会发送MAGIC和SETTINGS帧来确认协议和配置。
2、gRPC在传输数据过程会设计滑动窗口等流控制策略。
3、gRPC附加信息基于HEADERS帧传输,具体请求和响应数据基于DATA帧传输。
4、gRPC请求和响应分为HTTP和gRPC状态。
注:本人对于gRPC刚学会了一个HelloWorld但未有更深入的学习,这两天一直有个疑惑,因为例子是完全基于SDK调用,而非请求HTTP接口,很是怀疑gRPC到底是直接走TCP Socket层还是走HTTP2,通过抓包分析发现确实是走HTTP2,后续会进一步研究gRPC的使用和源代码。