4

在阅读了 HTTP/2 RFC (#7540)和 TLS-ALPN RFC (#7301)之后,当 ALPN 缺少一端时,我仍然无法弄清楚预期的行为。

假设我有一个使用 HTTP/2“h2”(通过 TLS)的客户端,它与支持 HTTP/2 但不在“服务器你好”中发送 ALPN 扩展的服务器通信。客户的预期行为是什么?

到目前为止,我见过的大多数客户端都认为服务器不支持 HTTP/2 并将连接降级到 http/1.1,但很少有人忽略(go-gRPC)继续使用 HTTP/2。

如果使用在客户端 ("h2") 和服务器 ("h2c") 之间执行 SSL 终止的 AWS 经典 LB,则此方案可能更实用。在此示例中,客户端发送值为“h2”的 ALPN 扩展,LB 在没有 ALPN 的情况下执行 SSL 握手(正如他的预期),最终 JAVA gRPC 由于 HTTP/1.1 降级而失败。

4

2 回答 2

2

回答问题,不用alpn,但是用npn,还是可以支持grpc的。

两个澄清,

  1. grpc 的 http2 协商可以通过 alpn 或 npn 进行。如果客户端支持 alpn,它会在 Client Hello 中发送 alpn 扩展和 npn 扩展。如果服务器支持 alpn,则服务器仅使用带有 h2 的 alpn 响应。如果不支持 alpn 并且 npn 是“服务器 LB 配置”中的配置,它将发送 npn 和 h2。如果您不配置 alpn,我在 haproxy 和 nginx 中注意到的,除非配置,否则它不会默认为 npn。
  2. grpc客户端坚持h2。如果 alpn 和带有 h2 的 npn 都没有发生,客户端将断开连接,因为它假定不支持 h2,并且 h2 对于 grpc 是强制性的
于 2018-11-29T10:57:14.947 回答
1

它完全取决于客户端和服务器。许多人仍然支持 SPDY 和 HTTP/2 支持的旧 NPN TLS 扩展,尽管官方规范说只使用 ALPN。

例如,在浏览器方面,Chrome、Firefox 和 Opera 现在只支持基于 ALPN 的 HTTP/2,尽管它们过去都支持基于 NPN 的 HTTP/2。在编写 Safari 时,IE 和 Edge 仍然允许使用 NPN 或 ALPN。

在服务器端,一些(例如 Nginx)同时支持,而一些(例如 Apache)仅支持 ALPN。

我也会质疑“降级”的术语。ALPN 扩展是使用 h2 的请求,在发送单个 HTTP 消息之前作为 TLS 协商的一部分发生。因此,它不再是真正的降级,而不是不成功的升级请求。

于 2017-12-11T19:22:16.087 回答