http/http2 支持双工?
http/http2 支持双工?
我们知道nio
支持读写事件,那么http
如果定义特殊的Content Type
,如 dstream
。
那么在服务器接受到该类型的http
请求的时候,可以立即响应数据,如离线存储的聊天记录,并且保持读取客户端的请求,如发送的聊天消息。
客户端也采用nio实现,用来读取和写入聊天数据。那么,是否这样子,http
协议就支持双向数据流
?
如果是,那么,为何没有人使用该模式?如果不是,那么htyp2呢?貌似gRPC就是这么干的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
http 是基于 tcp 的,当然是双工。
你应该理解双工的两种模式:半双工(http 1.0/1.1),全双工(http 2.0)。
半双工:同一时间内,链接上只能有一方发送数据,另一方接受数据。
http 1.0 是短连接模式,每个请求都要建立新的 tcp 连接,然后 C 发送,S 响应,断开,下一个请求重复此步骤。
http 1.1 是长连接模式,可以多路复用,建立 tcp 连接,资源1 C 发送,S响应,资源2 C发送 S响应,资源3 C发送 S响应,免去了要为每个资源都建立一次 tcp 的开销。
全双工:同一时间内,两端都可以发送或接受数据
http 2.0 资源1 C发送,不必等待 S响应就可以继续发送 资源2 的请求,可以并发的发送,一边发,一边收。
HTTP协议明确规定了报文的流动方向,永远都是一问一答的模式,在HTTP/1.1,即使有多路复用,这条TCP通道也已经限定了两端的角色。
理论上可以通过开两条通道,在通道1,A端是客户端B端是服务器,在通道2,A端是服务器B端是客户端,通过这种方式也能实现双向数据流。
但有一个非常现实的问题……你的客户端可能并不会暴露在公网中,如果强行要做到这一步……就会引入更大的一个问题:NAT穿透。
所以实际上最简单的办法就是双方建立一个TCP连接然后在TCP基础上进行封装以满足自身需求,如果是web前端,可能会使用websocket。
----------以上为HTTP1.1的境况--------------
HTTP/2理论上没有什么改观,但是由于有server push的存在,实际上你可以用它实现推送,也就是双向数据流了