1. websocket 是什么
Html开始提供一种浏览器与服务器进行全双工通信的网络技术,属于应用层协议。它基于TCP传输协议,并复用Http的握手通道
2. 优点
- 支持双向通信,实时性更强
- 更好的二进制支持
- 较少的控制开销。创建连接后,客户端与服务端进行数据交换时,协议控制的数据包头部较小,而Http 协议每次通信都需要携带完整的头部。
- 支持扩展。websocket协议定义了扩展,用户可以扩展协议或者实现自定义的子协议(比如支持自定义压缩算法)
3. 连接过程
WebSocket协议是基于TCP协议上的独立的通信协议,在建立WebSocket通信连接前,需要使用HTTP协议进行握手,从HTTP连接升级为WebSocket连接。浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
WebSocket定义了两种URI格式, “ws://“和“wss://”,类似于HTTP和HTTPS, “ws://“使用明文传输,默认端口为80,”wss://“使用TLS加密传输,默认端口为443。
连接过程如下:
- 客户端建立到服务器的TCP连接
- 客户端请求将当前TCP连接用作websocket
- 服务器收到请求, 同意并确认将此 TCP 连接用作 websocket
- 客户端收到确认, HTTP 协议通信结束
- 双方使用 websocket 协议自由双向通信
4. 数据帧格式
Websocket在通信的最小单位为帧,由一个或者多个帧组成一条完整的消息。
发送端,将消息切割成多个帧,并发给服务端;接收端,接收消息帧,并将关联的帧重新组装成完整的消息。
当WebSocket的接收方收到一个数据帧时,会根据FIN的值来判断,是否已经收到消息的最后一个数据帧
FIN=1表示当前数据帧为消息的最后一个数据帧,此时接收方已经收到完整的消息,可以对消息进行处理。FIN=0,则接收方还需要继续监听接收其余的数据帧。
此外,opcode在数据交换的场景下,表示的是数据的类型。0x01表示文本,0x02表示二进制。而0x00比较特殊,表示延续帧(continuation frame),顾名思义,就是完整消息对应的数据帧还没接收完。