WebSocket网络通信协议
WebSocket网络通信协议
网络部分的方向:
- 网络编程--->
socket
编程,epoll
,reactor
--->主要解决一个server
对应多个客户端(并发)- 网络协议--->
tcp
,http
,upd
,https
--->主要解决一个客户端与一个server
之间通信的时候传输的数据格式(协议头、协议内容、ip
头、不同场景如何)
WebSocket相关内容
特点:
- 基于
tcp
的协议--->主要解决多个客户端一个服务器传输数据过程中的粘包的问题
说明:
tcp
协议的特点--->流式套接字(buffer
,特点:我发数据对方肯定能收到,对方发数据我也能收到.先发的数据先收到)--->数据必达性,数据顺序不乱
场景举例:
客户端发送两个包(package1
、package2
),服务端只调用了一次rec(fd, buffer, length, 0)
就全部接收到了.
问题:
buffer
当中包含了两个包的数据,服务端如何去区别buffer
当中是两个包数据还是一个包数据
所有tcp
的应用协议需要解决的问题:
- 如何分包(
tcp
只做到了数据必达以及先发先收) - 发送明文还是密文(
RSA
非对称还是对称)
解决办法:
- 定义长度(
length
) - 做一个分隔符
WebScoket
核心:
- 解决粘包的问题--->基于
tcp
的应用协议解决的问题就是如何粘包 - 应用于业务场景的时候,因为
websocket
只做了如何解决粘包的处理(传输是否是明文...),所以还需要加上一层关于业务场景定义的协议(里面传的数据格式与websocket
无关(比如传json
、xml
什么的))
协议说明:
例如:https://www.baidu.com
或sw://192.168.x.x:8888
xxx://
说明的是协议--->使用什么协议访问资源www.baidu.com
--->域名或者主机(去DNS
上面找到对应的域名访问)- 在下面的
/
后面的内容--->访问哪个location
--->访问什么资源
翻译:
采用什么协议访问哪台机器的哪个资源?
内容发送解析:
request
什么时候发送?--->握手handshake
(这里面没有6字节
的字节头,因为是基于tcp
协议去做的)
客户端点击连接--->调用connect
三次握手完成之后(建立好了连接),调用send(fd, buffer, length, 0)
--->这就是客户端的request
(实现websocket
客户端的时候也就是定义好request
的内容)
websocket
头--->发送数据、接收数据
http
、https
协议在发送数据的时候都会有一个协议头,协议头后面跟着的才传输内容,同样websocket
协议也有websocket
协议头--->长度为6位
- 断开连接
服务端会接收到6位长度的字节头,里面不带数据
任何一个协议设计都要设计好上述三个环节
WebSocket连接细节自问自答
- 为什么要握手?--->
websocket
基于tcp
,为什么websocket
在tcp
的连接之上还需要一个握手?
tcp
协议中客户端和服务器已经建立好连接了.websocket
为什么还要建立握手?
握手解决的问题:
- 客户端和服务器有多个协议,那么就有多个协议的版本.可以通过握手解决连接走哪个版本的协议
也可以在发送协议的时候每一个数据包前4bit
都是协议版本--->握手的好处是不需要每一个数据包都确定是哪个协议
- 兼容
http
、https
协议
websocket
协议首先是要兼容web
的协议,也就是http
和https
协议,那么websocket
当中的tcp
协议就做到了这一点,所以websocket
要在tcp
连接之后在发送握手协议
- 验证双方的身份是否合法
关注编码
web
验证身份--->authority
webscoket
验证身份--->Sec-WebSocket-Key
(字符串末尾有等号或者多个等号(base64
编码))--->服务端根据发送的sec-websocket-key
转换成sec-websocket-accept
,客户端接接收到response
的accept
以后去和key
比对,不符合就会断开连接
注意:
协议当中没有定义key
的长度,所以需要GUID
,这个GUID
起到的是填充的作用,因为accept
需要用key
做SHA-1 hash
运算
- 为什么要断开?--->
tcp
连接也可以检查出已经断开连接,websocket
为什么还要做一次断开?
websocket
在tcp
之上还做了一次断开
WebSocket两个难点
- 哪里体现出来使用的是
websocket
协议?
Upgrade: websocket
- 如何进行双方身份验证?
使用Sec-WebSocket-Key
加上GUID
进行SHA-1 Hash
运算,得到Accept
WebScokect协议在HandShake的时候和传输数据的时候为什么字节头不一样
HandShake
是基于tcp
协议进行的三次握手,所以没有6字节的字节头
WebSocket
协议传输字节图:
分析:--->最上面0、1、2、3是byte
字节,0、1、2、3、4、5、6...是bit
- 一共有
32个bit
长度,四个字节(一个字节8bit
)--->看上述图要上下看,Payload Data
是数据,前面的是协议头
测试当中为什么会有边界值一说?
因为在传输协议当中,如果传输的数据内容长度不足一定程度的话他的协议头占用的字节会不一样,在websocket
协议中,payload
长度不足126
,那么实际的协议头只有1
字节的opetioncode
操作码,1
字节长度4
字节掩码(总共6
字节)
if (payloadLength < 126)
{
sizeof websocketshake = 6; // 六字节
}else if (payloadLength == 126)
{
sizeof websocketshake = 8; // 八字节
}else {
sizeof websocketshake = 14; // 十四字节()
}// payloadLength长度要看`bit`的长度
由上述表可以看出,payloadLength
长度最长是7+64bit
10bit
--->K
,20bit
--->M
,30bit
--->G
,40bit
--->T
,50bit
--P
...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2021-04-19 4.19Java.util.Arrays类
2021-04-19 4.19Java多维数组
2021-04-19 4.19Java数组存储表格数据
2021-04-19 4.19Java数组的拷贝
2021-04-19 4.19Java内部类的分类
2021-04-19 4.19JavaString类常用的方法
2021-04-19 4.19JavaString基础