HTTP2.0
介绍grpc的实现之前,必须先了解HTTP2.0的一些基础知识,毕竟grpc是建立在HTTP2.0之上的。
本文会结合grpc中对http2.0的实现对http2.0进行介绍。
http2.0几个重要的概念
流
已建立的连接上的双向字节流
消息
与逻辑消息对应的完整的一系列数据帧
帧
HTTP2.0通信的最小单位,每个帧包含帧首部,至少也会标识出当前帧所属的流
帧首部使用固定的9个字节来表示。详细说明见http://http2.github.io/http2-spec/#FrameHeader
+-----------------------------------------------+
| Length (24) |
+---------------+---------------+---------------+
| Type (8) | Flags (8) |
+-+-------------+---------------+-------------------------------+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0...) ...
+---------------------------------------------------------------+
grpc中的帧头实现
type FrameHeader struct {
valid bool // caller can access []byte fields in the Frame
//1个字节,帧类型,有10个标准的帧类型。
Type FrameType
//1个字节,标志字段允许不同的帧类型定义特定于帧的消息标志
Flags Flags
//3个字节,长度前缀意味着一帧大约可以携带 16MB 数据,不包括 9 字节首部
Length uint32
//31位,流标识符唯一标识 HTTP 2.0 的流。
StreamID uint32
}
HTTP2.0规定了如下的帧类型
- DATA:用于传输HTTP消息体,应用数据可以分为多个DATA帧,最后一帧要翻转帧首部的END_STREAM 字段。
- HEADERS:用于传输流额外的首部字段,客户端通过发送HEADERS帧来发起新流。这个帧里包含带有新流ID的公用首部、可选的31位优先值,以及一组 HTTP 键-值对首部
- PRIORITY:用于指定或重新指定引用资源的优先级。
- RST_STREAM:用于通知流的非正常终止。
- SETTINGS:用于通知流两端通信方式的配置数据。
- PUSH_PROMISE:用于发出创建流和服务器引用资源的要约,服务器通过发送PUSH_PROMISE帧来发起推送流,这个帧与HEADERS帧等效,但它 包含“要约流 ID”,没有优先值。。
- PING:用于计算往返时间,执行"活性"检查。
- GOAWAY:用于通知对端停止在当前连接中创建流。
- WINDOWS_UPDATE:用于针对个别流或个别连接实现流量控制。
- CONTINUATION:用于继续一系列首部块片段。
const (
FrameData FrameType = 0x0
FrameHeaders FrameType = 0x1
FramePriority FrameType = 0x2
FrameRSTStream FrameType =