websocket和TCP/IP多了一个握手协议
1握手的过程是
1==》A连接B会发送 固定格式
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 127.0.0.1:5504
Origin: http://127.0.0.1:5504
Sec-WebSocket-Key: KDON8mAMGOuBcAsxnNKysQ==
Sec-WebSocket-Version: 13
2===》服务端收到握手请求时
B收到后解析 得到 Sec-WebSocket-Key: 的值KDON8mAMGOuBcAsxnNKysQ== (key是随机生成的)
将258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接到key的后面
258EAFA5-E914-47DA-95CA-C5AB0DC85B11 该值是固定的,所有websocket的该值都一样
得到KDON8mAMGOuBcAsxnNKysQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
将该值sha1加密后,再base64编码 得到 新的key
然后将新的key,填入Sec-WebSocket-Accept:的后面 将下面固定格式返回,客户端会解析 新的key对不对,一样的话。握手就建立成功。
3===》B返回A
HTTP/1.1 101 Switching Protocols
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Accept:Y7GHQkcvYEsjoekMeEkxZgpwy/E=
2:websocket 数据的接受发送
websocket数据外面加了一层封装
封装内容主要是数据 前面加了两个字节
第一个字节: 最高位如果是1表示该消息,是消息的尾部,如果是0表示后续还有数据包
最低四位 用来表示 消息类型的,不同的语言,这四位的值可能不一样。
第二个字节: 最高位 0/1表示 后面是否跟着4个字节的掩码
剩下的7位如果值<=125 表示 后面的数据大小 就是该七位的大小
剩下的7位如果值=126 表示后面跟着2个字节的,这两个字节 用来存数据的大小字节
剩下的7位如果值=127 表示后面跟着8个字节的,这八个字节 用来存数据的大小字节