WebSocket是什么原理?为什么可以实现持久>毗连/h2>
解释WebSocket为什么可以实现持久连接,还是先介绍一些什么是WebSocket,以及它产生的原因是什么。
是什么WebSocket?
WebSocket是一个协议。
协议就是王八的屁股——规定,你可以不遵守,但是别人都遵守你不遵守,你就跟别人玩不到一块去。
WebSocket协议在2008年诞生,2011年成为了国际标准,现在绝大部分浏览器都已经支持了。
产生的>缘故原由/strong>
其实原因是为了弥补HTTP协议的不足,因为HTTP协议只能由客户端发起请求,并且一个Request要对应一个Response(长链接也是如此)。
举个例子:
我之前做过一个小项目,只有一个页面,展示的是各个分公司当天的业绩,就是挣了多少钱。后台服务是Java,数据库是Mysql,有一张汇总表,内容大概是北京-100万,上海-80万这样的。
流程很简单,HTML页面发起请求到Java,Java访问数据库查询数据,再返回给HTML展示。但是Mysql中的汇总表的数据,是不定期更新的,可能10分钟,可能20分钟。
最简单的做法:HTML中用JS设置一个定时轮询(Polling),每隔几秒去发起一次请求,获取最新的数据,如果数据没有变化,页面也保持变化;缺点很明显,前端发起的很多请求都是无效的(因为数据没有变化)。
WebSocket的通信原理
而WebSocket,是要在客户端和服务器之间,建立一个通道,建立一个【真的长链接】。
WebSocket是要借助于HTTP,完成一部分工作。我在找到一个WebSocket在线测试的网站,打开之后查看请求和响应(具体网站连接也看下面图片中的信息)。
可以看出来协议里面多了两行:
Upgrade: websocket
Connection: Upgrade
这个就是关键内容了,通过请求告诉服务器:看清楚咯,请求要用WebSocket协议。
服务器会回答:好的,那我就切换到WebSocket协议啦。
到了这时候,HTTP完成它所有工作,客户端和服务器已经建立好了一个通道,下面就按照WebSocket协议进行了,服务端也就可以主动推送信息给客户端(双向),并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接,故此WebSocket也就实现了持久连接。
希望我的回答,能够帮助到你!我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它使用 HTTP/1.1 协议的 Upgrade 头部将连接从 HTTP 连接升级到 WebSocket 连接。这样就可以在浏览器和服务器之间建立一条持久的双向通信通道,从而实现了实时数据传输。
WebSocket 的原理主要是通过握手协议来实现持久连接。在浏览器和服务器之间建立 WebSocket 连接时,会进行一个握手过程,其中包含以下几个步骤:
1.客户端向服务器发送一个 Upgrade 请求,请求将当前连接升级为 WebSocket 连接;
2.服务器回应一个101状态码,并在后续的协议中指定通信所使用的协议版本;
3.握手成功后,双方可以发送数据到对方,WebSocket 会将数据转化为带有特殊头部信息的数据包进行传输。
在 WebSocket 连接建立后,服务器和客户端就可以实现双向实时通信,而不必像 HTTP 一样每次请求都需要建立一次连接。这种持久连接可以避免频繁地建立和关闭连接,减少网络传输的开销和延迟,提高数据传输的效率和速度。同时,由于 WebSocket 是一个标准化的协议,可以被大多数现代浏览器和服务器所支持,从而具有较广的应用前景。
总之,WebSocket 的实现原理是通过握手协议来建立持久连接,从而实现双向实时通信,减少了连接建立和关闭的开销,提高了数据传输的效率和速度,适用于需要实时通信的 Web 应用场景
Websocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关。
Websocket的数据传输是frame形式传输的,它将一条消息分为几个frame,按照先后顺序传输,大数据的传输可以分片传输,不用考虑到数据大小导致的长度标志位不足够的情况,和http的chunk一样,可以边生成数据边传递消息,即提高传输效率。
http请求响应模式是一夜情,websocket请求响应模式是小三,tcp请求响应模式是夫妻关系。
一句话就可以说清楚的问题,饶了这么大的一个圈子。因为websocket的本质还是基于tcp的,tcp是老爹,既然tcp可以全双工,那么websocket当然可以实现。http不支持是因为协议本身规定是只能响应一次,第二次服务器不认识客户端了 就像一夜情。如何解决这个问题?原理就是让服务器保留客户端的身份信息,你不需要再一次告诉服务器,我是谁,我是你的情人,可以再上车。