是基于TCP的

tcp特征:

  • 我发数据对端可以接收到,对端发数据我可以收到
  • 先发先收到,后发后收到

使用websocket客户端发给服务器数据,服务器回客户端返回数据流程(自定义websocket协议需要从下三个部分考虑)

1、握手  handshake

2、发送数据和接收数据

3、断开(客户端点击断开按钮)

一、握手

问:Tcp已经握手了,为什么需要websocket需要再次握手?

答:

1、握手过程

2、服务端如果根据key换算生成一个key返回给客户端进行身份验证

过程: 身份验证的key的换算过程

1、接收到的key与一个guid字符连接

问:guid是固定的且公开的,那么为什么必须要这步呢?

答:起到填充的作用,避免传的字符少的时候不方便进行哈希

2、对新的字符进行哈希

3、做完哈希后得到sha,对哈希后的值进行base64编码

4、最后得到一个字符返回给客户端(也就是Sec-WebSocket-Accept:……)

二、发送数据过程

考虑(发送长度问题、明文还是密文)

websocket头(协议)+(payload)数据

a、不出现分包和粘包情况:

只有在发送数据,每个数据包很小,每个包之间加个延迟发送,就不用考虑分包粘包

b、数据包太大肯定要考虑分包和粘包:(websocket协议来解决分包粘包)

分包和粘包解决:1、对每个数据包前后(开始和结尾)加个分隔符

              2、定一个包头(包头里面有包总长度)   下面为包头组成详解

1、客户端向服务端发送数据(服务端得到的信息)

客户端:

服务端:

2、websocket协议(包头)

通过上面传输过程得知上面发送数据后,多出来的6个字节,那这个websocket的头就是6个字节(字节总数-发送数据字节数=websocket协议头)

包头的组成部分

  •   标识     =>可以根据自己喜好定义一些标识
  •        长度      =>这个长度有说法,不同的长度会影响这个websocket协议的字节长度(详看下图剖析)
  •        masking-key    =>明文、暗文的key   1密文  0明文

2-2、叙述上面发送数据案例多的6个字节是什么?

1Byte=8bit                      32bit=4字节

图剖析:

剖析一:

协议头是由这部分组成

剖析二:

剖析三:

由剖析二剖析可以看到红框内一共是14个字节,但是其中有两个if

剖析四:

其中包含有两个if,payload长度满足一定条件才会算上这个字节

三种情况:根据payload长度判断

所以上面发送案例中:接收到了13个字节,实际发送给的数据7个字节,多出来的6个字节就是websocket协议头的长度

如图:

综上所述:

一个websocket包最大可以传输73bits     payload length=73bits

playload length三种情况

2.3 发送数据为明文还是暗文

密文:

对称加密:1、base64、对每个字节取反     (弊端:A客户端的密文在B客户端也可以被解出来)

           2、异或      (好处:A客户端的密文在B客户端不可以被解出来)

             用法:对每一个字节流做个异或

传递一个32bit(4字节)的value对数据进行异或 :(可以是随机的)

异或操作公式:

异或案例解释:循环异或:案例说明

(异或中的maskkey的值是在协议头中的)

发送数据公式参数剖析:

recv(fd,buffer,length,0)

fd:

buffer:

length:是buffer的长度

  • 若定义char buffer[1024] ,length就是填1024
  • 填长度的意义是防止包越界

0:0明文或1暗文

三、断开

websokcet为什么单独定义一个终止包?

客户端点击断开:发送的内容如下图(只发了一个协议头,内容data为空)  --终止包

接收包的协议头第一个bit(FIN)为1表示断开websocket

需要两步:1、协议头中的FIN为1,发送一个终止包,表示:先把服务端关于websocket的资源清空

2、发送FIN后,第二步调用close  ,表对应示四次挥手的断开

Websocket(websocket自定义协议)的更多相关文章

  1. websocket以及自定义协议编程一些总结

    以下仅供自己翻阅,因为时间久了会忘2.发送缓冲区主要是为了处理发送前一些小内容,可以自己控制flush,或者write的不是那么频繁因为没必要.至于大内容就没必要了.3.其实tcp以上的通信协议也好, ...

  2. springBoot -webSocket 基于STOMP协议交互

    浅谈WebSocket WebSocket是在HTML5基础上单个TCP连接上进行全双工通讯的协议,只要浏览器和服务器进行一次握手,就可以建立一条快速通道,两者就可以实现数据互传了.说白了,就是打破了 ...

  3. 采用自定义协议代替OCX组件

    事情起源:公司视频播放一直是采用的嵌入浏览器组件实现视频的预览回放等功能.这种实现方式要求客户使用IE浏览器. 最近上线项目使用Html 5开发,要求IE11.项目中使用了视频播放功能,如果全部升级到 ...

  4. netty 自定义协议

    netty 自定义协议 netty 是什么呢? 相信很多人都被人问过这个问题.如果快速准确的回复这个问题呢?网络编程框架,netty可以让你快速和简单的开发出一个高性能的网络应用.netty是一个网络 ...

  5. Websocket——Websocket原理

    偶然在知乎上看到一篇回帖,瞬间认为之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有.所以转到我博客里,分享一下.比較喜欢看这样的博客,读起来非常轻松.不枯燥,没有布道师的 ...

  6. 利用Netty构建自定义协议的通信

    在复杂的网络世界中,各种应用之间通信需要依赖各种各样的协议,比如:HTTP,Telnet,FTP,SMTP等等. 在开发过程中,有时候我们需要构建一些适应自己业务的应用层协议,Netty作为一个非常优 ...

  7. C#综合揭秘——通过修改注册表建立Windows自定义协议

    引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...

  8. 【Win10 UWP】URI Scheme(二):自定义协议的处理和适用场景

    上一篇提到Windows Store协议的使用,其实Windows Store协议仅是系统内建的一种协议规则.我们也可以自己定义一套规范的URI-Scheme,除了可以给其他App调用外,本应用也可以 ...

  9. java-cef系列视频第四集:自定义协议

    上一集我们介绍了如何为java-cef添加flashplayer支持. 本视频介绍java-cef中的自定义协议 本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 中国大陆许可协议进行许可.

  10. 【转】C#综合揭秘——通过修改注册表建立Windows自定义协议

    引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...

随机推荐

  1. c++ 从编译到执行

    参考博客 原理分析 结合实例 看别人的博客上拼出答案.不会就先模仿吧. 这个是今日头条面试时候的一个题目,当时别提答的多烂了,感觉一个题目准备深了还是非常耗费时间的.小论文一样.c/c++从编译到执行 ...

  2. js正则匹配多行文本

    原文:https://lwebapp.com/zh/post/regular-expression-to-match-multiple-lines-of-text 需求 最近有小伙伴提了个需求,想用正 ...

  3. 实验四:开源控制器实践——OpenDaylight

    实验要求: (一)基本要求: 1.利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight控制器: 2.通过Postman工具调用OpenDaylight提供的API下发流表,实现拓 ...

  4. Linux 部署apache2.4

    apache httpd-2.4.46.tar.gz部署环境 Linux6.5 依赖包: apr-1.6.3.tar.gz apr-util-1.5.2.tar.gz 先部署apr 1.tar -xf ...

  5. Windows11使用WSL Ubuntu搭建paddle的GPU环境

    Windows11使用WSL Ubuntu搭建paddle的GPU环境 最近升级到了Windows11,突然有个大胆的想法:在Windows11上安装WSL,将所有开发环境安装到WSL中.这样就能在w ...

  6. iPhone添加节假日日历地址

    添加苹果节假日日历地址 手动订阅节假日: 打开"设置">"日历">"帐户">"添加帐户">&qu ...

  7. ETCD 实现服务发现讲解

    租约:具有时间有效期,键绑定到租约后,当租约到期失效,绑定到的租约的键也会被删除. 创建租约 etcdctl lease grant 600 lease 694d81f509b7940a grante ...

  8. leecode75. 颜色分类

    75. 颜色分类 给定一个包含红色.白色和蓝色.共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 我们使用整数 0. 1 和 2 分别表示 ...

  9. 浅谈dfs深度优先搜索

    深度优先搜索(Depth First Search)是一种常见的暴力算法 此算法上限和下限较高,容易上手,适用情形多,学习性价比高 下限高于有固定的模板,且时间复杂度明显优于暴力枚举,容易拿到题目部分 ...

  10. OS-lab4

    OS-lab4 系统调用 系统调用的流程 按照上述的流程逐个分析. user/syscall_lib.c 这个文件位于user文件夹下,也就是用户程序可以调用的函数,相当于操作系统提供给用户程序的一些 ...