GRPC底层传输协议-HTTP Trailer
从上一篇文章,我们知道grpc使用HTTP/2作为底层传输协议,并且在响应消息包含 3 个主要部分:响应头信息、以长度作为前缀的消息以及 trailer。那么什么是trailer呢?大家很多人前端或者后端工作中都在使用http协议,但我咨询了一些同事,都没听过http trailer,包括没在使用grpc的自己。
什么是Trailer HTTP 标头?
Trailer HTTP 标头是一个响应标头,指示使用分块传输编码编码的消息的标头中是否存在一组指定的标头字段。它使发送者能够在分块消息的末尾放置附加字段以传递元数据。分块传输编码是 HTTP 版本 1.1 中包含的一种数据传输技术。要启用Trailer HTTP 标头中的trailer 字段,必须将TE 请求标头设置为trailers。用户代理准备接受的传输编码在 TE 请求标头中指定。Trailer HTTP 标头只有一个值。Trailer HTTP 标头语法是 header-name,它是在使用分块传输编码编码的消息预告片中找到的标头字段的集合。Trailer HTTP 标头的示例如下所示。
1 | HTTP/1.1 200 OK |
Trailer HTTP 标头的语法是什么?
Trailer HTTP 标头的语法是标头名称。使用 Trailer HTTP 标头的语法如下。
1 | Trailer: header-names |
Trailer HTTP 标头的指令是什么?
Trailer HTTP 标头中仅使用一个指令。使用 Trailer HTTP 标头的指令是将出现在分块消息的预告片部分中的标头名称。但是,Trailer HTTP 标头字段不允许出现在消息帧标头(例如传输编码和内容长度)、路由标头(例如主机)、请求修饰符(例如控制和条件)(例如缓存控制、最大转发或 TE)以及最后用于身份验证标头,例如 Authorization 或 Set-Cookie、Content-Encoding、Content-Type、Content-Range 和 Trailer 本身。使用 Trailer HTTP 标头的指令如下所示。
在本例中使用了请求修饰符 Max-Forwards。
1 | Trailer: Max-Forwards |
在这种情况下,正在使用的标头是主机标头,它是路由标头。
1 | Trailer: Host |
此处显示了带有来自数据库查询的分块响应的预告片标头。在这种情况下,使用 Expires 标头。
1 | HTTP/1.0 500 OK |
如何使用 Trailer HTTP 标头?
使用分块传输编码进行编码的消息正文,发送者希望以消息末尾的尾部字段的形式发送元数据。发送者应在消息正文之前添加 Trailer HTTP 标头字段。Trailer HTTP 标头将告诉接收者哪些字段将出现在预告片中。因此,接收者甚至在开始处理正文之前就准备好元数据。如果消息正在流式传输并且接收者希望确保即时维护消息的完整性,那么这将非常有用。
Trailer HTTP 标头使用示例
在示例中,Expires 标头用在分块消息的末尾,并用作尾随标头。Expires HTTP 标头包含响应被视为过期的日期和时间。
1 | HTTP/1.1 200 OK |
Trailer HTTP 标头的规范文档是什么?
Trailer HTTP Header 只有一个规范文档,那就是超文本传输协议(HTTP/1.1):消息语法和路由(HTTP/1.1 Message Syntax and Routing)。《超文本传输协议(HTTP/1.1):消息语法和路由》(HTTP/1.1消息语法和路由)提到了Trailer HTTP Header的定义和使用。此外,本文还讨论了 Trailer HTTP 标头的示例和值。
Trailer HTTP 标头有哪些类型?
下面列出了预告片 HTTP 标头 HTTP 类型。
- 请求标头 – Trailer HTTP 标头 HTTP 标头是请求标头,因为它提供有关请求上下文的信息,以便服务器可以定制响应。
- 有效负载标头 - Trailer HTTP 标头 HTTP 标头是一种有效负载标头,因为它描述了与安全传输和从一个或多个消息重建原始资源表示相关的有效负载信息。
与 Trailer HTTP 标头类似的 HTTP 标头有哪些?
下面列出了与 Trailer HTTP 标头类似的 HTTP 标头。
- Transfer-Encoding HTTP 标头: 与 Trailer HTTP 标头类似,Transfer-Encoding HTTP 标头提供将有效负载正文安全传输给用户所需的编码类型。
- TE HTTP 标头: 与 Trailer HTTP 标头一样,TE HTTP 标头指定有效负载正文成功传输给用户所需的编码类型。
参考
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Trailer