websocket握手消息

websocket是什么?
按我现在的理解就是,websocket是起于一包Http请求和应答,然后切换到TCPsocket通信的一种机制,具体websocket数据包仅仅是TCP消息加了个数据头。

websocket数据格式

我是分割线===

首先建立TCP连接,3次握手,略。
第4次由客户端发起HTTP请求
其中Http部分内容如下:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

抓包内容是这样的,请忽略上面和下图对应不起来,
在这里插入图片描述
服务器返回Http消息:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

注意响应码101表示服务器已经成功切换了协议,(自动忽略数据,笑哭)
在这里插入图片描述
之后就可以进行websocket数据收发,数据格式没有抓包可以参考,以下参考:

Websocket协议第一个字节是0x810x82,第二个字节是长度head_size = 2
如果第二个字节小于125,表示后面就有多少个字节的数据 head_size = 2 + 4
如果第二个字节等于126,表示后面2字节是后面数据的长度 head_size = 2+2+4
如果第二个字节等于127,表示后面8字节是后面的长度 head_size=2+8+4
长度后面紧跟4个字节的umask,
umask后紧跟真实数据

websocket数据格式
数据发送应该还是TCP发送,只是数据格式有所改动,对应代码:

unsigned char* ws_protocol::package_ws_send_data(const unsigned char* raw_data, int len, int* ws_data_len){
	int head_size = 2;
	if (len > 125 && len < 65536) {
		head_size += 2;
	}
	else if (len >= 65536) {
		head_size += 8;
		return NULL;
	}
	unsigned char* data_buf = (unsigned char*)cache_alloc(wbuf_allocer, head_size + len);
	data_buf[0] = 0x81;
	if (len <= 125) {
		data_buf[1] = len;
	}
	else if (len > 125 && len < 65536) {
		data_buf[1] = 126;
		data_buf[2] = (len & 0x0000ff00) >> 8;
		data_buf[3] = (len & 0x000000ff);
	}
	memcpy(data_buf + head_size, raw_data, len);
	*ws_data_len = (head_size + len);
	return data_buf;
}

注:以上是相关资料收集的,暂时没有写代码确认。仅供参考,谢谢。

资料连接:
websocket数据帧
websocket详解
websocket数据封包
WebSocket的通信过程与实现方法详解
知乎:websocket原理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值