websocket简介及实现原理

如月之恒- 如月之恒-     2022-12-19     801

关键词:

文章目录

WebSocket与http的区别和联系

  HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充。二者关系如下图所示:

  Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。
  简单的举个例子吧,用目前应用比较广泛的PHP生命周期来解释。
  HTTP的生命周期通过Request来界定,也就是一个Request 一个Response,那么在HTTP1.0中,这次HTTP请求就结束了。
  在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。
  请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起。
  Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手,在握手阶段是一样的。

long poll 和 ajax轮询 的原理

long poll

  long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。

场景再现:
客户端:有没有新信息,没有的话就等有了才返回给我吧(Request)
服务端:。。。等待到有消息的时候。。来 给你(Response)
客户端:有没有新信息,没有的话就等有了才返回 给我吧(Request) -loop

  从上面可以看出其实这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性。
  何为被动性呢,其实就是,服务端不能主动联系客户端,只能有客户端发起。

ajax轮询

  ajax轮询 的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。

场景再现:
客户端:有没有新信息(Request)
服务端:没有(Response)
客户端:有没有新信息(Request)
服务端:没有(Response)
客户端:有没有新信息(Request)
服务端:没有(Response) ---- loop

WebSocket优势

  通过上面这个例子,我们可以看出,这两种方式都不是最好的方式,需要很多资源。
  通俗的说就是,服务器因为每天要接待太多客户了,是个健忘鬼,你一挂电话,他就把你的东西全忘光了,把你的东西全丢掉了。你第二次还得再告诉服务器一遍。
所以在这种情况下出现了,Websocket出现了。
  当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。

场景再现:
客户端:啦啦啦,我要建立Websocket协议,需要的服务:chat,Websocket协议版本:17(HTTP Request)
服务端:ok,确认,已升级为Websocket协议(HTTP Protocols Switched)
客户端:麻烦你有信息的时候推送给我噢。。
服务端:ok,有的时候会告诉你的。
服务端:balabalabalabala

  就变成了这样,只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你)
  这样的协议解决了上面同步有延迟,而且还非常消耗资源的这种情况。

WebSocket解决服务器上消耗资源的原理

  其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(PHP等)来处理。
  简单地说,我们有一个非常快速的接线员(Nginx),他负责把问题转交给相应的客服(Handler)。
  本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢,导致客服不够。
  Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。这样就可以解决客服处理速度过慢的问题了。
  同时,在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输identity info(鉴别信息),来告诉服务端你是谁。虽然接线员很快速,但是每次都要听这么一堆,效率也会有所下降的,同时还得不断把这些信息转交给客服,不但浪费客服的处理时间,而且还会在网路传输中消耗过多的流量/时间。
  Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。
  同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的…),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler)了。

后言

  • 文章是个人知识点整理总结,如有错误和不足之处欢迎指正。
  • 如有疑问、或希望与笔者探讨技术问题(包括但不限于本章内容),欢迎添加笔者微信(o815441)。请备注“探讨技术问题”。欢迎交流、一起进步。

websocket原理及如何使用

WebSocket原理及如何使用 它有很多名字;WebSocket,WebSocket协议和WebSocketAPI。从首选的消息传递应用程序到流行的在线多人游戏,WebSocket在当今最常用的Web应用程序中是至关重要的。 根据定义,WebSocket是通过单个TCP连接提供... 查看详情

中间件|kafka简介使用场景设计原理主要配置及集群搭建

开源Java学习公众号一、入门1、简介Kafkaisadistributed,partitioned,replicatedcommitlogservice。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。kafka对消息保存时根据Topic进行归类,发送消息者成为Producer... 查看详情

深度学习attention的原理分类及实现(代码片段)

目录1原理1.1简介1.2原理2分类2.1计算区域2.2所用信息2.3结构层次2.4模型方面2.5相似度计算方式3Keras实现1原理1.1简介Attention是注意力机制,本质上对关注的多个对象有个不同的权重,从而关注重点不同。Attention是Transformer、... 查看详情

线程池的原理及实现

1.Java类库中提供的线程池简介:    java提供的线程池更加强大,相信理解线程池的工作原理,看类库中的线程池就不会感到陌生了。2、线程池简介:   多线程技术主要解决处理器单元内多个线程执行的问题&#x... 查看详情

rsync服务简介部署使用及原理详解(代码片段)

Rsync简介什么是rsync?Rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具。Rstync软件适用于unix/linux/windows等多种操作系统平台。Rsync英文全称为Remotesynchronization,即远程同步。从软件的... 查看详情

lvs原理及简单实现

...署Lvs之NAT模式?(How)九、如何部署Lvs之DR模式?一、集群简介: 计算机集群(Cluster)技术可 查看详情

ws2812原理及实现

...不要忘记每经过一个像素点传输,信号减少24bit.二.程序简介:这里是纳秒极的电平翻转,所以传统的51单片机包括增强型51要考虑能否实现,我本以为STM32F103系列是一定可以的,但后 查看详情

线程池原理及实现

1、线程池简介:   多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。       假设一个服务器完成一项任务所需时... 查看详情

websocket的实现原理(代码片段)

1、客户端(浏览器)实现(1)webSocket对象实现WebSocket对象的web浏览器通过WebSocket对象公开所有必需的客户端功能。创建WebSocket对象varws=newWebSocket(url);//url格式:ws://ip地址:端口号/资源名称(2)... 查看详情

线程池的原理及实现

http://blog.csdn.net/hsuxu/article/details/89859311、线程池简介:   多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。       ... 查看详情

rpc原理及实现

1简介RPC的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。2调用分... 查看详情

websocket的实现原理

参考技术AWebsocket是应用层第七层上的一个应用层协议,它必须依赖HTTP协议进行一次握手,握手成功后,数据就直接从TCP通道传输,与HTTP无关了。即:websocket分为握手和数据传输阶段,即进行了HTTP握手+双工的TCP连接。下面我们... 查看详情

springboot及springcloud实现websocket群发及单点发送

参考技术A引入3个文件1.WebSocketConfig2.WebSocketServer3、SendPassagesController4.前端页面(注意改一下)vue版本自行百度后端向前端推送数据 查看详情

websocket教程springboot+maven整合(目录)

1、大话websocket及课程介绍简介:websocket介绍、使用场景分享、学习课程需要什么基础2、课程技术选型和浏览器兼容讲解简介:简单介绍什么是springboot、socketjs、stompjs,及解决使用浏览器兼容问题3、websocket广播、单播、组播介... 查看详情

线程池的原理及实现

1、线程池简介:多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。假设一个服务器完成一项任务所需时间为:T1创建线程时间,T2在线程中执行任务的... 查看详情

在线聊天——websocket简介与实际实现(代码片段)

...器和服务器的通信都是通过HTTP协议进行的,那么引入WebSocket有什么用呢?想像一下,有一个网页正在用文字直播某一场足球比赛的比分,在没有WebSocket时,客户端也就是浏览器实现比分的动态更新通常通过下... 查看详情

经典共识pow的原理及实现(代码片段)

经典共识PoW的原理及实现一、PoW简介PoW(ProofofWork)是工作量证明的简称,最早使用在防止拒绝服务攻击以及过滤垃圾邮件,现在成为区块链公链中最常见也是最有效的共识算法之一,当下最流行的比特币、以太坊等公... 查看详情

扫码登录原理及实现(代码片段)

...程:请求业务服务器获取用以登录的二维码和UUID。通过websocket连接socket服务器,并定时(时间间隔依据服务器配置时间调整)发送心跳保持连接。用户通过APP扫描二维码,发送请求到业务服务器处理登录。根据UUID设置登录结果。so... 查看详情