关于websocket

简介:

这个是一次组内分享,关于websocket的协议和应用的。文章在分享之前就写好了,整理下放出来。

对应的PPT地址是:http://websocket.funaio.com

从推送技术开始说

一篇文章10 Years of Push Technology, Comet, and WebSockets(http://cometdaily.com/2011/07/06/push-technology-comet-and-websockets-10-years-of-history-from-lightstreamers-perspective/)非常详细的说明清楚了从1996-2007年推送技术的更新。2000年之前为第一波Push技术,使用的概念叫Webcasting。大致思想就是用户来服务端注册一个或者多个通道channel,然后服务端确定给某些个channel或某个channel发送消息。2000到2007年最火的词叫comet,比如有Polling(这个是最普通的轮询),Long Polling(hold住HTTP的response端,当有消息的时候才返回),至于HTTP发起是在不同的哪些地方,Ajax,Flash,Iframe,然后就有各自不同的叫法和名词。但是不管什么技术,都限制于浏览器,因为浏览器只能发起HTTP请求。但是推送最好的一种方法当然是保持Socket长连接,浏览器如何能发起TCP连接呢?HTML5的Websocket技术就解决了这个问题。

websocket概述

现状

websocket的版本发展:

draft-hixie-00

draft-hixie-76

draft-hybi-00

draft-hybi-17

RFC 6455

所以有的地方会出现hixie,hybi的字样,纯粹是为了满足之前的版本。好消息是从2011年12月份开始,websocket的RFC正式版出来了。

客户端现状

从客户端来讲,大部分浏览器支持的是hybi-13版本,比如我使用的chrome v24,firefox v16。相信各家浏览器都很快能出现支持RFC版本的浏览器了。网上有很多文章说“支持websocket的浏览器”,这个说法其实是不对的,至少是不完整的。比如Chrome从草案开始就已经支持websocket了,你拿一个支持hixie76版本的chrome调用实现了RFC 6455的服务端,那是怎么样也对不上的。所以说“支持websocket的浏览器”还应该多带一句,支持什么版本。

浏览器来说还分为手机浏览器和PC浏览器。手机浏览器特别是android上的浏览器版本支持websocket的比PC上少很多(这可能和大家几乎不会去定期更新手机浏览器有关)。网上对那些版本浏览器支持那些版本的websocket有好多文章进行统计了。但是由于浏览器种类繁多,版本之多,记住这些版本,不如在定义需求的时候明确我需要支持哪些浏览器的哪些版本,然后写一个简单例子试一下更为准确。

服务端现状

下面是服务端。服务端对websocket的语言开发已经是没有问题了。http://en.wikipedia.org/wiki/WebSocket wiki上列出了各种服务端语言开发websocket的第三方包了。可以直接拿来用,也可以根据协议自己开发个websocket包,比如http://www.cnblogs.com/yjf512/archive/2013/02/18/2915171.html。甚至于像apache,nginx(1.3.13)这些现成的web服务器产品也都渐渐支持websocket了(nginx现在只是支持nginx代理)。

socket.io这个包是node上用的最多的一个第三方包。它其实并不仅仅是websocket。官方的faq http://socket.io/#faq 也说明清楚了为什么它不直接叫“websocket”包。socket.io的js包可以给客户端使用,也可以给服务端使用,客户端使用socket.io能很简单建立websocket连接,但是上,支持websocket的浏览器是不需要使用socket.io来建立websocket连接的。在服务端,使用socket.io并不是只能创建websocket服务器,就是说socket.io要建立的服务是“socket服务”而不仅仅是“websocket服务”。

websocket的原理

websocket是一种协议,本质上和http,tcp一样。协议是用来说明数据是如何传输的。它的url前缀是ws:// 或者wss://,后者是加密的websocket。它的url诸如这样:ws://10.16.15.64:3201/

客户端和服务端进行websocket交互的方式也有人理解为“HTTP握手+TCP数据传输”的方式。

HTTP握手+TCP数据传输

握手和传输的整个流程是这样的:

浏览器(支持Websocket的浏览器)像HTTP一样,发起一个请求,然后等待服务端的响应

服务器返回握手响应,告诉浏览器请将后续的数据按照websocket制定的数据格式传过来

浏览器和服务器的socket连接不中断,此时这个连接和http不同的是它是双工的了

浏览器和服务器有任何需要传递的数据的时候使用这个长连接进行数据传递

这里说它是HTTP握手,是因为浏览器和服务器在建立长连接的握手过程是按照HTTP1.1的协议发送的,有Request,Request Header, Response, Response Header。但是不同的是Header里面的字段是有特定含义的。

说它是TCP传输,主要体现在建立长连接后,浏览器是可以给服务器发送数据,服务器也可以给浏览器发送请求的。当然它的数据格式并不是自己定义的,是在要传输的数据外层有ws协议规定的外层包的。

握手过程

Image(1)

这是一个握手过程的例子。

Upgrade头表示的意思是“客户端除了http之外也支持websocket协议,而且更倾向使用websocket,服务端如果支持的话,咱们就换websocket协议吧”

sec-websocket-version:是指出浏览器支持的websocket号。这里是支持hybi-13。这里是不会出现9-12的版本号的。websocket协议规定9-12是保留字段。

sec-websocket-key:算是一种验证返回回来的服务端是否是支持websocket的验证算法。与Response中的sec-websocket-accept是对应的。

sec-websocket-accept与sec-websocket-key的对应算法是:

sec-websocket-accept = base64(hsa1(sec-websocket-key + 258EAFA5-E914-47DA-95CA-C5AB0DC85B11))

如果返回的sec-websocket-accept不对,在chrome下会出现Sec-WebSocket-Accept dismatch的错误。

Response返回的HTTP Staus是101,代表服务端说“我们双方后面就按照websocket协议来进行数据传输吧”

数据传输过程

websocket的数据传输是frame形式传输的,比如会将一条消息分为几个frame,按照先后顺序传输出去。这样做会有几个好处:

1 大数据的传输可以分片传输,不用考虑到数据大小导致的长度标志位不足够的情况。

2 和http的chunk一样,可以边生成数据边传递消息,即提高传输效率。

传输协议:

Image(2)

FIN:1位,用来表明这是一个消息的最后的消息片断,当然第一个消息片断也可能是最后的一个消息片断

RSV1, RSV2, RSV3: 分别都是1位,如果双方之间没有约定自定义协议,那么这几位的值都必须为0,否则必须断掉WebSocket连接

Opcode:4位操作码,定义有效负载数据,如果收到了一个未知的操作码,连接也必须断掉,以下是定义的操作码:

      *  %x0 表示连续消息片断

      *  %x1 表示文本消息片断

      *  %x2 表未二进制消息片断

      *  %x3-7 为将来的非控制消息片断保留的操作码

      *  %x8 表示连接关闭

      *  %x9 表示心跳检查的ping

      *  %xA 表示心跳检查的pong

      *  %xB-F 为将来的控制消息片断的保留操作码

Mask:1位,定义传输的数据是否有加掩码,如果设置为1,掩码键必须放在masking-key区域,客户端发送给服务端的所有消息,此位的值都是1

Payload length: 传输数据的长度,以字节的形式表示:7位、7+16位、或者7+64位。如果这个值以字节表示是0-125这个范围,那这个值就表示传输数据的长度;如果这个值是126,则随后的两个字节表示的是一个16进制无符号数,用来表示传输数据的长度;如果这个值是127,则随后的是8个字节表示的一个64位无符合数,这个数用来表示传输数据的长度。多字节长度的数量是以网络字节的顺序表示。负载数据的长度为扩展数据及应用数据之和,扩展数据的长度可能为0,因而此时负载数据的长度就为应用数据的长度

Masking-key:0或4个字节,客户端发送给服务端的数据,都是通过内嵌的一个32位值作为掩码的;掩码键只有在掩码位设置为1的时候存在

Payload data: (x+y)位,负载数据为扩展数据及应用数据长度之和

Extension data:x位,如果客户端与服务端之间没有特殊约定,那么扩展数据的长度始终为0,任何的扩展都必须指定扩展数据的长度,或者长度的计算方式,以及在握手时如何确定正确的握手方式。如果存在扩展数据,则扩展数据就会包括在负载数据的长度之内

Application data:y位,任意的应用数据,放在扩展数据之后,应用数据的长度=负载数据的长度-扩展数据的长度

读取数据需要按照这个格式读取,发送数据也需要按照这个格式发送返回。

代码示例:

http://www.cnblogs.com/yjf512/archive/2013/02/18/2915171.html

应用:

1 chatofPemelo

聊天室

https://github.com/NetEase/chatofpomelo

2 osxair

远程控制air

https://github.com/jianfengye/MyWorks/tree/master/osxair

3 nginx1.3.13

nginx1.3.13只是支持了websocket代理

Feature: support for proxying of WebSocket connections.

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
目录
相关文章
|
Java 程序员 API
Springboot-swagger配置(idea社区版2023.1.4+apache-maven-3.9.3-bin)
Springboot-swagger配置(idea社区版2023.1.4+apache-maven-3.9.3-bin)
683 1
|
Arthas Prometheus Kubernetes
K8S pod内存告警分析
K8S pod内存告警分析
2386 0
|
监控 API 开发工具
HarmonyOS Next的HiLog日志系统完全指南:从入门到精通
本文深入解析HarmonyOS Next的HiLog日志系统,涵盖日志级别、核心API、隐私保护与高级回调功能,助你从入门到精通掌握这一重要开发工具。
|
人工智能 自然语言处理 数据可视化
让AI单次生成4万字!WriteHERE:开源AI长文写作框架,单次生成超长文本,小说报告一键搞定!
WriteHERE是基于异质递归规划技术的开源AI写作框架,能动态分解写作任务并管理任务依赖关系,支持单次生成超过4万字的专业报告。
2881 55
让AI单次生成4万字!WriteHERE:开源AI长文写作框架,单次生成超长文本,小说报告一键搞定!
|
5月前
|
人工智能
2026最新阿里云优惠券领取指南:代金券查询、有效期、限制及使用方法解析
2026最新阿里云优惠券指南:登录账号→【费用与成本】→【卡券】一键查询代金券、折扣券(含1728元AI焕新季券);有效期有限,过期作废;领取入口及实时查询链接已附,操作简单高效。阿里云优惠券官方领取:https://t.aliyun.com/U/kddhAx 免费领取代金券和折扣券
453 0
|
6月前
|
算法 数据管理 API
CAD 二次开发的技术难点
CAD二次开发是软件开发“深水区”:需精通编程、解析几何、拓扑关系及CAD底层数据库。2026年五大难点:复杂几何算法、数据库深度操作、大规模数据性能瓶颈、跨版本兼容性、高级UI集成。技术门槛高,稳定性与精度要求严苛。(239字)
|
10月前
|
存储 编解码 JSON
PowerToys微软最强工具箱软件集!好用的Windows增强工具箱,降低内存和存储占用
Microsoft PowerToys是微软官方推出的免费开源工具集,专为Win10/11设计,集成20+实用功能,如高级粘贴、颜色拾取、窗口布局管理(FancyZones)、文本提取、屏幕缩放标注等,全面提升办公效率,支持开发者、设计师等高效操作,模块化自由配置,堪称Windows效率神器。
1184 7
|
9月前
|
机器人 物联网 定位技术
线下引流与数据资产化核心智能设备深度解析
线下数字化正从客流统计迈向用户意图感知。猎户星空机器人、智能导视、AR试妆镜、美甲机、智能POS及NFC贴纸等设备协同,实现精准引流、体验转化与数据沉淀,构建物理空间的完整数字闭环。
398 0
|
9月前
|
机器学习/深度学习 数据采集 传感器
自变量机器人参与成立RoboChallenge组委会 开源协作开启标准化新阶段
就在11月20日,智源研究院、智元机器人、Qwen、星海图、自变量、清华大学、西安交通大学,GOSIM 国际国内合作伙伴进一步携手,共同推动生态建设,并正式成立 RoboChallenge 组委会。这标志着具身智能真机测评的开源协作不仅迈入了标准化的新阶段,更以“开放共同体”的行业共创模式,为具身智能技术的落地与迭代注入新动能。
|
9月前
|
人工智能 自然语言处理 安全
性价比高的智能客服系统推荐(2025年12月更新)
在数字化时代,智能客服已成为提升客户体验的核心。本文对比瓴羊Quick Service、合力亿捷云客服、Intercom、Freshdesk、Zendesk五大主流产品,从功能、AI能力、部署模式、行业适配等维度深入分析,结合企业规模与业务需求,提供科学选型建议,助力企业实现服务智能化升级,降本增效。

热门文章

最新文章