当前位置: 首页 > Web前端 > HTML5

WebSocket协议八问:为你快速解答WebSocket热门问题

时间:2023-04-05 17:57:51 HTML5

1.简介WebSocket是一个比较新的协议,它是随着html5规范而诞生的。虽然它还比较年轻,但是大多数主流浏览器已经支持它了。它的用途和应用非常广泛,已经渗透到前后端开发的各种场景中。对http的二问一答(来自所谓的“长轮询”技术)的二式流程的不满,催生了支持双向通信的WebSocket的诞生。WebSocket不是一个非常干净的协议。本文将从8个常见问题入手,为不了解WebSocket协议的开发者快速科普相关知识,为您节省学习WebSocket的时间。另外,如果你对网络即时通讯技术一窍不通,请抽空阅读《新手入门贴:详解Web端即时通讯技术的原理》和《Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE》这两篇文章。学习交流:即时通讯/推送技术开发交流群4:101279154【推荐】移动IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》(本文同步发表于:http://www.52im.net/thread-24...)2.参考文章《WebSocket详解(一):初步认识WebSocket技术》《WebSocket详解(二):技术原理、代码演示和应用案例》《WebSocket详解(三):深入WebSocket通信协议细节》《WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)》《WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)》《WebSocket详解(六):刨根问底WebSocket与Socket的关系》《理论联系实际:从零理解WebSocket的通信原理、协议格式、安全性》3.更多Web端即时通讯新手入门贴:《新手入门贴:详解Web端即时通讯技术的原理》Web端即时通讯技术盘点,请参考:《Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE》AboutAjaxshortpolling:找这方面的资料是没有意义的,除非忽悠客户,否则请考虑其他3个选项。Comet技术的详细介绍请参考:《Comet技术详解:基于HTTP长连接的Web端实时通信技术》《WEB端即时通讯:HTTP长连接、长轮询(long polling)详解》《WEB端即时通讯:不用WebSocket也一样能搞定消息的即时性》《开源Comet服务器iComet:支持百万并发的Web端即时通讯方案》WebSocket更详细的介绍请参考:《新手快速入门:WebSocket简明教程》《Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架》《socket.io和websocket 之间是什么关系?有什么区别?》SSE的详细介绍请参考:《SSE技术详解:一种全新的HTML5服务器推送事件技术》更多网页端即时通讯文章,请参考:http://www.52im.net/forum.php...4.1WebSocket问题:WebSocket协议只能由浏览器发起吗?不。该协议的当前受众不仅仅是网络开发人员。WebSocket只是一个协议。和http协议一样,它使用了类似okhttp的组件,可以在任何地方调用,甚至借助WebSocket实现了RPC框架。5.2问WebSocket:WebSocket和HTTP有什么关系?WebSocket和http一样,处于OSI模型的最高层:应用层。WebSocket使用http协议来握手。握手成功后,转为TCP通道,再也不会与http相遇。使用netstat或ss可以看到对应的连接,从外观上看与抽象层中的socket没有区别。更多关于WebSocket与HTTP的关系,以及与Socket的区别,可以进一步阅读以下文章:《WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)》《WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)》《WebSocket详解(六):刨根问底WebSocket与Socket的关系》6.3问WebSocket:WebSocket和长轮询有什么区别?长轮询就是客户端发出一个请求,服务端会一直等待这个连接(当然超时时间长),直到有数据才会返回。依旧是问答模式。比如著名的comted。WebSocket握手成功后,就是一个全双工的TCP通道。数据可以主动从服务器发送到客户端。链路两端的应用程序之间没有区别。WebSocket创建的连接不同于Http的长连接。由于Http长连接的底层仍然是Http协议,仍然是问答,只是hold住长连接。长轮询和Http长连接是阻塞I/O,但WebSocket可以是非阻塞的(特别是多路复用)。想要更深入了解这方面的信息,请进一步研究:《Comet技术详解:基于HTTP长连接的Web端实时通信技术》《WEB端即时通讯:HTTP长连接、长轮询(long polling)详解》VII.4QuestionWebSocket:如何创建WebSocket连接?WebSocket的连接创建是通过Http协议进行的。这样设计主要是考虑兼容性,在浏览器中发起请求很方便,看起来比较混乱。下图是典型的浏览器发起的ws请求。可以看到和http请求很像。不过看起来只是请求阶段:请求的地址一般是:ws://***,或者安全协议wss:使用SSL/TLS加密,用于标识一个WebSocket请求。1)首先通过Http头中的Upgrade字段请求协议转换。如果服务器支持,可以切换到WebSocket协议。简单的说:连接已经有了,通过握手切换到ws协议只是切换连接的一个状态。2)Connection字段可以看作是与Upgrade字段配对的头信息。nginx等代理服务器需要先处理Connection,然后再发起协议转换。3)Sec-WebSocket-Key是一个随机字符串,服务器会用这些数据构造一个SHA-1信息摘要。这样做可以尽量避免普通的HTTP请求被误认为是WebSocket协议。其他的,如Sec-WebSocket*,指示客户端支持的子协议和其他信息。loT中非常流行的Mqtt可以作为WebSocket的一个子协议。使用javascript,您可以轻松连接到WebSocket服务器:更多详细信息,请阅读:《WebSocket详解(三):深入WebSocket通信协议细节》。八、关于WebSocket的5个问题:WebSocket是如何处理数据的?WebSocket通过事件通知进行操作。它包含四个事件和两个动作(发送和关闭)。WebSocket事件:可以直接通过Socket.send()方法传输数据。通过chrome的Inspect->Network->WS,可以在页面看到WebSocket连接。如图,Opcode为2,说明是二进制帧:WebSocket有类似tcp协议的帧格式,这里不再过多解释。(详细可阅读:《理论联系实际:从零理解WebSocket的通信原理、协议格式、安全性》)参考:https://tools.ietf.org/html/r...。9、关于WebSocket的问题6:如何使用Nginx做WebSocket负载均衡?nginx官网已经给出了示例。主要是Upgrade和Connectionheaders的设置。Nginx中的配置如下:map$http_upgrade$connection_upgrade{defaultupgrade;''close;}location/chat/{proxy_passhttp://backend;proxy_http_version1.1;proxy_set_headerUpgrade$http_upgrade;proxy_set_headerConnection$connection_upgrade;}NotesYes,nginx做负载均衡,不需要配置ip_hash等参数,nginx自然是支持的。由于ip_hash只使用ip地址的前三位数字作为hash,也可能造成服务器端的不平衡。特别注意:在IM聊天系统场景下,Nginx为WebSocket提供的所谓“负载均衡”只能解决传统分布式系统中SLB服务器需要做的事情。通俗地说,Nginx只能帮助引导WebSocket客户端连接到哪个WebSocket服务器实例。在IM集群的情况下,如果两个用户在不同的WebSocket实例下,Nginx之间是没有跨实例通信的。不过这部分的逻辑还是需要IM开发者自己去实现。总而言之,Nginx为WebSocket提供的所谓“负载均衡”,并不是IM开发者所想的全功能集群!10、关于WebSocket的问题7:Java服务器是如何实现WebSocket的?可以使用javax.WebSocket下的包来简单实现ws服务器。目前基本可以通过注解来写代码,比如ServerEndpoint。推荐使用基于netty的netty-socketio来编写服务端。由于使用了netty,所以可以进行多层次的切入,获取一些统计数据,执行一些控制命令。socketio是一个拥有多种语言客户端并处理市场上大部分兼容性问题的解决方案。友情提示:socket.io几乎是市面上最好的开源WebSocket解决方案,但是开源项目netty-socketio并不是socket.io官方团队维护的,对于这个版本的socket.io,其他非官方版本可以无法立即跟进也是需要考虑的风险因素。11、关于WebSocket的8个问题:WebSocket能做什么?1)通知功能:保持长连接,当服务器发送新消息时,可以实时推送给用户。WebSocket通信可以用于知乎的通知、评论等,部分使用H5的客户端为了简化开发,也会使用WebSocket进行消息通知。由于是实时推送,用户体验会更好。2)数据采集:一些次优数据,如行为日志、轨迹、异常堆栈采集等,可以开辟专用的WebSocket通道进行传输。这样可以增加信息的集中度,可以根据用户行为及时推送合适的配置。由于大多数浏览器内核都支持它,因此它会使客户端APM编程模型变得简单。3)加密&&鉴权:虽然Fiddler、Charles等可以抓取很多WebSocket包。但是,如果同时启用SSL,传输的是加密后的二进制数据,那么破解的成本会大大增加,而且会安全很多。4)反向控制钩子:这个...由于是双工长连接,服务端可以推送一些钩子命令,甚至直接代码,在客户端执行。例如,截屏、录制声音、养小马。只要用户通过了授权申请,剩下的就交给你了。支付宝偷偷叫你的相机拍你,我信。十二:本文小结想当年cometd的出现,惊天动地,激动了好久。但是技术日新月异,cometd已经老化,而Socket.io发展迅速。WebSocket经历了一段乱世,规范越来越完善,使用也越来越方便,不需要处理那么多兼容性问题。但其实质是新瓶装旧酒,换汤不换药。WebSocket的发展得益于HTML5规范的制定。规范的意义在于约束厂商无约束风格的实现,指明发展方向。当然,还有一个典型的反例,那就是ie。现在,只有一批公认的专家还在坚持使用它。附录:更多WEB即时通讯资讯《新手入门贴:史上最全Web端即时通讯技术原理详解》《Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE》《SSE技术详解:一种全新的HTML5服务器推送事件技术》《Comet技术详解:基于HTTP长连接的Web端实时通信技术》《新手快速入门:WebSocket简明教程》《WebSocket详解(一):初步认识WebSocket技术》《WebSocket详解(二):技术原理、代码演示和应用案例》《WebSocket详解(三):深入WebSocket通信协议细节》《WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)》《WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)》《WebSocket详解(六):刨根问底WebSocket与Socket的关系》《socket.io实现消息推送的一点实践及思路》《LinkedIn的Web端即时通讯实践:实现单机几十万条长连接》《Web端即时通讯技术的发展与WebSocket、Socket.io的技术实践》《Web端即时通讯安全:跨站点WebSocket劫持漏洞详解(含示例代码)》《开源框架Pomelo实践:搭建Web端高性能分布式IM聊天服务器》《使用WebSocket和SSE技术实现Web端消息推送》《详解Web端通信方式的演进:从Ajax、JSONP 到 SSE、Websocket》《MobileIMSDK-Web的网络层框架为何使用的是Socket.io而不是Netty?》《理论联系实际:从零理解WebSocket的通信原理、协议格式、安全性》《微信小程序中如何使用WebSocket实现长连接(含完整源码)》《八问WebSocket协议:为你快速解答WebSocket热门疑问》(本文同步发表于:http://www.52im.net/thread-24...)

猜你喜欢