websocket是什么
是一个应用层协议,主要用于服务器主动推送数据给浏览器(不仅仅局限于浏览器)。
如:浏览器请求登录csdn,csdn的服务器产生一个二维码信息给浏览器,浏览器显示二维码,通过微信扫描二维码,微信的服务器处理信息,然后去告知csdn的服务器哪个二维码被哪个微信扫描了,csdn服务器再主动发送用户相关数据给浏览器(csdn给浏览器发送消息是websocket在起作用),浏览器登录成功。
自定义协议
由tcp包本身的信息(如包的长度)和协议本身的信息(如版本号)组成
协议格式
1.建立连接的第一个数据包是符合http协议格式的(handshake),但是头信息里面多了两行:
Connect:Upgrade
Upgrade:websocket
2.websocket数据格式
如何验证客户端数据合法
1、握手过程:
客户端发送Sec-WebSocket-Key(在头里面)给服务器,有一个全局唯一固定的guid(值为:258EAFA5-E914-47DA-95CA-C5AB0DC85B11),将Sec-WebSocket-Key和guid拼接在一起(Sec-WebSocket-Key+guid),做sha1哈希编码,再进行base64编码,生成Sec-WebSocket-Accept返回给客户端
传输明文与密文
通过mask位控制,置1代表密文传输,置0代表明文传输
密文:
在头中有maksing-key占32个bit,定义一个int mask_key[4]取出来
在通过payload[i] = palyload[i] ^ mask_key[i%4];的方式加解密。
如何断开websocket
通过fin位控制,置0代表不断开,置1代表断开连接