WebSocket协议深入理解

1.WebSocket和HTTP的关系

WebSocket只有在建立握手连接的时候借用了HTTP协议的头,连接成功后的通信部分都是基于TCP的连接。总体来说,WebSocket协议是HTTP协议的升级版。

2.研究WebSocket的思路

服务器端自己实现WebSocket非常复杂。我们虽然不求能够完全自己实现,但是还是应该了解一下后端实现WebSocket的整体思路。

WebSocket的实现主要分为两个部分:建立连接(握手)和数据传输。下面对这两个过程分别进行分析。

3.建立连接

(1)客户端发送请求

WebSocket协议的实现首先需要客户端和服务器进行握手连接。首先客户端向服务器发送请求,请求报文中的重点内容如下:

GET /chat HTTP/1.1

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

从GET处可以看出,这是一个基于HTTP的请求。接下来的Upgrade字段和Connection字段完成了对HTTP协议的升级(HTTP Upgrade Request)。Upgrade字段通知服务器,现在要使用一个升级版协议——websocket。接下来是Sec-WebSocket-Key字段,这个字段是一串生成的BASE64加密的密钥,它被一同发送到服务器端。

此外还有诸如Sec-WebSocket-Version、Sec-WebSocket-Protocol等字段,由于是可选字符,对WebSocket协议的实质影响不大,同时为了文章更简洁更容易理解,先不进行介绍。

(2)服务器端进行处理

服务器收到客户端请求后要进行响应。首先服务器需要处理客户端传递过来的Sec-WebSocket-Key。服务器端有一个全局唯一标识符GUID,这个是固定的。服务器端将客户端传来的字符串和服务器端的GUID拼接到一起后进行SHA1处理,再进行一次BASE64加密,准备将其返回客户端。

(3)服务器端返回响应

服务器端处理完成后,将给客户端返回响应报文,重要部分如下:

HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

第一行再次表明此次连接的建立是以HTTP协议为基础的。同时返回了101状态码。101状态码是switching protocols,表示服务器已经理解了客户端的请求,并将通过Upgrade子段通知客户端采用WebSocket协议来完成这个请求。那么协议是什么时候升级到WebSocket的呢?当发送完这个响应最后的空行后,服务器就会切换到Upgrade消息头定义的WebSocket协议。至此完成了从HTTP协议升级的WebSocket协议的过程。同时需要注意,如果返回的状态码不是101,就表示握手升级的过程失败了。

中间两行就不用说了,最后一行Sec-WebSocket-Accept返回的就是服务器端处理后的字符串。只有返回了这个字符串才表明握手成功了,返回其他的字符串都表示握手失败。


4.数据传输

WebSocket的数据帧格式如下:

这里需要对数据帧进行一个解析,需要返回一个由键值对组成对象,这里先不对解析数据帧的方法进行解析。这个对象就是解析后的数据帧,里面有各个字段以及对应的值。对每个字段的含义如下:

FIN      表示信息的最后一帧,flag,也就是标记符

RSV 1-3  以后备用的,默认都为 0

Opcode   帧类型

Mask     掩码,表示是否加密数据,默认必须置为1 (这里很蛋疼)

Payload  数据的长度

Masking-key   掩码

Payload data  数据

Extension data   扩展数据

Application data 程序数据

将数据帧解析之后,生成的就是上面各个字段加其对应的值。这里面的重点部分是Opcode和Payload data字段。Opcode表示帧类型,每次用户代理接收到数据包时,都要先对Opcode进行判断。Opcode的状态值及其对应含义列表如下:

0        Continuation Frame

1        Text Frame

2        Binary Frame

8        Connection Close Frame

9        Ping Frame

10      Pong Frame

判断了Opcode后,根据Opcode的具体状态,决定如何对PayLoad data的数据进行解析,从而进行数据传输。

时间: 2024-10-24 15:26:02

WebSocket协议深入理解的相关文章

WebSocket协议理解

WebSocket 的诞生 做客户端开发时,接触最多的应用层网络协议,就是 HTTP 协议,而今天介绍的 WebSocket,下层和 HTTP 一样也是基于 TCP 协议,这是一种轻量级网络通信协议,也属于应用层协议. WebSocket 与 HTTP/2 一样,其实都是为了解决 HTTP/1.1 的一些缺陷而诞生的,而 WebSocket 针对的就是「请求-应答」这种"半双工"的模式的通信缺陷. 「请求-应答」是"半双工"的通信模式,数据的传输必须经过一次请求应答

Websocket协议的学习、调研和实现

1. websocket是什么 Websocket是html5提出的一个协议规范,参考rfc6455. websocket约定了一个通信的规范,通过一个握手的机制,客户端(浏览器)和服务器(webserver)之间能建立一个类似tcp的连接,从而方便c-s之间的通信.在websocket出现之前,web交互一般是基于http协议的短连接或者长连接. WebSocket是为解决客户端与服务端实时通信而产生的技术.websocket协议本质上是一个基于tcp的协议,是先通过HTTP/HTTPS协议发

游戏网络编程(三)——WebSocket入门及实现自己的WebSocket协议

(一)WebSocket简介 短连接:在传统的Http协议中,客户端和服务器端的通信方式是短连接的方式,也就是服务器端并不会保持一个和客户端的连接,在消息发送后,会断开这个连接,客户端下次通信时,必须再建立和服务器的新连接,这就是短连接.在短链接的情况下,客户端必须不停的主动发起请求,而服务器始终被动的响应请求,来推送回数据.这种方式用到游戏开发中,显然是不适合的. 长连接:那么与之相对的就是长连接了.在长连接的情况下,客户端和服务器端始终保持一条有效的连接,那么客户端并不需要不停的主动发送消息

Android最佳实践——深入浅出WebSocket协议

首先明确一下概念,WebSocket协议是一种建立在TCP连接基础上的全双工通信的协议.概念强调了两点内容: TCP基础上 全双工通信 那么什么是全双工通信呢? 全双工就是指客户端和服务端可以同时进行双向通信,强调同时.双向通信 WebSocket可以应用于即时通信等场景,比如现在直播很火热,直播中的弹幕也可以使用WebSocket去实现. WebSocket的协议内容可以见The WebSocket Protocol,讲得最全面的官方说明.简单介绍可以见维基百科WebSocket 在Andro

MQTT协议笔记之mqtt.io项目Websocket协议支持

前言 MQTT协议专注于网络.资源受限环境,建立之初不曾考虑WEB环境,倒也正常.虽然如此,但不代表它不适合HTML5环境. HTML5 Websocket是建立在TCP基础上的双通道通信,和TCP通信方式很类似,适用于WEB浏览器环境.虽然MQTT基因层面选择了TCP作为通信通道,但我们添加个编解码方式,MQTT Over Websocket也可以的. 这样做的好处,MQTT的使用范畴被扩展到HTML5.桌面端浏览器.移动端WebApp.Hybrid等,多了一些想像空间.这样看来,无论是移动端

WebSocket协议:5分钟从入门到精通

一.内容概览 WebSocket的出现,使得浏览器具备了实时双向通信的能力.本文由浅入深,介绍了WebSocket如何建立连接.交换数据的细节,以及数据帧的格式.此外,还简要介绍了针对WebSocket的安全攻击,以及协议是如何抵御类似攻击的. 二.什么是WebSocket HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议.它基于TCP传输协议,并复用HTTP的握手通道. 对大部分web开发者来说,上面这段描述有点枯燥,其实只要记住几点: WebSocket可以在浏

刨根问底 HTTP 和 WebSocket 协议(上)

HTTP vs WebSocket 那天和boss聊天,不经意间提到了Meteor,然后聊到了WebSocket,然后就有了以下对话,不得不说,看问题的方式不同,看到的东西也会大不相同. A:Meteor是一个很新的开发框架,我觉得它设计得十分巧妙. B:怎么个巧妙之处? A:它的前后端全部使用JS,做到了真正的前后端统一:前端浏览器里存有一份后台开放出来的数据库的拷贝,快:使用WebSocket协议来做数据传输协议,来同步前后端的数据库,实现了真正的实时同步. B:哦?WebSocket是什么

WebSocket协议探究(三):MQTT子协议

一 复习和目标 1 复习 Nodejs实现WebSocket服务器 Netty实现WebSocket服务器(附带了源码分析) Js api实现WebSocket客户端 注:Nodejs使用的Socket.io模块实现,Netty本身对WebSocket有一定的支持,所以这两种实现都相对容易理解,大家自己可以使用自己喜欢的语言实现(参考Nodejs版本,即不需要考虑过多的情况). 2 目标 使用WebSocket协议进行发送Mqtt消息 即Mqtt协议作为WebSocket协议的子协议进行通信 注

WebSocket协议与抓包

WebSocket协议 WebSocket并不是全新的协议,而是利用了HTTP协议来建立连接,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消息给浏览器 WebSocket连接必须由浏览器发起,因为请求协议是一个标准的HTTP请求,格式如下: GET ws://localhost:3000/ws/chat HTTP/1.1 Host: localhost Upgrade: websocket Connection: Upgrade Origin: