^

Websocket学习笔记

Websocket是一种数据传播技术

1.传统的消息推送、数据请求更新方式

轮询 (前端定时请求后段接口数据 获取结果 )

长连接阻塞 (通过阻塞的方式 等待获取数据)

缺点过度消耗资源 服务端是一种被动数据传输 需要客户端进行数据询问

多次请求的HTTP头部, TCP连接复用会导致的Head-of-Line Blocking线头阻塞

在单一的TCP连接中,使用双向通信(全双工通信)就能很好的解决此问题

2.Websocket的原理

通过一次http建立链接后,使用tcp全双工通信

既可以发送数据 也可以接收数据

在真正意义上实现了服务端的主动数据传输

具有多路复用的功能(multiplexing),也即几个不同的URI可以复用同一个WebSocket连接

3.websocket握手

6163d79fbb2eb.png

需要关闭连接时,任意一方直接发送类型为关闭帧(Close frame)的控制帧数据给对方即可。

4.数据帧传输

6163d7bc43e2d.png最重要的字段为opcode(4bit)和MASK(1bit) 

  • MASK值,从客户端进行发送的帧必须置此位为1,从服务器发送的帧必须置为0。如果任何一方收到的帧不符合此要求,则发送关闭帧(Close frame)关闭连接。

  • opcode的值: 0x1代表此帧为文本数据帧, 0x2代表此帧为二进制数据帧, 0x8为控制帧中的连接关闭帧(close frame), 0x9为控制帧中的Ping帧, 0xA(十进制的10)为控制帧中的Pong帧。 

  • Ping/Pong帧: Ping帧和Pong帧用于连接的保活(keepalive)或者诊断对端是否在线。这两种帧的发送和接收不对WEB应用公开接口,由实现WebSocket协议的底层应用(例如浏览器)来实现它。

5.对比

6163d82be4920.png

6.安全应用场景 

前端代理检测:

传统代理只会发送websocket的代理数据 而忽略tcp头。

服务端可向前端发送这一个tcpwin=0的tcp头,代表前端收包后不会继续发包。此时bufferamount会累计,但因为做了代理无tcpwin=0,导致前端websocket仍然能够发包,从而数据会被累计。

(由张真人师傅写的demo站,以上述原理实现)

6163d85b2ff6f.png