websocket协议详解

websocket协议详解,第1张

相较于HTTP协议,HTTP协议有一个的缺陷为:通信只能由客户端发起。在一些场景下,这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用轮询:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。

轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。

Webscoket是Web浏览器和服务器之间的一种全双工通信协议,其中WebSocket协议由IETF定为标准,WebSocket API由W3C定为标准。一旦Web客户端与服务器建立起连接,之后的全部数据通信都通过这个连接进行。通信过程中,可互相发送JSON、XML、HTML或图片等任意格式的数据。

客户端发起连接请求:

GET / HTTP/1.1\r\n

Connection: keep-alive, Upgrade\r\n

Sec-WebSocket-Version: 13\r\n

Sec-WebSocket-Key: puVOuWb7rel6z2AVZBKnfw==\r\n

Upgrade: websocket\r\n

\r\n

其它字段根据需要添加。 请求数据和http请求一样。 发现 Upgrade 字段为 websocket表示要建立websocket链接。 根据版本 Sec-WebSocket-Version 做相应的处理。

版本13服务器返回:

HTTP/1.1 101 Switching Protocols\r\n

Upgrade: websocket\r\n

Connection: Upgrade\r\n

Sec-WebSocket-Accept: FCKgUr8c7OsDsLFeJTWrJw6WO8Q=\r\n

\r\n

响应数据格式统一。 除了 Sec-WebSocket-Accept 需要根据请求头 Sec-WebSocket-Key 算出。其他都一样。

此时表示客户端服务端建立了常链接,双方可以互相发送数据了。

Sec-WebSocket-Accept计算流程:

  拿到 Sec-WebSocket-Key 称之为 key

  得到 sha1Str = sha1( key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")

  把  sha1Str 两个字符一组作为一个字节。得到新的字符串,最后做 base64 编码即可。

   说明:

       sha1加密的字符串是一个16进制的字符串,两个字符一组,假如 12, 那么转成一个字节就是

       十进制 18 的二进制位。

参考文档:

     https://www.jianshu.com/p/98911bf82ceb

     https://blog.csdn.net/weixin_34080951/article/details/91915908

本篇文章主要讲述以下几点:

WebSocket协议分为两部分:握手和数据传输

下面通过客户端和服务端交互的报文对比WebSocket通讯与传统HTTP的不同点,主要关注握手阶段。

根据上面的例子,运行之后,new WebSocket实例化一个新的WebSocket客户端对象,请求WebSocket URL为 ws://localhost:8000 的服务器,打开控制台的NetWork,客户端WebSocket对象会自动解析并识别为WebSocket请求,连接服务端端口,执行双方握手过程,来自客户端握手发送数据格式如下:

至此,HTTP已经完成它所有工作,接下来就是完全按照Websocket协议进行了。

通过查看WebSocket的原理,与HTTP对比,得出结论:

HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。Websocket协议通过第一个请求建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别,所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)。此外还有 multiplexing、不同的URL可以复用同一个WebSocket连接等功能。这些都是HTTP长连接不能做到的。

我们在使用WebSocket协议时通常不会使用它的API来实现,而是借助于Socket.io,Socket.io是一个WebSocket库,包括客户端的js和服务端的nodejs,它的目标是构建可以在不同浏览器和移动设备上使用的实时应用。它会自动根据浏览器从WebSocket、AJAX长轮询等各种方式中选择最佳的方式来实现网络实时应用,也就是说如果浏览器对WebSocket兼容性差,Socket.io会自动选择最佳方式实现实时通信,非常方便和人性化。

Socket.io 官方文档: https://socket.io/get-started/chat/

WebSocket兼容几乎所有现代浏览器,IE 10+ Edge Firefox 4+ Chrome 4+ Safari 5+ Opera 11.5+

socket.io对浏览器做了很好的兼容。

下一篇讲述Socket.io客户端API

参考文档: https://www.zhihu.com/question/20215561


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/9965558.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存