Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update WebSocket.md #40

Merged
merged 1 commit into from
Jun 19, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 40 additions & 3 deletions notes/WebSocket.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,46 @@ HTTP/1.1 101 Switching Protocols:101状态码表示升级协议,在返回101
以上为注册标准格式,后面注册成功后,可以只发具体的Lapi协议。

# 5. 个人认为核心知识点&HTTP或TCP等:
1. 连接建立过程
2. 连接释放过程
3. 连接生命周期
1. 连接建立过程: **通过HTTP 1.1建立连接**后,服务端WebSocketServerProtocolHandler在接收指定url升级连接(Connection: Upgrade,Upgrade: websocket, Sec-Websocket-Key等)请求通过后,响应101状态码(Connection: Upgrade,Upgrade: websocket,Sec-WebSocket-Accept)响应之后,连接就与HTTP无关了,变成了WebSocket连接
2. 连接释放过程:若服务端不支持的自定义协议或掩码错误、或操作码中为close
3. 连接生命周期:连接建立后就是持久性连接。对于需要区分空间连接或忙碌状态,有**操作码**close、ping、pong这几种控制码;

WebSocket协议的通信报文是二进制格式,大致包含以下字段:
(1)FIN: 占用一个bit位。如果其值是1(抓包工具显示为true),表示该帧这是消息的
最后一个数据帧;如果其值是0(抓包显示为false),表示该帧不是消息的最后一个数据帧。
(2)opcode:WebSocket帧的操作码,占用4个bit位。操作码opcode的值决定了应该如何解析后续的数据载荷(Data Payload)。如果操作代码是不认识的,那么接收端应该断开链接。
WebSocket协议的操作码取值说明,具体如下表所示:
WebSocket控制帧有3种:Close、Ping以及Pong。控制帧的opcode操作码定义为0x08(关
闭帧)、0x09(Ping帧)、0x0A(Pong帧)。Close关闭帧很容易理解,客户端如果接受到关闭帧,
就关闭连接;当然,客户端也可以发送关闭帧给服务端,服务端收到该帧之后也会关闭连接。

Ping和Pong是WebSocket的心跳帧,用来保证客户端维持正常在线状态。WebSocket为了
保持客户端、服务端的实时双向通信,需要确保客户端、服务端之间的TCP通道保持连接没
有断开。然而,如果长时间没有数据往来的连接,依旧保持着双向连接,可能会浪费服务端
的连接资源,所以,需要关闭这些长时间空闲的连接。
但是,有一些场景,还是需要保持那些长时间空闲的连接,如何避免被误关闭呢?这个
时候,可以采用Ping和Pong两个心跳帧来完成。一般来说只有服务端给客户端发送Ping,然
后客户端发送Pong来回应,表明自己仍然在线。
(3)Mask:一个bit位(值为1时抓包会显示为true),表示是否要对**数据载荷进行掩码**
操作。客户端向服务端发送数据时,需要对数据进行掩码操作;从服务端向客户端发送数据
时,不需要对数据进行掩码操作,如果服务端接收到的数据没有进行掩码操作,服务器需要
断开连接。所有的客户端发送到服务端的数据帧,Mask值都是1。

(4)Masking-Key:掩码键,如果Mask值为1,需要用这个掩码键来对数据进行反掩码,
才能获取到真实的通信数据。为了避免被网络代理服务器误认为是HTTP请求,从而招致代
理服务器被恶意脚本的攻击,WebSocket客户端必需掩码所有送给服务器的数据帧。
客户端必须**为发送的每一个数据帧选择新的不同掩码值**,并要求是这个掩码值是无序的、
无法预测的。**在掩码算法的选择上,为了保证随机性,可以借助密码学中的随机数生成器生
成每一个新掩码值。**
(5)Payload Length:通信报文中数据载荷的长度。
(6)Payload:通信报文数据帧的有效数据载荷,也就是真正的通信消息内容。

`说 明
以上 WebSocket 通信报文字段,在 IETF 所发布的 WebSocket 标准规范 RFC6455 中有
更加详细定义和说明,具体可以参考标准规范。
`



# 6. 参考链接
* How to Use WebSockets(http://cjihrig.com/blog/how-to-use-websockets/)
Expand Down