热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅析websocket

Websocket背景历史上,如果一个web应用程序需要和server进行双向通信(例如,实时聊天和游戏),需要大量的http请求来检查server的内容是否有更新,同时也需要很多

Websocket

背景

历史上,如果一个web应用程序需要和server进行双向通信(例如,实时聊天和游戏),
需要大量的http请求来检查server的内容是否有更新, 同时也需要很多http请求来发送
通知,这种方式有许多问题:

  • server端必须使用大量的tcp连接来服务每一个client:一类连接用来发送信息给
    client, 另一类连接用来接收新的消息。

  • 有大量不必要网络开销,因为每一次消息通讯都都包含http header。

  • client需要维护一个map来映射发送数据的连接和接受数据的连接。

一个简单的解决方案就是使用一个tcp连接来进行双向通讯,这就是websocket的作用。

websocket使用80和443端口,对HTTP代理和网关友好。

连接握手过程

client发送

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

server响应

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

连接握手的目的是兼容基于HTTP的server和代理,所以一个端口可以同时服务HTTP请求和
websocket请求。

请求中Upgrage: websocket表示这是一个websocket请求。服务端收到该请求后会根据
请求中携带的Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==通过特定算法生成
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=响应给客户端,客户端校验
通过握手成功。

握手结束后,双方就可以进行双向通讯了,所有的通讯内容都以数据帧格式来传输。

数据帧

《浅析websocket》

FIN: 1比特

表示一个message中的最后一个frame。

RSV1, RSV2, RSV3: 每个1比特

必须为0,后续扩展使用。

Optcode: 4比特

定义负载数据的解析方式。

  • %x0 表示一个连续帧。

  • %x1 表示一个文本帧。

  • 0x2 表示一个二进制帧。

  • 0x3-7 保留,以后给非控制帧使用。

  • 0x8 表示连接关闭。

  • 0x9 表示ping。

  • 0xA 表示pong。

  • 0xB-F 保留,以后给控制帧使用。

Mask: 1比特

表示负载数据是否masked。如果为1,masking-key包含一个key,用来unmask负载
数据。所有从客户端方向发送的数据,该位必须置1。

*Playload length: * 7比特,7+16比特, 或者7+64比特

  • 0-125表示负载数据的长度。

  • 126,接下来的两个字节为16位无符号整型表示负载数据长度。

  • 127, 接下来的8个字节为64为无符号整型表示负载数据长度。

Masking key: 0或者4字节

如果mask标志为1时存在,保存mask key。

Payload data: 负载数据。

关闭握手过程

《浅析websocket》

关闭握手比连接握手简单的多,连接的任何一端都可以发送一个close frame,
开始关闭握手,收到这个control frame的端发送一个close frame响应,
另一端收到这个close frame后关闭连接。

一端发送close frame后就表示这个连接将会被关闭并且不会再发送任何数据到另一端, 对端
收到close frame后知道这个连接将会被关闭,后续收到的数据都会被丢弃。

websocket关闭握手的目的是完善TCP的关闭握手,因为在端到端的情景TCP的关闭握手并不
总是可信赖的,尤其端到端中间有代理或者防火墙的情况下。

通过发送一个close frame然后等待响应,这种方式避免了不必要的数据丢失。

websocket & nginx

nginx并没有支持websocket,只是支持websocket的代理。

http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream websocket {
server 192.168.100.10:8010;
}
server {
listen 8020;
location / {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
}

nginx也有第三方支持websocket的模块nchan,但
不是为流媒体设计的。

哪些服务端支持websocket

  • Node.js

    • Socket.IO

    • WebSocket-Node

    • ws

  • Java

    • Jetty

  • Rubby

    • EventMachine

  • Python

    • pywebsocket

    • Tornado

  • Erlang

    • Shirasu

  • .NET

    • SuperWebSocket

参考资料

http://blog.teamtreehouse.com/an-introduction-to-websockets

http://www.websocket.org/aboutwebsocket.html

https://www.html5rocks.com/en/tutorials/websockets/basics

https://os.alfajango.com/websockets-slides/#/2

The WebSocket Protocol


推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 近来公司前后端星散,前端自力供应页面和静态效劳很天然的就想到了用nginx去做静态效劳器。同时因为跨域了,就想应用nginx的反向代办去处置惩罚一下跨域,但是在解决题目的同时,发明 ... [详细]
  • 本文主要为大家介绍Vue结合SignalR实现前后端实时消息同步,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。最近 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
磊磊860219
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有