WebSocket 协议
WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。在这之前都是客户端主动请求服务端,一请求一应答,很多时候实现消息更新都是采用ajax轮询,有延迟,有了WebSocket双方都可以主动发给对端,实现真正的推送。
一、WebSocket Protocol Format(协议格式)
websocket报文是分段传输的,或者说分帧传输,websocket有control frames和data frames两种
control frames:opcode最高位为1的都是control frame,协议级别的控制报文帧,目前有close frame、ping frame和pong frame三种
close frame: opcode 0x8,连接任一端想关闭websocket,就发一个close frame给对端,对端收到该frame,若之前没有发过close frame,则必须回复一个close frame。发送close frame后该端就不能再发任何frame,但可以接收数据(但不能保证能接受到所有对端在收到close frame之后且在响应close frame之前发的那些data frame),close frame可以携带body(也就是报文中application data部分)以说明要关闭连接的原因,如果有body,那么body的前两个字节(unsigned)必须是status code(status code的值都是协议预定义的),接下来两个字节就没有严格的要求了
ping frame,pong frame:ping frame用来心跳检测和判断对端是否alive,连接建立后任一端都可以发送ping frame,收到ping的一端必须回复pong frame(前提是该端尚未发送close frame)
data frames:opcode最高位为0的都是data frame,应用级的数据传输帧,目前有text frame和binary frame两种,text frame使用UTF-8编码数据的
下图为RFC文档给出的协议格式:
字段解释:
FIN:1 bit,代表是否是尾帧
RSV1、RSV2、RSV3:每个1 bit,保留的,若建立连接时使用了扩展(Sec-WebSocket-Extension),那么这些位的含义应该已协商好。
opcode:4 bit,定义payload data的类型:
0x0 :continuation frame
0x1 :text frame
0x2 :binary frame
0x3 - 0x7 :保留,for non-control frame
0x8 :close frame
0x9 :ping frame
0xA :pong frame
0xB - 0xF :保留,for control-frame
MASK:表示payload data是否被masked
Payload length:7 bits 或 7 bits + 16 bits 或 7 + 64 bits。若值为
0-125 :则Payload data的长度即为该值
126 :那么接下来的2个字节才是Payload Data的长度(unsigned)
127 :那么接下来的8个字节才是Payload Tada的长度(unsigned)
Masking-Key:0 or 4 bytes,只有客户端给服务端发的包且这个包的MASK字段为1,才有该字段
Payload Data:包括Extension Data和Application Data,若handshake时使用了Sec-WebSocket-Extension,则Extension Data的长度由Sec-WebSocket-Extension的值指定,或由其推导出,Application Data的长度为Payload length - Extension Data length。若没使用Sec-WebSocket-Extension,则Extension Data 长度为0,Application Data的长度为Payload length
关于masking:
masking和unmasking算法是一样的:maskedData[i] = originData[i] ^ maskingKey[ i mod 4 ] or originData[i] = maskedData[i] ^ maskingKey[ i mod 4 ]
关于扩展(Extensibility)
websocket设计时就考虑到了扩展的问题,opcode 0x3 - 0x7 and 0xB - 0xF, frame-rsv1, frame-rsv2, frame-rsv3, extendsion data,这些字段都是为扩展保留的。是否使用扩展是在双方连接建立时就需要协商好的
二、WebSocket连接建立过程
按照RFC标准,WebSocket的的建立需要借助于HTTP,大概是这样:客户端发一个HTTP GET请求(这个请求只包含一些头部,下面有详细说明)到服务端,相当于向服务端说:我想把我们的连接升级为WebSocket,之后你得接收我的WebSocket协议包(当然HTTP也得接收),服务端收到这个HTTP消息后,如果服务端支持WebSocket,那就构造一个HTTP响应(状态码必须为101)返回,若不支持,则返回其他合理状态码的响应,以说明理由。若服务端返回101响应,则服务端就可以发送websocket消息帧了。
客户端发起的建立WebSocket连接请求的合法条件:
1.请求方式必须为GET,协议必须大于1.1
2.必须有HOST头,其格式为hostname[:port]
3.必须有Upgrade头,其值必须包含 websocket 关键字
4.必须有Connection头,其值为必须包含Upgrade
5.必须有Sec-WebSocket-Key头,其值为随机生成的16字节的值用BASE64编码后的字符串
6.若客户端为浏览器,则必须有Origin头,其值为请求发起方的hostname (因为中间可能经过代理才到达服务器,服务器可以根据该字段选择是否和客户端建立连接)
7.必须有Sec-WebSocket-Version头,其值必须为13
8.可选头Sec-WebSocket-Protocol,其值为由逗号分隔的子协议的名字,按优先度排序,每个名字必须唯一
9.可选头Sec-WebSocket-Extension,表示协议级别的扩展
10.除以上要求外,可有其它任意符合HTTP的协议头,例如cookies之类的都可以。
下面是RFC给的一个browser发起的建立WebSocket连接请求的例子:
服务端对客户端发起的建立WebSocket连接请求的响应的合法条件:
1.响应状态码必须为101
2.必须有头Upgrade,其值必须为websocket
3.必须有Connection头,其值为必须包含Upgrade
4.必须有Sec-WebSocket-Accept头,其值生成规则:服务端拿到|Sec-WebSocket -Key|,假如其为“dGhlIHNhbXBsZSBub25jZQ==”,服务端就把该串和“58EAFA5-E914-47DA-95CA-C5AB0DC85B11”(这个是固定的)拼起来,变成“dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,然后取这个串的SHA1摘要,再用BASE64编码,编码后的串即为|Sec-WebSocket-Accept|的值
5.可选头Sec-WebSocket-Protocol,其值为客户端发来的子协议中的一个或空
服务端支持WebSocket时返回的HTTP包长这样,只有返回101状态时连接才成功建立,下面前4个是必须的:
三、WebSocket连接关闭过程
关闭过程就很简单,连接任一端想关闭websocket,就发一个close frame(opcode为0x8的就是close frame)给对端,对端收到该frame,若之前没有发过close frame,则必须回复一个close frame。发送或回复close frame后该端就不能再发任何frame,但可以接收数据(但不能保证能接受到所有对端在收到close frame之后且在响应close frame之前发的那些data frame)
例子:戳我
相关推荐
WebSocket 协议实现 下面是根据给定文件生成的相关知识点: 一、WebSocket 协议简介 WebSocket 协议是一种基于 TCP 协议的双向通信协议,旨在解决浏览器和服务器之间的全双工通信问题。它可以让浏览器和服务器...
WebSocket协议手册(rfc6455中文翻译)详细介绍了WebSocket通信协议的相关知识点,以下是手册中涵盖的知识点详解: 1. WebSocket协议概述: WebSocket是一种在单个TCP连接上进行全双工通信的协议,可以实现实时的双向...
RFC6455是WebSocket协议的官方文档标准版本,由互联网工程任务组(IETF)制定,是互联网标准跟踪文件。 ### WebSocket协议概述 WebSocket协议的主要目的是为了解决传统HTTP协议在需要服务器和客户端双向通信时效率...
WebSocket协议是一种在互联网上实现全双工通信的协议,它为客户端和服务器之间提供持久连接,使得数据可以双向实时传输。这个协议的诞生解决了HTTP协议的局限性,HTTP协议是基于请求-响应模型的,每次通信都需要...
WebSocket协议是一种在互联网上实现全双工通信的协议,它为客户端和服务器提供持久性的连接,使得双向数据传输成为可能。这个协议的正式规范是IETF的RFC6455,发布于2011年12月。WebSocket的诞生是为了克服HTTP协议...
WebSocket协议实现在受控环境中运行不受信任代码的一个客户端到一个从该代码已经选择加入通信的远程主机之间的全双工通信。用于这个的安全模型是通常由web浏览器使用的基于来源的安全模型。该协议包括一个打开阶段...
### WebSocket协议中文版知识点解析 #### 一、引言 **1.1 背景** WebSocket协议旨在解决传统HTTP连接对于实时交互场景的支持不足问题。传统的HTTP协议采用请求/响应模式,即客户端向服务器发出请求后等待服务器...
《语音识别(ASR)WebSocket协议WebAPI开发详解》 语音识别技术,即Automatic Speech Recognition (ASR),是计算机科学领域的重要组成部分,它能够将人类的口头语言转化为文本信息。在现代信息技术中,ASR被广泛...
我们需要准备Jmeter的WebSocket协议的支持插件: JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar 要安装此插件,请将jar文件放入\ JMeter \ lib \ ext文件夹中。 请记住下载依赖项并将其放入同一文件夹。 您将在...
1. 文件无任何依赖可以编译成linux,window,arm平台都能使用 2. 单文件根据执行参数可以既可以当服务端用也可以当客户端用 3. 支持上传模式和下载...11. 基于websocket协议非常容易用nginx反向代理容易实现7层负载均衡
WebSocket协议是一种在客户端和服务器之间建立长连接的协议,它为双向通信提供了低延迟、高效的数据传输方式。在传统的HTTP协议中,每次请求-响应都需要重新建立连接,而WebSocket则在连接建立后可以保持长时间打开...
总的来说,WebSocket协议提供了一种高效、低延迟的双向通信机制,尤其适合实时应用,如在线游戏、股票实时报价、多人协作工具等。通过与HTTP的兼容性,它能够利用现有的网络基础设施,简化了服务器和客户端的部署和...
WebSocket协议是一种在客户端和服务器之间建立长久连接的网络通信协议,它允许双方进行全双工通信,即数据可以在任意方向上流动,而无需为每个数据包建立新的HTTP请求。WebSocket协议在现代Web应用中被广泛使用,...
基于C++实现的解析websocket协议+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于C++实现的解析websocket协议+源码,适合毕业设计、课程设计、项目开发...
WebSocket 协议分析及应用研究 WebSocket 协议是一种基于 TCP 的通信协议,旨在解决传统 HTTP 协议在实时通信中的不足。该协议的出现极大地提高了实时通信的效率和质量。WebSocket 协议的应用非常广泛,特别是在...
1. **TCP上实现**:直接基于TCP套接字构建WebSocket协议,这需要自己处理WebSocket的握手协议、帧编码和解码等细节。 2. **现有HTTP软件上实现**:利用Node.js的HTTP服务器,如`http`模块,处理WebSocket的升级请求...
WebSocket Sharp 是一个C#实现的WebSocket协议库,它支持客户端和服务端的功能,符合RFC 6455标准。这个组件不仅提供了基本的WebSocket连接管理,还包含了一些高级特性,如消息压缩、安全连接、HTTP身份验证、代理...
ActiveMQ,作为一款流行的开源消息中间件,也支持WebSocket协议,使得客户端可以通过WebSocket接口来接收和发送消息。 ActiveMQ是Apache软件基金会开发的消息队列产品,它遵循开放标准,如JMS(Java Message ...