WebSocket数据包协议详解

其实我一直想不明白HTML5包装个应用层办议作为Socket通过基础目的是为了什么,其实直接支持Socket tcp相对来说更加简单灵活.既然标准已经制定而浏览器也支持那对于我们开发者来说只能用的分.最新版本的WebSocket协议于2011-12其标准规范已经明确下来,所以现在可以根据这标准进行相应的开发.详细参考http://datatracker.ietf.org/doc/rfc6455/?include_text=1

WebSocket协议主要分为两部分,第一部分是连接许可验证和验证后的数据交互.连接许可验证比较简单,由Client发送一个类似于HTTP的请求,服务端获取请求后根据请求的KEY生成对应的值并返回.

连接请求内容:


1

2

3

4

5

6

7

8

GET / HTTP/1.1

Connection:Upgrade

Host:127.0.0.1:8088

Origin:null

Sec-WebSocket-Extensions:x-webkit-deflate-frame

Sec-WebSocket-Key:puVOuWb7rel6z2AVZBKnfw==

Sec-WebSocket-Version:13

Upgrade:websocket

服务端接收请求后主要是成针对Sec-WebSocket-Key生成对就Sec-WebSocket-Accept 的key,生成Sec-WebSocket-Accept 值比较简单就是Sha1(Sec-WebSocket-Key+258EAFA5-E914-47DA-95CA-C5AB0DC85B11)即可,C#代码如下:


1

2

3

4

5

SHA1 sha1 = new SHA1CryptoServiceProvider();

byte[] bytes_sha1_in = Encoding.UTF8.GetBytes(request.SecWebSocketKey+ "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");

byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);

string str_sha1_out = Convert.ToBase64String(bytes_sha1_out);

response.SecWebSocketAccept = str_sha1_out;

服务端返回内容:


1

2

3

4

5

6

7

8

HTTP/1.1 101 Switching Protocols

Connection:Upgrade

Server:beetle websocket server

Upgrade:WebSocket

Date:Mon, 26 Nov 2012 23:42:44 GMT

Access-Control-Allow-Credentials:true

Access-Control-Allow-Headers:content-type

Sec-WebSocket-Accept:FCKgUr8c7OsDsLFeJTWrJw6WO8Q= 

经过服务器的返回处理后连接握手成功,后面就可以进行TCP通讯.WebSocket在握手后发送数据并象下层TCP协议那样由用户自定义,还是需要遵循对应的应用协议规范...这也是在文章之说没有直接基于Socket tcp方便的原因.

 数据交互协议:

这图有点难看懂...里面包括几种情况有掩码,数据长度小于126,小于UINT16和小于UINT64等几种情况.后面会慢慢详细说明.整个协议头大概分三部分组成,第一部分是描述消息结束情况和类型,第二部分是描述是否存在掩码长度,第三部分是扩展长度描述和掩码值.

从图中可以看到WebSocket协议数据主要通过头两个字节来描述数据包的情况

第一个字节

最高位用于描述消息是否结束,如果为1则该消息为消息尾部,如果为零则还有后续数据包;后面3位是用于扩展定义的,如果没有扩展约定的情况则必须为0.可以通过以下c#代码方式得到相应值


1

mDataPackage.IsEof = (data[start] >> 7) > 0;

最低4位用于描述消息类型,消息类型暂定有15种,其中有几种是预留设置.c#代码可以这样得到消息类型:


1

2

int type = data[start] & 0xF;

mDataPackage.Type = (PackageType)type;

第二个字节

消息的第二个字节主要用一描述掩码和消息长度,最高位用0或1来描述是否有掩码处理,可以通过以下c#代码方式得到相应值


1

bool hasMask = (data[start] >>7) > 0;

剩下的后面7位用来描述消息长度,由于7位最多只能描述127所以这个值会代表三种情况,一种是消息内容少于126存储消息长度,如果消息长度少于UINT16的情况此值为126,当消息长度大于UINT16的情况下此值为127;这两种情况的消息长度存储到紧随后面的byte[],分别是UINT16(2位byte)和UINT64(4位byte).可以通过以下c#代码方式得到相应值


1

2

3

4

5

6

7

8

9

10

11

12

mPackageLength = (uint)(data[start] & 0x7F);

start++;

if (mPackageLength == 126)

{

    mPackageLength = BitConverter.ToUInt16(data, start);

    start = start + 2;

}

else if (mPackageLength == 127)

{

    mPackageLength = BitConverter.ToUInt64(data, start);

    start = start + 8;

}

如果存在掩码的情况下获取4位掩码值:


1

2

3

4

5

6

7

8

if (hasMask)

{

    mDataPackage.Masking_key = new byte[4];

    Buffer.BlockCopy(data, start, mDataPackage.Masking_key, 0, 4);

          

    start = start + 4;

    count = count - 4;

}

获取消息体

当得到消息体长度后就可以获取对应长度的byte[],有些消息类型是没有长度的如%x8 denotes a connection close.对于Text类型的消息对应的byte[]是相应字符的UTF8编码.获取消息体还有一个需要注意的地方就是掩码,如果存在掩码的情况下接收的byte[]要做如下转换处理:


1

2

3

4

5

6

if (mDataPackage.Masking_key != null)

    {

        int length = mDataPackage.Data.Count;

        for (var i = 0; i < length; i++)

            mDataPackage.Data.Array[i] = (byte)(mDataPackage.Data.Array[i] ^ mDataPackage.Masking_key[i % 4]);

    }

时间: 2024-07-29 13:44:28

WebSocket数据包协议详解的相关文章

TCP/IP数据包格式详解-包括数据链路层的头部

图中括号中的数字代表的是当前域所占的空间大小,单位是bit位. 黄色的是数据链路层的头部,一共14字节 绿色的部分是IP头部,一般是20字节 紫色部分是TCP头部,一般是20字节 最内部的是数据包内容 黄色部分:链路层 目的MAC:当前step目的主机的mac地址 源MAC:当前step的源主机的mac地址 类型:指定网络层所用的协议类型,通常是IP协议,0x0800 绿色部分:网络层,这里用的是IP包头格式 版本:记录数据报属于哪一个版本的协议,如IPv4或IPv6 首部长度:指明IP头部长度

Linux 网络编程——IP 数据包格式详解

IP 数据报首部 TCP/IP 协议定义了一个在因特网上传输的包,称为 IP 数据报 (IP Datagram).这是一个与硬件无关的虚拟包,由首部和数据两部分组成. 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的.在首部的固定部分的后面是一些可选字段,其长度是可变的.首都中的源地址和目的地址都是 IP 协议地址. IP 数据报首部的固定部分中的各字段: 1)版本:占4位,指IP协议的版本. 通信双方使用的 IP 协议版本必须一致.日前广泛使用的 IP 协议版本号为 4

网络层协议介绍,IP包格式详解+ARP原理(重点3,网络小白必备知识)

一.我们先回顾一下网络层是我们网络基础七层原理的哪一层是我们的第三层,这个数据包里面有IP头部,TC头部和上层数据二.网络层的功能网路层数据包里面的IP地址相当于我们的逻辑地址,全局地址,在全球当中我们的电脑会被分配到一个地址.三.数据包格式详解版本:我们现在有两个版本IPV4,IPV6,首先我们的IP地址的资源是有限的,我们暂时处于这两个的中间,全球60几亿人.首部长度:就是我们头部格式的长度,不包含上层数据优先级与服务类型:决定什么数据先发送,就比如我们QQ发消息给别人,同时我们还在下载东西

Google Chrome抓包分析详解

Google Chrome抓包分析详解 一:什么是抓包 即抓取我们本地电脑与远端服务器通信时候所传递的数据包 二:Chrome浏览器讲解 Chrome 开发者工具是一套内置于Google Chrome中的Web开发和调试工具,可用来对网站进行迭代.调试和分析 三:打开Chrome开发者工具 在Chrome界面按F12 or在页面元素上右键点击,选择“检查” 四:开发者工具的结构 Elements(元素面板):使用“元素”面板可以通过自由操纵DOM和CSS来重演您网站的布局和设计. Console

HTTP协议详解

HTTP协议详解 转载(http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html) 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了Web应用程序的内部工作. 本文将对HTTP协议进行详细的实例讲解,内容较多,希望大家耐心看.也希望对大家的开发工作或者测试工作有所帮助.使用Fidd

DHCP协议详解

DHCP协议详解 定义:DHCP(Dynamic Host Configuration Protocol)动态主机配置协议,主要作用是为局域网内的主机自动分配IP地址.DCHP工作在应用层,是BOOTP(Bootscrap Protocol)的一种扩展,使用UDP协议进行运输,UDP67和UDP68端口分别作为DHCPServer和DHCP Client的服务端口.DHCP协议内容在RFC2131中定义,而DHCP Options在RFC2132中定义. DHCP的4次握手 测试方法:为了抓到D

IP协议详解

IP协议详解 前言 本屌今天可算是累坏了,一大早起来本来寻思赶快centOS虚拟机玩玩吧,那天刚装了系统,本来的虚拟机没了,今天想着先把centOS装上,结果给个系统不停的给我扯淡啊,显示虚拟机上不去网,好不容易上去网了,ping不通主机,主机ping不通虚拟机,各种办法都试了,最后我吧VMware8那块网卡禁用了,卧槽!!啥都好了,本屌一直鼓捣到晚上八点,从早晨10点多.服了我自己了. 引入 在前面的学习中,我们简单地IP接力和IP地址后,咱们今天具体的说说IP协议的具体细节和设计哲学. IP

HTTP协议详解以及URL具体访问过程

1.简介 1.1.HTTP协议是什么? 即超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准.从网络参考模型来看,它是属于应用层.它规定了计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. 简单的来说,它就是基于应用层一个规范一个标准!通讯双发都需要遵守这一准则,这就是http协议! 1.2.http简史

(转)HTTP协议详解

HTTP协议详解 一.概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. HTTP协议,即超文本传输协议(Hypertext transfer protocol).是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议. HTTP协议是用于从WWW服务器传输超文本到本地