WebSocket协议的握手和数据帧
websocket wireshark解析

websocket wireshark解析WebSocket 是一种基于 TCP 的全双工通信协议,它在单个 TCP 连接上进行全双工通信,允许服务器主动向客户端推送数据。
Wireshark 是一款开源的网络协议分析器,可以用来捕获和分析网络数据包,包括 WebSocket 通信的数据包。
使用 Wireshark 对 WebSocket 通信进行解析,可以帮助我们深入了解 WebSocket 协议的工作原理和通信过程。
下面是一些关于如何使用 Wireshark 解析 WebSocket 通信的详细步骤和注意事项:启动 Wireshark 并开始捕获数据包:在 Wireshark 中选择正确的网络接口,并开始捕获数据包。
确保在捕获数据包之前已经建立了 WebSocket 连接。
过滤 WebSocket 数据包:在 Wireshark 的过滤器栏中输入 "websocket",以过滤出所有的 WebSocket 数据包。
这样可以帮助我们更快速地找到和分析 WebSocket 通信的数据包。
分析 WebSocket 握手协议:WebSocket 的握手协议是基于 HTTP 协议的,因此在Wireshark 中可以看到 WebSocket 握手的数据包。
分析这些数据包可以帮助我们了解WebSocket 连接的建立过程,包括协议版本、子协议选择等信息。
分析 WebSocket 数据帧:WebSocket 通信的数据是以帧(frame)为单位进行传输的。
在 Wireshark 中可以看到每个 WebSocket 数据帧的详细信息,包括帧类型(如文本帧、二进制帧等)、数据载荷、掩码等。
通过分析这些数据帧,我们可以了解 WebSocket 通信的数据内容和格式。
需要注意的是,WebSocket 通信是加密的,因此在分析 WebSocket 数据包时可能需要使用解密工具或密钥来解密数据包。
此外,由于 WebSocket 通信是基于 TCP 协议的,因此在分析数据包时还需要考虑 TCP 协议的相关知识和技巧。
websocket前后端交互原理

websocket前后端交互原理WebSocket是一种在客户端和服务器之间进行双向实时通信的网络协议。
它的前后端交互原理如下:1. 握手阶段:WebSocket的握手阶段采用HTTP协议来进行,客户端发送一条HTTP请求给服务器,请求中包含websocket协议版本号、握手密钥等信息。
服务器接收到请求后进行验证,如果验证通过,便返回101状态码表示握手成功,并将协议升级为WebSocket。
2. 连接建立:握手成功后,客户端和服务器之间的WebSocket连接建立。
客户端和服务器都可以通过send方法发送消息,通过onmessage事件来接收消息。
这种双向通信的特性使得实时数据的传输成为可能。
3. 数据传输:客户端和服务器之间通过WebSocket连接传输消息。
客户端可以通过send方法将消息发送给服务器,服务器可以通过send方法将消息发送给指定客户端,或者通过广播的方式发送给所有客户端。
客户端和服务器通过onmessage事件来接收消息。
4. 保持连接:WebSocket连接是持久化的,与传统的HTTP请求不同,它不需要每次请求都建立连接和断开连接,而是通过一次握手后保持连接,并可以长时间保持打开状态。
这样可以减少网络的开销和延迟,并且可以随时进行双向通信。
5. 断开连接:当客户端或服务器需要断开WebSocket连接时,可以通过调用close方法来关闭连接。
在关闭连接之前,可以发送close帧来告知对方即将关闭连接。
客户端和服务器可以通过onclose事件来监听连接的关闭事件。
总结:WebSocket前后端交互的原理是通过握手阶段建立连接,然后进行数据的传输。
WebSocket连接是持久化的,可以随时进行双向通信,并且可以长时间保持打开状态,从而实现实时的双向通信。
与传统的HTTP请求相比,WebSocket具有更低的开销和延迟,更适合实时数据传输的场景。
websocket通讯机制

websocket通讯机制
WebSocket通信机制是一种在Web应用程序中实现实时双向通信的技术。
它允许客户端和服务器之间建立持久的连接,以便它们可以直接交换数据而无需经过传统的HTTP请求-响应循环。
WebSocket的通讯机制包括以下几个方面:
1. 握手协议,WebSocket通信的第一步是通过HTTP协议进行握手。
客户端发起WebSocket连接请求时,服务器需要响应并升级连接协议为WebSocket。
在握手阶段,客户端和服务器交换协议版本、支持的子协议、扩展等信息。
2. 建立连接,一旦握手成功,客户端和服务器之间就建立了持久的双向连接。
这个连接是全双工的,意味着客户端和服务器都可以同时发送和接收数据。
3. 数据传输,一旦连接建立,客户端和服务器就可以通过WebSocket协议直接发送和接收数据帧。
这些数据帧可以是文本数据、二进制数据或者控制帧,用于控制连接状态。
4. 心跳检测,WebSocket连接通常需要进行心跳检测,以确保
连接的可靠性。
客户端和服务器定期发送心跳包来检测连接是否存活,如果一方长时间未收到对方的心跳包,则可以断开连接。
总的来说,WebSocket通信机制通过握手协议建立连接,然后
通过持久的双向连接实现实时的数据传输,同时保持连接的可靠性。
这种机制使得WebSocket成为了实现实时通信的理想选择,例如在
线聊天、实时游戏等场景都可以使用WebSocket来实现。
Websocket协议(一)Websocket协议简述

Websocket协议(⼀)Websocket协议简述⽬的:即时通讯,替代轮询应⽤场景:⽹站上的即时通讯是很常见的,⽐如⽹页的QQ,聊天系统等。
按照以往的技术能⼒通常是采⽤轮询、Comet技术解决。
HTTP协议是⾮持久化的,单向的⽹络协议,在建⽴连接后只允许浏览器向服务器发出请求后,服务器才能返回相应的数据。
当需要即时通讯时,通过轮询在特定的时间间隔(如1秒),由浏览器向服务器发送Request请求,然后将最新的数据返回给浏览器。
这样的⽅法最明显的缺点就是需要不断的发送请求,⽽且通常HTTP request的Header是⾮常长的,为了传输⼀个很⼩的数据需要付出巨⼤的代价,是很不合算的,占⽤了很多的宽带。
缺点:会导致过多不必要的请求,浪费流量和服务器资源,每⼀次请求、应答,都浪费了⼀定流量在相同的头部信息上然⽽WebSocket的出现可以弥补这⼀缺点。
在WebSocket中,只需要服务器和浏览器通过HTTP协议进⾏⼀个握⼿的动作,然后单独建⽴⼀条TCP的通信通道进⾏数据的传送。
原理:WebSocket同HTTP⼀样也是应⽤层的协议,但是它是⼀种双向通信协议,是建⽴在TCP之上的。
连接过程 —— 握⼿过程1. 浏览器、服务器建⽴TCP连接,三次握⼿。
这是通信的基础,传输控制层,若失败后续都不执⾏。
2. TCP连接成功后,浏览器通过HTTP协议向服务器传送WebSocket⽀持的版本号等信息。
(开始前的HTTP握⼿)3. 服务器收到客户端的握⼿请求后,同样采⽤HTTP协议回馈数据。
4. 当收到了连接成功的消息后,通过TCP通道进⾏传输通信。
WebSocket与HTTP的关系相同点都是⼀样基于TCP的,都是可靠性传输协议。
都是应⽤层协议。
不同点WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息。
HTTP是单向的。
WebSocket是需要握⼿进⾏建⽴连接的。
联系WebSocket在建⽴握⼿时,数据是通过HTTP传输的。
websocket协议面试内容

websocket协议面试内容WebSocket是一种在Web浏览器和服务器之间进行全双工通信的网络协议。
相比传统的HTTP协议,在实时通信和数据传输方面具有明显优势。
WebSocket允许服务器主动向客户端发送数据,而不需要客户端发起请求,大大提高了实时性和效率。
一、WebSocket协议的定义和特点WebSocket协议是HTML5新增的通信协议,它基于TCP协议,通过在客户端和服务器之间建立持久连接,实现了双向通信。
WebSocket协议的特点如下:1. 实时性:WebSocket建立了长连接,实现了服务器主动推送数据,相比传统的轮询和长轮询方式,大大减少了服务器和网络的压力。
2. 高效性:WebSocket协议采用了二进制帧和掩码机制,减少了数据传输的开销和延迟。
3. 跨域支持:WebSocket协议支持跨域通信,可以在不同域之间进行数据传输。
4. 广泛应用:WebSocket协议被广泛应用于在线聊天、实时更新、数据推送等领域。
二、WebSocket协议的工作原理1. 握手阶段:客户端发送一条特殊的HTTP请求到服务器,服务器进行握手确认,并返回状态码101 Switching Protocols表示握手成功。
2. 数据传输阶段:握手成功后,双方建立了持久连接,可以进行双向通信。
客户端和服务器通过发送和接收帧进行数据交换,帧包含数据的标识和实际数据。
三、在面试中常见的WebSocket相关问题1. WebSocket和HTTP协议有什么区别?回答:WebSocket是一种全双工通信协议,实现了实时性和高效性的数据传输;而HTTP协议是一种请求-响应协议,每次请求需要客户端主动发起,相比WebSocket延迟较高。
2. WebSocket如何处理心跳或保持连接?回答:WebSocket协议本身是支持心跳的,可以通过定期发送心跳帧到服务器来维持连接。
若服务器一定时间内未接收到心跳帧,可以主动关闭连接。
websocket 协议格式

websocket 协议格式WebSocket是一种在客户端和服务端之间实现双向通信的网络协议。
WebSocket协议的格式如下:首先,建立WebSocket连接需要进行握手,握手请求包括以下信息:1. 请求行:包括请求方法(通常为"GET")和请求的URL路径。
2. 请求头:包含一些额外的信息,如Host、Upgrade、Connection、Sec-WebSocket-Key等。
3. 空行:在请求头后面是一个空行。
示例:```GET /chat HTTP/1.1Host: Upgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==Sec-WebSocket-Version: 13```接下来,服务端需要进行握手响应,响应包括以下信息:1. 状态行:包括响应状态码和描述。
2. 响应头:包含一些额外的信息,如Upgrade、Connection、Sec-WebSocket-Accept等。
3. 空行:在响应头后面是一个空行。
示例:```HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= ```握手成功后,客户端和服务端之间的通信就可以使用WebSocket协议格式进行。
WebSocket数据传输格式如下:WebSocket的数据格式分为两种帧类型:控制帧和数据帧。
1. 控制帧(Control Frames):控制帧用于在连接建立后进行控制和管理。
常见的控制帧有:- 关闭帧(Close Frame):用于关闭连接。
- Ping帧(Ping Frame):用于检测连接是否存活。
- Pong帧(Pong Frame):用于响应Ping帧。
websocket,二进制协议

websocket,二进制协议篇一:WebSocket协议的握手和数据帧WebSocket协议的握手和数据帧WebSocket是定义服务器和客户端如何通过Web通信的一种网络协议。
协议是通信的议定规则。
组成互联网的协议组由IETF(互联网工程任务组)发布。
IETF发布评议请求(Request for Comments,RFC),精确地规定了协议(包括RFC 6455):WebSocket协议。
RFC 6455于2011年12月发布,包含了实现WebSocket客户端和服务器时必须遵循的规则。
websocket基本上是一个很简单的协议, 主要流程非常少, 实现起来也很简单。
为简单起见, 下面只分析握手和数据帧的报文.一. 握手(handshake).握手协议由客户端发起, 服务器响应, 一来一回就完成了. 基本上是为了兼容现有的http基础设施.下面是一个客户端发起的握手请求: 47 45 54 20 2F 20 48 54 54 50 2F 31 2E 31 0D 0A GET./.HTTP/1.1..55 70 67 72 61 64 65 3A 20 77 65 62 73 6F 63 6B Upgrade:.websock65 74 0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 et..Connection:.5570 67 72 61 64 65 0D 0A 48 6F 73 74 3A 20 31 Upgrade..Host:.139 32 2E 31 36 38 2E 38 2E 31 32 38 3A 31 33 30 92.168.8.128:13030 0D 0A 4F 72 69 67 69 6E 3A 20 6E 75 6C 6C 0D 0..Origin:.null.0A 50 72 61 67 6D 61 3A 20 6E 6F 2D 63 61 63 68 .Pragma:.no-cach65 0D 0A 43 61 63 68 65 2D 43 6F 6E 74 72 6F 6C e..Cache-Control3A 20 6E 6F 2D 63 61 63 68 65 0D 0A 53 65 63 2D :.no-cache..Sec-57 65 62 53 6F 63 6B 65 74 2D 4B 65 79 3A 20 64 WebSocket-Key:.d33 35 39 46 64 6F 36 6F 6D 79 71 66 78 79 59 46 359Fdo6omyqfxyYF37 59 61 63 77 3D 3D 0D 0A 53 65 63 2D 57 65 62 7Yacw==..Sec-Web53 6F 63 6B 65 74 2D 56 65 72 73 69 6F 6E 3A 20 Socket-Version:.31 33 0D 0A 53 65 63 2D 57 65 62 53 6F 63 6B 65 13..Sec-WebSocke74 2D 45 78 74 65 6E73 69 6F 6E 73 3A 20 78 2D t-Extensions:.x-77 65 62 6B 6974 2D 64 65 66 6C 61 74 65 2D 66 webkit-deflate-f72 61 6D 65 0D 0A 55 73 65 72 2D 41 67 65 6E 74 er-Agent3A 20 4D 6F 7A 69 6C 6C 61 2F 35 2E 30 20 28 57 :.Mozilla/5.0.(W69 6E 64 6F 77 73 20 4E 54 20 36 2E 31 3B 20 57 indows.NT.6.1;.W4F 57 36 34 29 20 41 70 70 6C 65 57 65 62 4B 69 OW64).AppleWebKi74 2F 35 33 37 2E 33 36 20 28 4B 48 54 4D 4C 2C t/537.36.(KHTML,20 6C 69 6B 65 20 47 65 63 6B 6F 29 20 43 68 72 .like.Gecko).Chr6F 6D 652F 33 32 2E 30 2E 31 36 35 33 2E 30 20 ome/32.0.1653.0.53 61 66 61 72 69 2F 35 33 37 2E 33 36 0D 0A 0D Safari/537.36...0A0D 0A 0D 0A, 也就是用\r\n\r\n收尾, 这和http头没什么区别. 转换成字符串就是: GET / HTTP/1.1Upgrade: websocketConnection: UpgradeHost: 192.168.8.128:1300Origin: nullPragma: no-cacheCache-Control: no-cacheSec-WebSocket-Key: d359Fdo6omyqfxyYF7Yacw==Sec-WebSocket-Version: 13Sec-WebSocket-Extensions: x-webkit-deflate-frameUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1653.0 Safari/537.36其中有一对重要的kv, 就是Sec-WebSocket-Key: d359Fdo6omyqfxyYF7Yacw==, 看上去是一个base64编码后的结果, 服务器需要对这个sec-key作一些处理, 并返回握手响应, 这个处理是:也就是原封不动的拿着这个sec-key和另一个神奇的字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11相连, 再经过sha1摘要算法处理, 最后再经过base64编码输出即可, 上面的输出结果应该是:pLO2KC7b5t0TZl1E6A3sqJ6EzU4=服务器在收到握手请求后, 如果愿意提供服务, 则返回一个握手响应, 如下:遵循http的规则, 字节流上一样是要以\r\n\r\n收尾.二. 数据帧rfc6455上叫做非控制帧, 除了非控制帧之外, 就是控制帧. 包括connection close, ping, pong等帧, 这里只讲非控制帧, 也就是数据帧.数据帧从长度上可以分为三种. 帧中的静荷数据(payload data)长度小于0x7E的为小帧, 静荷数据长度=0x7E又<=0x10000的为中帧,再长的叫大帧.数据帧从类型上暂时可以分为两种, 文本帧和二进制帧.例子:a). 一个从客户端发向服务端的小帧.82二进制为: 1000 0010, 最高位(FIN)为1, 表示这是最后一帧, 第一个帧也可能是最后一帧. 身后还有三位为预留. 低位四0010为操作码.也就是0x02, 表示这是一个二进制帧, 0x01为文本帧.B0二进制为: 1011 0000, 最高位(MASK)为1, 表示当前帧的静荷数据部分使用了掩码, 事实上, rfc6455规定从客户端发往服务器端的数据帧必需使用掩码, 反过来, 从服务器发回来的, 则必需不使用掩码. 低7位为静荷数据长度字段, 这里是011 0000, 也就是0x30, 从上面的报文上看, 这个0x30没有包含后面的掩码.6A F7 C6 30掩码, 掩码总是四个字节.0A D9 C6...一直到最后为经过掩码加工后的静荷数据. 要回到数据本来的面目, 使用下面的算法:得到的结果应该是:b). 一个从服务器发给客户端的小帧.更简单了, 还是82, 最后一帧, 二进制帧, 29, 0010 1001, 无掩码, 也就是身后全长为0x29.c). 未使用掩码的中帧.81 7E 01 00 66 77 88 ..., 帧长为0x0100, 也就是256个字d). 未使用掩码的大帧.82 7F 00 00 00 00 11 22 33 44 66 77 88 ..., 帧长为0x0000000011223344, 直接跳过4字节, 而使用8字节来表示长度, 非常暴力.这里需要注意的是, websocket要求使用最小帧原则, 也就是静荷数据长度小于0x7E帧, 不能使用中帧或大帧的来表示. 长度小于0x10000的帧也不能用大帧来表示.【编辑推荐】1. 网络协议X档案网络传输协议篇2. 应用Wireshark观察基本网络协议3. 移动网络性能揭秘--网络协议及性能提升实践篇二:一步一步学WebSocket (一) 初识WebSocket众所周知,Http协议是无状态的,并且是基于Request/Response的方式与服务器进行交互,也就是我们常说的单工模式。
websocket工作原理

websocket工作原理
WebSocket是一种在单个TCP连接上进行全双工通信的协议,它允许客户端和服务器之间进行实时的双向数据传输。
WebSocket的工作原理如下:
1. 客户端发起WebSocket握手:客户端通过发送HTTP请求
向服务器发起WebSocket握手请求,请求头中包含Upgrade字段,值为WebSocket,以及Sec-WebSocket-Version和Sec-WebSocket-Key等字段。
2. 服务器响应WebSocket握手:服务器收到客户端的握手请
求后,根据协议进行解析,验证请求头信息的正确性,并生成Key和Accept等字段。
服务器通过HTTP响应返回这些信息,并将HTTP状态码设为101表示切换到了WebSocket协议。
3. WebSocket连接建立:客户端收到服务器的响应后,验证响
应头信息的正确性。
如果验证通过,则WebSocket连接建立
成功。
4. 数据传输:WebSocket连接建立后,客户端和服务器可以通
过该连接进行双向通信。
客户端和服务器可以直接发送原始数据帧,无需进行额外的HTTP请求。
5. 连接关闭:当客户端或服务器决定关闭连接时,可以发送特殊的关闭数据帧来通知对方关闭连接。
对方收到关闭数据帧后,也会进行关闭操作。
WebSocket的工作原理基于HTTP协议的升级机制,通过握手过程建立起全双工的通信连接。
相比于传统的HTTP请求响应模式,WebSocket提供了更低的延迟和更高的实时性,适用于实时应用程序和实时数据传输场景。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WebSocket协议的握手和数据帧
WebSocket是定义服务器和客户端如何通过Web通信的一种网络协议。
协议是通信的议定规则。
组成互联网的协议组由IETF(互联网工程任务组)发布。
IETF发布评议请求(Request for Comments,RFC),精确地规定了协议(包括RFC 6455):WebSocket协议。
RFC 6455于2011年12月发布,包含了实现WebSocket客户端和服务器时必须遵循的规则。
websocket基本上是一个很简单的协议, 主要流程非常少, 实现起来也很简单。
为简单起见, 下面只分析握手和数据帧的报文.
一. 握手(handshake).
握手协议由客户端发起, 服务器响应, 一来一回就完成了. 基本上是为了兼容现有的http 基础设施.
下面是一个客户端发起的握手请求:
47 45 54 20 2F 20 48 54 54 50 2F 31 2E 31 0D 0A GET./.HTTP/1.1..
55 70 67 72 61 64 65 3A 20 77 65 62 73 6F 63 6B Upgrade:.websock 65 74 0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 et..Connection:.
55 70 67 72 61 64 65 0D 0A 48 6F 73 74 3A 20 31 Upgrade..Host:.1 39 32 2E 31 36 38 2E 38 2E 31 32 38 3A 31 33 30 92.168.8.128:130 30 0D 0A 4F 72 69 67 69 6E 3A 20 6E 75 6C 6C 0D 0..Origin:.null. 0A 50 72 61 67 6D 61 3A 20 6E 6F 2D 63 61 63 68 .Pragma:.no-cach 65 0D 0A 43 61 63 68 65 2D 43 6F 6E 74 72 6F 6C e..Cache-Control 3A 20 6E 6F 2D 63 61 63 68 65 0D 0A 53 65 63 2D :.no-cache..Sec- 57 65 62 53 6F 63 6B 65 74 2D 4B 65 79 3A 20 64 WebSocket-Key:.d 33 35 39 46 64 6F 36 6F 6D 79 71 66 78 79 59 46 359Fdo6omyqfxyYF 37 59 61 63 77 3D 3D 0D 0A 53 65 63 2D 57 65 62 7Yacw==..Sec-Web 53 6F 63 6B 65 74 2D 56 65 72 73 69 6F 6E 3A 20 Socket-Version:.
31 33 0D 0A 53 65 63 2D 57 65 62 53 6F 63 6B 65 13..Sec-WebSocke 74 2D 45 78 74 65 6E 73 69 6F 6E 73 3A 20 78 2D t-Extensions:.x- 77 65 62 6B 69 74 2D 64 65 66 6C 61 74 65 2D 66 webkit-deflate-f 72 61 6D 65 0D 0A 55 73 65 72 2D 41 67 65 6E 74 er-Agent 3A 20 4D 6F 7A 69 6C 6C 61 2F 35 2E 30 20 28 57 :.Mozilla/5.0.(W 69 6E 64 6F 77 73 20 4E 54 20 36 2E 31 3B 20 57 indows.NT.6.1;.W 4F 57 36 34 29 20 41 70 70 6C 65 57 65 62 4B 69 OW64).AppleWebKi 74 2F 35 33 37 2E 33 36 20 28 4B 48 54 4D 4C 2C t/537.36.(KHTML, 20 6C 69 6B 65 20 47 65 63 6B 6F 29 20 43 68 72 .like.Gecko).Chr 6F 6D 65 2F 33 32 2E 30 2E 31 36 35 33 2E 30 20 ome/32.0.1653.0.
53 61 66 61 72 69 2F 35 33 37 2E 33 36 0D 0A 0D Safari/537.36... 0A
0D 0A 0D 0A, 也就是用"\r\n\r\n"收尾, 这和http头没什么区别. 转换成字符串就是:
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 192.168.8.128:1300
Origin: null
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: d359Fdo6omyqfxyYF7Yacw==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1653.0 Safari/537.36
其中有一对重要的kv, 就是Sec-WebSocket-Key: d359Fdo6omyqfxyYF7Yacw==, 看上去是一个base64编码后的结果, 服务器需要对这个sec-key作一些处理, 并返回握手响应, 这个处理是:
也就是原封不动的拿着这个sec-key和另一个神奇的字符串
"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"相连, 再经过sha1摘要
算法处理, 最后再经过base64编码输出即可, 上面的输出结果应该是:
pLO2KC7b5t0TZl1E6A3sqJ6EzU4=
服务器在收到握手请求后, 如果愿意提供服务, 则返回一个握手响应, 如下:
遵循http的规则, 字节流上一样是要以"\r\n\r\n"收尾.
二. 数据帧
rfc6455上叫做非控制帧, 除了非控制帧之外, 就是控制帧. 包括connection close, ping, pong等帧, 这里只讲非控制帧, 也就是数据帧.
数据帧从长度上可以分为三种. 帧中的静荷数据(payload data)长度小于0x7E的为小帧, 静荷数据长度 >=0x7E又<=0x10000的为中帧,
再长的叫大帧.
数据帧从类型上暂时可以分为两种, 文本帧和二进制帧.
例子:
a). 一个从客户端发向服务端的小帧.
82
二进制为: 1000 0010, 最高位(FIN)为1, 表示这是最后一帧, 第一个帧也可能是最后一帧. 身后还有三位为预留. 低位四0010为操作码.
也就是0x02, 表示这是一个二进制帧, 0x01为文本帧.
B0
二进制为: 1011 0000, 最高位(MASK)为1, 表示当前帧的静荷数据部分使用了掩码, 事实上, rfc6455规定从客户端发往服务器端的数据帧
必需使用掩码, 反过来, 从服务器发回来的, 则必需不使用掩码. 低7位为静荷数据长度
字段, 这里是011 0000, 也就是0x30, 从上面的报文上
看, 这个0x30没有包含后面的掩码.
6A F7 C6 30
掩码, 掩码总是四个字节.
0A D9 C6...一直到最后为经过掩码加工后的静荷数据. 要回到数据本来的面目, 使用下面的算法:
得到的结果应该是:
b). 一个从服务器发给客户端的小帧.
更简单了, 还是82, 最后一帧, 二进制帧, 29, 0010 1001, 无掩码, 也就是身后全长为0x29.
c). 未使用掩码的中帧.
81 7E 01 00 66 77 88 ..., 帧长为 0x0100, 也就是256个字节.
d). 未使用掩码的大帧.
82 7F 00 00 00 00 11 22 33 44 66 77 88 ..., 帧长为0x0000000011223344, 直接跳过4字节, 而使用8字节来表示长度, 非常暴力.
这里需要注意的是, websocket要求使用最小帧原则, 也就是静荷数据长度小于0x7E帧, 不能使用中帧或大帧的来表示. 长度小于
0x10000的帧也不能用大帧来表示.
【编辑推荐】
1.网络协议X档案网络传输协议篇
2.应用Wireshark观察基本网络协议
3.移动网络性能揭秘--网络协议及性能提升实践。