websocket 项目启示录

简介: websocket 项目启示录

websocket出现是因为浏览器不给开后门,不是WebSocket基于HTTP,相反可看成看成看成HTTP基于WebSocket。

为什么会出现HTTP,WebSocket?

假设1984年,人们使用TCP协议通讯,假设那时候还没网页浏览器,都是通过各种软件直接通讯。假设到了1986,人们使用浏览器浏览网页,假设当时电脑时100MHz,100M内存。


早年tcp链接数量有限制,不是内存,主要是select函数效率问题,select要轮询所有连接才能确定有哪些已经就绪。


在引入epoll/kqueue/完成端口之后,效率问题解决了,大量并发TCP连接就不是问题了,看过2013年的论文,有人用java在一台pc上支持50万个TCP长连接。


于是服务器要求“所有客户端,打开网页之后,必须关闭TCP连接”。这就是HTTP的初衷。按照这个协议,服务器接受TCP连接,几秒钟之内读取数据,检验之后,回复数据,断开连接,节省“资源”。


等到二十年后,QQ桌面版好好的,QQ网页版用的越来越多。由于浏览器都是连接之后很快断开,QQ网页版,只能靠各种polling方式持续交互数据(HTTP keep-alive也有自己的缺点),浪费大量的带宽(这时候带宽的费用就大了),同时客户端收到消息也不及时,还有各种其它问题。QQ网页版想直接用TCP协议长时间连接,但是QQ网页版能做的,都是浏览器允许做的。


可以说,websocket的出现,就是因为浏览器不支持TCP直连,不给开后门。于是“希望所有的浏览器都能够直接进行TCP连接”,于是浏览器出现了websocket协议。所以,因为某些原因,人们在TCP上面弄了一个HTTP协议,把TCP支持的一些特性删除了,然后若干年之后想要那些被删除的特性,返回TCP,于是出现了WebSocket。WebSocket实际上可以看作HTTP的降级!


“不是WebSocket基于HTTP,而是可以看成可以看成可以看成HTTP基于WebSocket”。


WebSocket 不是 HTML5 的东西。


WebSocket 是一个协议,归属于 IETF。

WebSocket API 是一个 Web API,归属 W3C。

两个规范是独立发布的。


广义上的 HTML5 里面包含的是 WebSocket API,并不是 WebSocket。简单的说,可以把 WebSocket 当成 HTTP,WebSocket API 当成 Ajax。


只是因为 WebSocket 对于非 Web 部分的意义不大(毕竟直接用 TCP 就好了),所以从现实角度的概率上而言 WebSocket 目前基本只会通过 Web API 里的 WebSocket API 来使用。但并不等于 WebSocket 属于 WebSocket API。


HTTP是运行在TCP协议传输层上的应用协议,而WebSocket是通过HTTP协议协商如何连接,然后独立运行在TCP协议传输层上的应用协议。你需要知道WebSocket仅仅是利用了HTTP协议做连接请求。WebSocket相当于一个简化版的TCP传输子层(实际上WebSocket也是应用层协议)。WebSocket之所以能持久连接原因是它运行在TCP协议上,TCP协议自身是长连接协议,所以WebSocket当然可以长连接啦。


如果你要问为什么HTTP不是长连接,原因是早期的HTTP在发起每个请求,响应完成后就会关闭Socket。但是后来加了多路复用KeepAlive协议后HTTP协议已经可以实现长连接了,可以处理长连接事务了。至于添加WebSocket特性,是为了更好、更灵活,轻量的与服务器通讯。因为WebSocket提供了简单的消息规范,可以更快的适应长连接的环境,其实现在HTTP协议自身就可以做,但是不太轻便。


为什么HTML4不支持WebSocket?

WebSocket的协商机制HTML4底层API没有实现。

image.png

用于一

image.png

用户二

image.png

TOM 群发了消息

image.png

Mike 也受到了消息的重创

image.png

参考

https://www.zhihu.com/question/20215561/answer/117875755

https://www.zhihu.com/question/20215561/answer/58593827

https://www.zhihu.com/question/20215561/answer/153288456


目录
相关文章
|
3月前
|
前端开发 Python
前后端分离的进化:Python Web项目中的WebSocket实时通信解决方案
在现代Web开发领域,前后端分离已成为一种主流架构模式,它促进了开发效率、提升了应用的可维护性和可扩展性。随着实时数据交互需求的日益增长,WebSocket作为一种在单个长连接上进行全双工通讯的协议,成为了实现前后端实时通信的理想选择。在Python Web项目中,结合Flask框架与Flask-SocketIO库,我们可以轻松实现WebSocket的实时通信功能。
68 2
|
4月前
|
缓存 JavaScript 前端开发
为开源项目 go-gin-api 增加 WebSocket 模块
为开源项目 go-gin-api 增加 WebSocket 模块
49 2
|
4月前
|
Linux Python
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
|
5月前
|
前端开发 Python
前后端分离的进化:Python Web项目中的WebSocket实时通信解决方案
【7月更文挑战第18天】在Python的Flask框架中,结合Flask-SocketIO库可轻松实现WebSocket实时通信,促进前后端分离项目中的高效交互。示例展示了一个简单的聊天应用:Flask路由渲染HTML,客户端通过Socket.IO库连接服务器,发送消息并监听广播。此方法支持多种实时通信协议,适应不同环境,提供流畅的实时体验。
101 3
|
7月前
|
消息中间件 前端开发 JavaScript
【前端】websocket 讲解与项目中的使用
【前端】websocket 讲解与项目中的使用
|
JSON 前端开发 安全
【Java Web项目】基于WebSocket的Web聊天室
本项目的名称为Web聊天室,即类QQ群组聊天,多个用户可以在同一个群组收发消息进行聊天
【Java Web项目】基于WebSocket的Web聊天室
|
网络协议 JavaScript
WebSocket全部内容及项目经验(二)
Socket.readyState: 只读属性 readyState 表示连接状态。 Socket.bufferedAmount: 只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。 下面的代码展示一个使用bufferedAmount 特性每秒发送更新的例子。如果网络无法承受这一速率,它会相应作出调整。
|
移动开发 网络协议 大数据
WebSocket全部内容及项目经验(一)
在websocket未出来之前,实现实时数据更新都是采用轮询http请求实现的,很明显这种方式有很大的缺陷,一条数据就需要发一次http请求。HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。而比较新的技术去做轮询的效果是Comet。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源。在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
105 0
|
前端开发 Java
在项目中使用WebSocket进行前后端通信
在项目中使用WebSocket进行前后端通信
347 0
|
设计模式 网络协议 算法
即时通讯系列: WebSocket从原理到企业项目技术选型(1)
阅读本篇可能需要的预备知识 《试图取代 TCP 的 QUIC 协议到底是什么》、《抓包与反抓包》、《趣谈网络协议》
598 0
即时通讯系列: WebSocket从原理到企业项目技术选型(1)