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

WebSocket协议8题

时间:2023-04-05 14:08:11 HTML5

WebSocket是一个比较新的协议,是随着html5规范诞生的。虽然它还比较年轻,但大多数主流浏览器已经支持它。它的用途和应用非常广泛,已经渗透到前后端开发的各种场景中。对http中一问一答双向过程的不满催生了支持双向通信的WebSocket的诞生。WebSocket不是一个非常干净的协议。1、WebSocket协议只能由浏览器发起吗?不。该协议的当前受众不仅仅是网络开发人员。WebSocket只是一个协议。和http协议一样,它使用了类似okhttp的组件,可以在任何地方调用,甚至借助WebSocket实现了RPC框架。2、WebSocket和HTTP有什么关系?WebSocket和http一样,处于OSI模型的最高层:应用层。WebSocket使用http协议来握手。握手成功后,转为TCP通道,再也不会与http相遇。使用netstat或ss可以看到对应的连接,从外观上看与抽象层中的socket没有区别。3、WebSocket和长轮询有什么区别?长轮询就是客户端发出一个请求,服务端会一直等待这个连接(当然超时时间长),直到有数据才会返回。依旧是问答模式。比如著名的comted。WebSocket握手成功后,就是一个全双工的TCP通道。数据可以主动从服务器发送到客户端。链路两端的应用程序之间没有区别。WebSocket创建的连接不同于Http的长连接。由于Http长连接的底层仍然是Http协议,仍然是问答,只是hold住长连接。长轮询和Http长连接是阻塞I/O,但WebSocket可以是非阻塞的(特别是多路复用)。4.如何创建连接?WebSocket的连接创建是通过Http协议进行的。这样设计主要是考虑兼容性,在浏览器中发起请求很方便,看起来比较混乱。下图是典型的浏览器发起的ws请求。可以看到和http请求很像。不过看起来只是请求阶段:请求的地址一般是:ws://\*\*\*,或者安全协议wss:使用SSL/TLS加密,用于标识一个WebSocket请求。1、首先通过Http头中的Upgrade字段请求协议转换。如果服务器支持,可以切换到WebSocket协议。简单的说:连接已经有了,通过握手切换到ws协议只是切换连接的一个状态。1.Connection字段可以看作是与Upgrade字段配对的头信息。nginx等代理服务器需要先处理Connection,然后再发起协议转换。Sec-WebSocket-Key是一个随机字符串,服务器将使用这些数据构造SHA-1消息摘要。这样做可以尽量避免普通的HTTP请求被误认为是WebSocket协议。其他的,如Sec-WebSocket*,指示客户端支持的子协议和其他信息。loT中非常流行的Mqtt可以作为WebSocket的一个子协议。使用javascript,很容易连接到WebSocket服务器。五、如何处理数据?WebSocket通过事件通知进行操作。它包含四个事件和两个动作(发送和关闭)。WebSocket事件钩子备注openonopen客户端收到服务端数据时触发messageonmessageerroronerror通信错误时触发closeonclose连接关闭时触发可以直接通过Socket.send()方法发送数据。通过chrome的Inspect->Network->WS,可以在页面看到WebSocket连接。如图,Opcode为2,说明是二进制帧。WebSocket有类似于tcp协议的帧格式,这里就不过多解释了。参考:(https://tools.ietf.org/html/r...heartbeat心跳对应的ping和pong操作,opcodes分别为0x9和0xA。接收心跳的一方需要更新更新时间自己实现心跳。和使用Netty一样,我们在开发什么?介绍类似。在一些移动环境中,需要更智能的心跳控制。六、如何使用Nginx进行负载均衡?nginx官网已经给出了示例.主要是Upgrade和Connectionheadersconfig.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;}注意nginx做负载均衡,不需要配置ip_hash等参数,nginx自然支持。由于ip_hash只使用ip地址的前三位数字作为hash,也可能造成服务器不均衡。7.java服务器如何实现?可以在javax.WebSocket包下实现,只需实现ws服务器即可。目前基本可以通过注解来写代码,比如ServerEndpoint。推荐使用基于netty的netty-socketio来编写服务端。既然用了netty,就可以实现多层次的切入,获取一些统计数据,执行一些控制指令。SocketIO是一套解决方案。它拥有多种语言的客户端,并处理市场上的大部分兼容性问题。八。WebSocket能做什么?通知功能保持一个长连接,当服务器发送新消息时,可以实时推送给用户。像通知、评论等,都可以使用WebSocket通信。一些使用H5的客户端,为了简化开发,也会使用WebSocket进行消息通知,因为是实时推送,会有更好的用户体验。次优级数据的数据采集,如行为日志、轨迹、异常堆栈采集等,可以开辟专用的WebSocket通道进行传输。这样可以增加信息的集中度,可以根据用户行为及时推送合适的配置。由于大多数浏览器内核都支持它,因此它会使客户端APM编程模型变得简单。加密&&认证虽然Fiddler、Charles等可以用来抓取很多WebSocket包。但是,如果同时启用SSL,传输的是加密后的二进制数据,那么破解的成本会大大增加,而且会安全很多。反向控制hook...由于是双工长连接,服务端可以推送一些hook命令,甚至直接代码,在客户端执行。例如,截屏、录制声音、养小马。只要用户通过了授权申请,剩下的就交给你了。支付宝偷偷叫你的相机拍你,我信。当年恩德想,cometd的出现,惊天动地,激励了他很久。但是技术日新月异,cometd已经老化,而Socket.io发展迅速。WebSocket经历了一段乱世,规范越来越完善,使用也越来越方便,不需要处理那么多兼容性问题。但其实质是新瓶装旧酒,换汤不换药。WebSocket的发展得益于HTML5规范的制定。规范的意义在于约束厂商无约束风格的实现,指明发展方向。当然,还有一个典型的反例,那就是ie。现在,只有一批公认的专家还在坚持使用它。