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版本)简介的更多相关文章
- MODBUS-RTU通讯协议简介
MODBUS-RTU通讯协议简介 什么是MODBUS? MODBUS 是MODICON公司最先倡导的一种软的通讯规约,经过大多数公司 的实际应用,逐渐被认可,成为一种标准的通讯规约,只要按照这种规 ...
- Mavlink - 无人机通讯协议
http://qgroundcontrol.org/mavlink/start mavlink协议介绍https://pixhawk.ethz.ch/mavlink/ 消息简介 MAVLink简介 M ...
- MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制
最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2 ...
- 一文详解 WebSocket 网络协议
WebSocket 协议运行在TCP协议之上,与Http协议同属于应用层网络数据传输协议.WebSocket相比于Http协议最大的特点是:允许服务端主动向客户端推送数据(从而解决Http 1.1协议 ...
- CNN 美国有线电视新闻网 wapCNN WAP 指无线应用通讯协议 ---- 美国有线电视新闻网 的无线应用
wapCNN wap指无线应用通讯协议 CNN美国有线电视新闻网 固, wapCNN 美国有线电视新闻网的无线应用 -------------------------------------- ...
- TCP/IP 中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议
原文地址:http://hi.baidu.com/albyuyrgqgbbhoq/item/65006d2d002ab33195f62ba1 TCP/IP(Transmission Control P ...
- 通讯协议序列化解读(二) protostuff详解教程
上一篇文章 通讯协议序列化解读(一):http://www.cnblogs.com/tohxyblog/p/8974641.html 前言:上一面文章我们介绍了java序列化,以及谷歌protobu ...
- MySQL 通讯协议
Client/Server 通讯协议用于客户端链接.代理.主备复制等,支持 SSL.压缩,在链接阶段进行认证,在执行命令时可以支持 Prepared Statements 以及 Stored Proc ...
- http协议与url简介(转)
一 知识简介 HTTP:(Hypertext transfer protocol)超文本传输协议,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议. URL ...
随机推荐
- [POI2010]Blocks
题目大意: 给你一个长度为n的数列,给你m个数k. 对于每个k,你可以进行若干次操作,每次把一个超过k的数的多余部分移到旁边一个数. 问对于每个k,进行若干次操作以后,最长的满足每个数都不小于k的区间 ...
- [CF3B]Lorry
题目大意: 有$n(n\leq 10^5)$个物品,背包的容量为$m(m\leq 10^9)$.每个物品有重量$w_i(w_i\in\{1,2\})$和价值$v_i(v_i\leq 10^4)$.问最 ...
- Flash 3D学习计划
1.理解并记住3D渲染的一般管线流程(一天). 2.理解世界,取景,投影变换,并理解投影坐标系(一天). 3.学习VB,IB相关,理解三角形顶点顺序:在屏幕上显示2D矩形,并实现缩放,平移,旋转(三天 ...
- InputSplit—>RecordReder—>map(key,value,context)的过程解析
上图首先描述了在TaskTracker端Task(MapTask.ReduceTask)的执行过程,MapTask(org.apache.hadoop.mapred)首先被TaskRunner调用,然 ...
- C语言基础之for循环的使用
一.for循环格式. 1: for (语句1; 条件; 语句2) 2: 3: { 4: 5: 循环体 6: 7: } 8: 9: 具体: 10: 11: 语句1:初始化语句 12: ...
- 关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-通知(Advice)API
本文翻译自Spring.NET官方文档Version 1.3.2. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他人提供帮助. 侵删. 让我们看看 Spring.N ...
- 【译】PHP之道(PHP the right way)
刚入门的同学觉得自己能用PHP写出各种程序就很NB了,但其实作为一个专业程序员,你得有个全面点的知识结构.单元测试总得听过,文档工具总得用用,Xss总得会防.推荐大家把<PHP the righ ...
- java.lang.NoSuchFieldError:INSTANCE
Java.lang.NoSuchFieldError: INSTANCE异常,可能是包重复了. 我遇到的情况是maven里引入了一个JAR,而我又在lib里面引入了这个jar,并且版本还不相同,就出了 ...
- this的四种绑定规则总结
一.默认绑定 1.全局环境中,this默认绑定到window 2.函数独立调用时,this默认绑定到window console.log(this === window);//true functio ...
- 使用老版本的java api提交hadoop作业
还是使用之前的单词计数的例子 自定义Mapper类 import java.io.IOException; import org.apache.hadoop.io.LongWritable; impo ...