WebSocket 和 HTTP 相似,只是一个应用层协议,对下层透明,所以不涉及 TCP/IP。

由于浏览器支持了 WebSocket,所以在用 JS 写客户端的时候,是无需考虑数据的编码解码的。

以下主要针对服务器端而言。

[ 接收数据,需要做的是解码,即 decode ]

要接收WebSocket数据,一个端点(endpoint)要监听底层网络连接。

进来的数据必须作为WebSocket帧(frame)解析。https://tools.ietf.org/html/rfc6455#section-5.2

如果接收到控制帧(control frame),这个帧必须被处理。https://tools.ietf.org/html/rfc6455#section-5.5

接收到数据帧的时候,https://tools.ietf.org/html/rfc6455#section-5.6

端点(endpoint)必须把数据的 /type/ 作为已定义的 opcode(frame-opcode) 解释。https://tools.ietf.org/html/rfc6455#section-5.2

帧中的应用层数据(Application data)在消息的 /data/ 中定义。

如果帧包含一个未拆分的消息(unfragmented message),https://tools.ietf.org/html/rfc6455#section-5.4

它是在说一个包含类型 /type/ 和数据 /data/ 的WebSocket消息已被接收。

如果帧是被拆分消息(fragmented message)的一部分,应用层数据(Application data)随后的数据帧被连接起来而形成数据。

当最后一个片段(fragment)作为 FIN 比特(frame-fin)标示被接收,

说明WebSocket消息已经接收了数据 /data/(包括由片段组成的应用层数据)和类型 /type/ (碎片消息的第一帧)。

后来的数据帧必须被作为新的WebSocket解释。

扩展(extensions)可能改变数据如何读取的语义,https://tools.ietf.org/html/rfc6455#section-9

特别是包括 - 什么构成消息的边界。

在一个有效载荷(payload)中,扩展(extensions)为了在应用层数据前面添加扩展数据(extension data),可能也修改应用层数据(通过压缩它)。

服务器必须移除从客户端接收数据帧的掩码(masking)。https://tools.ietf.org/html/rfc6455#section-5.3

[ 发送数据,需要做的是编码,即 encode ]

要在一个WebSocket连接上发送包含 /data/ 的WebSocket消息,端点(endpoint)必须执行如下步骤。

1.端点(endpoint)必须保证WebSocket连接是 OPEN 状态(握手操作之后)。如果在任何端点上,WebSocket连接状态改变了,端点必须终止以下步骤。

2.端点必须封装 /data/ 到WebSocket帧中。https://tools.ietf.org/html/rfc6455#section-5.2

3.第一个数据帧的 opcode(frame-opcode)包含的数据必须 针对数据被接收者解释为文本数据或二进制数据 来设置为合适的值。https://tools.ietf.org/html/rfc6455#section-5.2

4.包含数据的最后帧FIN比特(frame-fin),必须被设置为1。https://tools.ietf.org/html/rfc6455#section-5.2

5.如果数据正在被客户端发送,帧必须被掩码。https://tools.ietf.org/html/rfc6455#section-5.3

6.如果针对WebSocket连接的扩展已经议定,额外的考虑因素可以按照这些扩展的定义来应用。https://tools.ietf.org/html/rfc6455#section-9

7.已形成的帧必须在底层网络连接上传输。

相信你也看明白了,这个过程是一个交互和阐述,实现需要遵照 section-5 的解释来 coding,而且只要实现功能,方式没有限制。

参考rfc:https://tools.ietf.org/html/rfc6455#section-6

Link:http://www.cnblogs.com/farwish/p/9011107.html

[INet] WebSocket 协议中的数据收发过程的更多相关文章

  1. FPGA的GTP(aurora 协议)高速串行接口数据收发(转)

    reference:https://blog.csdn.net/qq_40261818/article/details/83039829 PG046-Aurora 8B/10B  Logicore I ...

  2. SQL Server 向堆表中插入数据的过程

    堆表中  IAM 记录着的数据页,表的各个数据页之间没有联系.也就是说一个页面它不会知道自己的前一页是谁,也不知道自己的后一页是谁. 插入数据时先找到IAM页,再由pfs(page free spac ...

  3. WebSocket协议理解-数据包格式解析

    WebSocket 的诞生 做客户端开发时,接触最多的应用层网络协议,就是 HTTP 协议,而今天介绍的 WebSocket,下层和 HTTP 一样也是基于 TCP 协议,这是一种轻量级网络通信协议, ...

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

    一.内容概览 WebSocket的出现,使得浏览器具备了实时双向通信的能力.本文由浅入深,介绍了WebSocket如何建立连接.交换数据的细节,以及数据帧的格式.此外,还简要介绍了针对WebSocke ...

  5. WebSocket 协议

    1.1 背景知识 由于历史原因,在创建一个具有双向通信机制的 web 应用程序时,需要利用到 HTTP 轮询的方式.围绕轮询产生了 “短轮询” 和 “长轮询”. 短轮询 浏览器赋予了脚本网络通信的编程 ...

  6. WebSocket协议中文版

    WebSocket协议中文版 摘要 WebSocket协议实现在受控环境中运行不受信任代码的一个客户端到一个从该代码已经选择加入通信的远程主机之间的全双工通信.用于这个安全模型是通常由web浏览器使用 ...

  7. WebSocket协议详解及应用

    WebSocket协议详解及应用(七)-WebSocket协议关闭帧 本篇介绍WebSocket协议的关闭帧,包括客户端及服务器如何发送并处理关闭帧.关闭帧错误码及错误处理方法.本篇内容主要翻译自RF ...

  8. WebSocket 协议详解

    一.WebSocket 协议背景 早期,在网站上推送消息给用户,只能通过轮询的方式或 Comet 技术.轮询就是浏览器每隔几秒钟向服务端发送 HTTP 请求,然后服务端返回消息给客户端. 轮询技术一般 ...

  9. Websocket 协议解析

    WebSocket protocol 是HTML5一种新的协议.它是实现了浏览器与服务器全双工通信(full-duplex).          现 很多网站为了实现即时通讯,所用的技术都是轮询(po ...

随机推荐

  1. Uva - 210 - Concurrency Simulator

    自己写个双端队列,或者直接用deque,这个也比较好用 AC代码: #include <iostream> #include <cstdio> #include <cst ...

  2. HTML5哪点事

    HTML5哪点事 [引子] 微信圈里,很多朋友时常讲起HTML5,是未来很重要的一项技术,小老虎则更关注HTML5具体包含哪些技术内容. [技术内容] 1.说到底就是传统:html + css + j ...

  3. android 屏幕保持唤醒 不锁屏 android.permission.WAKE_LOCK

     In AndroidManifest.xml 加上权限: <uses-permission android:name="android.permission.WAKE_LOCK& ...

  4. 使用Gradle发布Android开源项目到JCenter

    喜欢做些开源项目的朋友,相信有不少人都希望能把自己的项目发布到公共的中央仓库,如maven中央仓库,以供别人方便地集成使用.而使用了Android Studio的同学,应该也对gradle和jcent ...

  5. kettle简介(整体架构,运行方式,使用方法)

    项目负责人Matt的说法:把各种数据放到一个壶里,然后呢,以一种你希望的格式流出.呵呵,外国人都很有联想力.看了提供的文档,然后对发布程序的简单试用后,可以很清楚得看到Kettle的四大块: Chef ...

  6. MulticastSocket 使用

    /** * ServerMulticastSocketTest.java * 版权所有(C) 2014 * 创建者:cuiran 2014-1-9 下午3:22:01 */ package com.u ...

  7. MTK Android添加驱动模块

    1 [编写linux驱动程序] 1.1 一.编写驱动核心程序 1.2 二.配置Kconfig 1.3 三.配置Makefile 1.4 四.配置系统的autoconfig 1.5 五.编译 2 [编写 ...

  8. OpenCV——照亮边缘

    具体的算法原理可以参考: PS滤镜,照亮边缘 // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_ ...

  9. Android绘图机制(一)——自定义View的基础属性和方法

    Android绘图机制(一)--自定义View的基础属性和方法 自定义View看起来,确实看起来高深莫测,很多Android开发都不是特别在行这一块,这里面的逻辑以及一些绘画都是有一点难的,说一下我目 ...

  10. MR PAGERANK思路

    map( key: [url, pagerank], value: outlink_list ) for each outlink in outlink_list emit( key: outlink ...