Architecture 使用单个HTTP/2连接进行双向(和对称)通信

Architecture 使用单个HTTP/2连接进行双向(和对称)通信,architecture,network-protocols,http2,Architecture,Network Protocols,Http2,HTTP/2引入了一些非常有趣的特性,如流水线、多路复用和服务器推送承诺;单凭他们自己就很了不起作为回报,我们牺牲了WebSocket。 理论上,HTTP/2允许服务器和客户端之间以推送承诺的形式进行双向通信。服务器甚至可以在被要求之前向客户端发送响应。再一次;太棒了但这些请求与客户的请求不同。 因此,眼前的问题是: 有没有一种方法可以使用单一HTTP/2连接,允许服务器和客户端相互发送任意消息(二进制消息的额外点数),而无需为客户端发送的消息和服务器发送的消息定义不同的协议 WebSocket

HTTP/2引入了一些非常有趣的特性,如流水线、多路复用和服务器推送承诺;单凭他们自己就很了不起作为回报,我们牺牲了WebSocket。

理论上,HTTP/2允许服务器和客户端之间以推送承诺的形式进行双向通信。服务器甚至可以在被要求之前向客户端发送响应。再一次;太棒了但这些请求与客户的请求不同。

因此,眼前的问题是:
有没有一种方法可以使用单一HTTP/2连接,允许服务器和客户端相互发送任意消息(二进制消息的额外点数),而无需为客户端发送的消息和服务器发送的消息定义不同的协议

WebSocket是我正在寻找的一个很好的例子,因为双方中的任何一方都可以启动连接,然后双方都可以发送消息

不破坏HTTP/2的解决方案是理想的,但协议滥用也是受欢迎的。
事先非常感谢。


ps.本练习的目的是确定是否可以在HTTP/2之上设计传输协议,如GRPC、Thrift等,而无需服务器/客户机架构,但双方都可以发送和接收消息,从而实现诸如req/resp、pub/sub、rpc、,etc可以在上面构建。

现在最接近您需要的是服务器发送的事件。它应该可以很好地与HTTP/2配合使用,并且除习惯性IE外,所有浏览器都支持它,但是有一个polyfill可用(它会吃掉你的RAM)。不过,没有某种转义就没有二进制支持,因为换行符用于分隔消息部分和消息本身

还有几点说明(欢迎更正):

  • Websockets很好,踢得很好。HTTP/2 Connect在不久的将来应该可以使用,如果它现在不可用的话
  • 但是服务器无法启动到客户端的WebSocket
  • 推送承诺有着完全不同的用途,不,你不能用它们代替WebSocket

HTTP/2推送称为推送,但它与从服务器推送的通知无关。这或多或少是一种通过节省往返时间来减少应用程序加载时间的合理方法。

服务器端事件似乎确实是对我的问题最合适的答案。在这里可以找到一个非常有趣的golang示例,感谢您分享精彩的信息。我对HTTP2推送也有同样的困惑。那么是否需要围绕HTTP/2全双工构建一个框架,以便用它模拟WebSocket?grpc默认使用HTTP2@nibin012 afaik服务器无法启动gRPC请求-应答交换,只有客户端可以,否?