websocket通讯协议(10版本)简介

前言:

工作中用到了websocket 协议10版本的,英文的协议请看这里:

http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10

这篇文章相当于工作的总结吧。

首先, 你需要简单了解一下为什么会诞生websocket通讯协议,web上的通讯一般都是基于HTTP(超文本传输协议)的通讯,故而没有建立长时间的网络连接的方法,一般的通讯都是这样子的:

请求

浏览器--------------------->服务器

<-----------------------

响应

这种连接都是客户端发起的,服务器回复数据后关闭连接。

就好像你用浏览器访问百度输入www.baidu.com后,浏览器发起请求,百度的服务器将该页面的html超文本传给你的浏览器后关闭连接。

这种连接时间很短的, 而且服务器无法主动传送数据。

举几个例子:

优酷, 土豆这些网站可以在网上播放电影,播放电影需要持续传送数据的,故只能内嵌flash播放器,用flash中的flash socket持续传送数据。

用html, js等编写一个及时聊天软件是很困难的,关键就在于不能建立持续的连接,服务器不能主动传送数据给客户端。只能隔一段时间客户端发起请求主动询问服务器有无数据?

websocket可以建立稳定的连接,能解决上述的问题。

先说下原理,稍后会把代码文件穿上来给大家下载。

websocket通讯过程:

1.客户端发起连接请求

websocket客户端首先发起一个连接请求,发送的数据格式如下:

GET /10.15.1.218:12345/chat?key=value\r\n

HTTP/1.1\r\n Upgrade: websocket\r\n Connection: Upgrade\r\n Host: 10.15.1.218:12345\r\n Sec-WebSocket-Origin: null\r\n Sec-WebSocket-Key: 4tAjitqO9So2Wu8lkrsq3w==\r\n Sec-WebSocket-Version: 8\r\n\r\n

这是类似于HTTP的头,注意每行数据结尾结束符是"\r\n", 最后的结束符是"\r\n\r\n"。

请求头第1行详解:

“GET /”后面是服务器的IP和端口(10.15.1.218:12345)必须有。‘/‘的后面是你自己字符串,(chat),随便你传什么,这部分是可选的。字符串 ‘?’后面是一些参数(key=value),是什么你自己定义, 这部分也是可选的。像下面这三种都是合法的:

GET /10.15.1.218:12345\r\n

或者

GET /10.15.1.218:12345/chat\r\n

或者

GET /10.15.1.218:12345/chat?key=value\r\n

第2, 3, 4, 5, 6行:

HTTP/1.1\r\n Upgrade: websocket\r\n Connection: Upgrade\r\n Host: 10.15.1.218:12345\r\n Sec-WebSocket-Origin: null\r\n

这些都基本是固定的格式与内容,Host: 后面是服务器(被连接者)的IP和Port。

第7行:

Sec-WebSocket-Key: 4tAjitqO9So2Wu8lkrsq3w==\r\n
      Sec-WebSocket-Key后面的那一串东西,那一串长度为24的字符串是客户端随机生成的,我们暂时叫他cli_key,服务器必须用它经过一定的运算规则生成服务器端的key,暂时叫做ser_key,然后把ser_key发回去,客户端验证正确后,握手成功!

第8行:

Sec-WebSocket-Version: 8\r\n\r\n

之所以版本为8的原因,我不太清楚。10版本的通讯协议中客户端发出的都是8。

chrome 14浏览器中实现了websocket客户端,不用自己实现。可以去下载一个,当websocket客户端用。

2.制作服务端的密钥

我们的服务器将key1(长度24)截取出来

4tAjitqO9So2Wu8lkrsq3w==

用它和自定义的一个字符串(长度36):

258EAFA5-E914-47DA-95CA-C5AB0DC85B11

连接起来,像这样:

4tAjitqO9So2Wu8lkrsq3w==258EAFA5-E914-47DA-95CA-C5AB0DC85B11

然后把这一长串经过SHA-1算法加密,得到长度为20字节的二进制数据,

再将这些数据经过Base64编码,最终得到服务端的密钥,也就是ser_key:

bEVeGLZrb9fS3Rj8WzExJdCsedg=

3.服务端返回密钥

然后需要把密钥返回给客户端,完成握手,发送的数据格式如下:

HTTP/1.1 101 Switching Protocols\r\n

Upgrade: websocket\r\n

Connection: Upgrade\r\n

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

至此,算是握手成功了!

4.传输数据(简单的介绍数据长度小于126的数据传输,传输大于等于126字节的数据头部(head)可就不止2个字节了,去看英文文档中介绍头部的部分)

必须有掩码

客户端----------------------->服务器

<-----------------------

掩码(可选)

协议中规定客户端发向服务器的数据必须有掩码,比如需要发送一个字符串“Hello”,

“Hello“的ascii码:

H        e              l            l            o

十六进制         0x48     0x65        0x6c     0x6c     0x6f

十进制             72        101          108      108       111

但是实际发出的数据是这样的:

------------------head-----掩码0----1-------2-------3-----H----e-----l------l-------o--------------

0x81 0x85   0x37  0xfa   0x21    0x3d 0x7f 0x9f 0x4d 0x51 0x58

head头部我不在这里说了,需要很多文字才能说明,自己去英文协议中相关地方查看一下吧,head后是4字节的掩码,随机生成的,再后面是数据了,你可能发现数据变了,这些数据是 hello的ascii码和掩码做异或运算算出来的。

运算规则是这样的, 第零个字符‘H‘和第零个掩码异或, 第一个字符‘e‘和第一个掩码异或......

其实就是用c语言表示就是res = str[n]^mask[n%4]

服务器发出数据可以有掩码, 也可以没有掩码

发出一个“Hello”字符串可以发出和客户端一样的数据,也可以发出像下面的无掩码的:

0x81 0x05 0x48 0x65 0x6c 0x6c 0x6f                                      H       e       l        l       o

这就是头部信息加上原始数据啦。

5. 关闭连接

这部分很简单,或许你可以去英文协议中找到它看一看。

websocket通讯协议(10版本)简介

时间: 2024-11-14 02:22:20

websocket通讯协议(10版本)简介的相关文章

2018-2019-1 20165212 实验五 通讯协议设计

2018-2019-1 20165212 实验五 通讯协议设计 OpenSSL简介 OpenSSL是为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用. OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不应该只将其作为一个库来使用,它还是一个多用途的.跨平台的密码工具. 1.基本功能 OpenSSL整个软件包大概可以分成三

Websocket全讲解。跨平台的通讯协议 !!基于websocket的高并发即时通讯服务器开发。

本博文,保证不用装B的话语和太多专业的语言,保证简单易懂,只要懂JAVAEE开发的人都可以看懂. 本博文发表目的是,目前网上针对Websocket的资料太散乱,导致初学者的知识体系零零散散,学习困难加大.本博加以整理,并且实践. 所用核心技术选型: Tomcat + Spring 4.0.3 + Mongodb(高并发数据库) + SpringQueue(消息队列)+ ActiveMQ (消息队列) + Spring-data-Mongo + Servlet 3.0 +Spring-Websoc

MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制

最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2M和物联网IoT的连接协议,采用轻量级发布和订阅消息传输机制.Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用. 基本概念 [MQTT协议特点]——相比于RESTful架构的物联网系统,MQ

Mavlink - 无人机通讯协议

http://qgroundcontrol.org/mavlink/start mavlink协议介绍https://pixhawk.ethz.ch/mavlink/ 消息简介 MAVLink简介 Mavlink协议最早由 苏黎世联邦理工学院 计算机视觉与几何实验组 的 Lorenz Meier于2009年发布,并遵循LGPL开源协议.Mavlink协议是在串口通讯基础上的一种更高层的开源通讯协议,主要应用在微型飞行器(micro aerial vehicle)的通讯上.Mavlink是为小型飞

关于物联网通信协议(通讯协议)

一.区分通讯与通信协议:1.传统意义上的"通讯"主要指电话.电报.电传.通讯的"讯"指消息(Message),媒体讯息通过通讯网络从一端传递到另外一端.媒体讯息的内容主要是话音.文字.图片和视频图像.其网络的构成主要由电子设备系统和无线电系统构成,传输和处理的信号是模拟的.所以,"通讯"一词应特指采用电报.电话.网络等媒体传输系统实现上述媒体信息传输的过程."通讯"重在内容形式,因此通讯协议主要集中在ISO七层协议中的应用层.

信息安全系统设计基础实验五:通讯协议设计

北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:52.53 姓名:王思亓 赵阳林 学号:20135205 20135334 成绩: 指导教师:娄嘉鹏 实验日期:2015.11.24 实验密级: 预习程度: 实验时间:15:30—18:00 仪器组次: 必修/选修:必修 实验序号: 实验名称:通讯协议设计 实验目的与要求:1.掌握在ARM开发板实现一个简单的WEB服务器的过程.2.学习在ARM开发板上的SOCKET网络编程.3.学习Linux下的signal()函

实验五:通讯协议设计

北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础               班级:1453班 姓名:彭垚                 学号:20145317 成绩:            指导教师:娄嘉鹏           实验日期:2016.11.16 实验密级:        预习程度:               实验时间10:00-12:00 仪器组次:         必修/选修:必修             实验序号:五 实验名

几种通讯协议的比较

几种通讯协议的比较 一.综述 本文比较了RMI,Hessian,Burlap,Httpinvoker,web service等5种通讯协议的在不同的数据结构和不同数据量时的传输性能. RMI是java语言本身提供的远程通讯协议,稳定高效,是EJB的基础.但它只能用于JAVA程序之间的通讯. Hessian和Burlap是caucho公司提供的开源协议,基于HTTP传输,服务端不用开防火墙端口.协议的规范公开,可以用于任意语言. Httpinvoker是SpringFramework提供的远程通讯

2017-2018-1 20155333 《信息安全系统设计基础》实验五通讯协议设计

2017-2018-1 20155333 <信息安全系统设计基础>实验五通讯协议设计 实验五 通讯协议设计-1 要求 在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作业 提交运行结果截图 OpenSSL简介 OpenSSL是一个SSL协议的开源实现,采用C语言作为开发语言,具备了跨平台的能力,支持Unix/Linux.Windows.Mac OS等多种平台. OpenSSL最早的版本在1995年发布,1998年后开始由Ope