http2.0 server push ? websocket ?

3,053 阅读2分钟

背景

作为一个巨强的前端工程师,怎么可以不去了解http呢,所以作者就去翻了翻掘金大佬的文章,受益非浅,期待自己也能成为掘金大佬。话说作者之前也用过websocket写过通讯app。
因此在一个知识点上产生了疑问,http2.0可以server push,而websocket也能做server push,那么两者之间的区别是啥?http2.0能代替websocket吗?带着这两个疑问,作者翻了很多资料,终于得出了一下两个结论

疑问点

  • http2.0 server push和websocket srever push的区别?
  • http2.0 能代替websocket吗

共同点

  • 都是使用tcpsocket发送数据包
  • 都是长连接。所谓的长连接是建立tcpSocket连接后不会马上断开,而是保持连接。当然这个连接也是有时间限制了。例如使用apache做服务器其实这个时间就是由apache去设定。http1.0加入长连接。

image.png

区别

  • 有无状态 我们都知道http是无状态的,我们都是使用cookie做状态验证,但是websocket却是有状态的。那为什么websocket有状态呢,接下来为大家揭秘。
  1. 页面创建一个webSocket实例,并向一个服务器的websocket url发送请求。这个主要字段请求如下。
GET /webfin/websocket/ HTTP/1.1
Host: localhost 
Upgrade: websocket  //标识为websocket请求
Connection: Upgrade  
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg== //websocket密钥 
Origin: http://localhost:8080 
Sec-WebSocket-Version: 13

2.服务器同意建立websocket请求,然后响应

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8= //密钥 

因此通过Sec-WebSocket-Accept就能做到server push

  • 主动被动
  1. http server push是被动的,只有请求后,才能做server push

image.png

  1. websocketserver push 是主动的,页面和服务器都能做主动推送

image.png

  • 实时性 我们都知道http的一个生命周期是request -> response,而http2.0的server push只有请求后才能起效所以实时性低,而websocket则不一样,能主动推送所以实时性高。

  • 普遍性

http2.0server push早期nginx配置的功能,所以得另外再做配置,18年才支持,现在很多地方都支持http2.0但是大部分都忽略了server push功能,可能有这个原因吧。

替代?

其实websocket和http2.0存在很多的共性,它们的关系其实是这样。

image.png 所以其实websocket和http2.0其实并不矛盾。

写在最后

文章有很多不足,有待进一步加深,请多指教,谢谢。