【问题标题】:how to start a plain text http2 communication directly?如何直接启动纯文本http2通信?
【发布时间】:2018-03-07 02:37:06
【问题描述】:

我使用的是netty客户端,我确定服务器支持http/2。我可以直接启动纯文本 http/2 请求吗?我不想发送 http/1.1 请求,并使用 101 返回码升级到 http/2。

【问题讨论】:

  • 尝试时收到什么错误信息?
  • 我只是按照例子: DefaultFullHttpRequest upgradeRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/"); ctx.writeAndFlush(upgradeRequest);似乎没有“HttpVersion.HTTP_2_0”。如果我用魔术词设置缓冲区:“PRI ...”:ctx.writeAndFlush(Http2CodecUtil.connectionPrefaceBuf());不会发送任何内容。
  • 据我所知,http/2 只能通过 TLS 使用,因为建立连接的唯一方法是通过 ALPN(应用层协议协商),它是 TLS 的扩展。
  • http/2 可以运行纯文本。事实上我已经做到了。我只想跳过:http/1.1 请求,响应 101(交换协议)。

标签: netty


【解决方案1】:

您所要求的被称为“具有先验知识的 h2c”:客户端已经知道服务器支持 HTTP/2,并且可以直接开始与 HTTP/2 对话,而无需先进行协商。

并非所有服务器都支持这一点,有些需要专门为此目的打开一个单独的端口。

我不确定如何配置 Netty 客户端来执行此操作,但您可以查看 Netty gRPC 客户端 (https://github.com/grpc/grpc-java/tree/master/netty/src/main/java/io/grpc/netty) 的源代码以获取灵感:此客户端可以配置为直接开始使用 HTTP/2选择NegotiationType.PLAINTEXT

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 2017-04-04
    • 1970-01-01
    • 2021-06-04
    • 2019-11-25
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多