WebSocket实现原理

1. websocket简介

  websocket同http和https一样,属于tcp基础上的应用层的协议;因此其必然也是存在三次握手四次挥手的过程

  一般来说,我们使用的http协议只能由客户端发起请求,而服务端无法直接主动进行数据推送,这就导致了如果服务端有持续的变化(如聊天室)而客户端获取起来较为复杂(如实时性和服务端压力等)。因此,websocket协议便应运而生
  对于websocket协议来说,客户端和服务端都可以主动推送消息,其中消息内容可以时文本也可以是二进制数据。而且没有同源策略的限制,也不存在跨域问题

  websocket协议的表示符号时ws(ws://xxxx.com);像https一样,如果加密的话,标识符就是wxs

2. websocket实现原理

2.1 websocket协议数据收发的过程大概为三个过程:

  1)TCP协议的三次握手四次挥手的过程必然存在
  2)websocket协议本身的握手环节
  3)websocket协议握手成功之后的收发数据环节

2.2 websocket数据收发过程及原理

1) websocket握手环节

握手环节:验证服务端是否支持websocket协议
		1)创建连接,浏览器连接服务端,创建连接成功
		2)浏览器生成一个随机字符串,浏览器存一份该随机字符串,同时发一份给服务端(基于http协议发到服务端,会把该字符串放在http请求头里发给服务端)
		3)服务端收到随机字符串之后,让它跟魔法字符串(magic string,全球公认的固定字符串)拼接,然后再通过sha1算法进行加密然后再通过base64编码后,生成密文
		4)服务端将密文返回给浏览器(该密文无法反解)
		5)浏览器也将本地存的随机字符串与magic string进行拼接并加密编码之后得到一个密文
		6)浏览器将服务端发来的密文与本地的密文进行对比、校验,若通过,则说明两端用的同一个magic string,即用的同一种加密手段,即可以判定服务端支持websocket协议,握手成功;若校验不通过,则代表服务端不支持websocket协议,握手失败

握手成功后,进行收发数据

2) websocket收发数据环节

收发数据环节:数据是加密的
	1)浏览器将数据加密发往客户端
	2)服务端接收到数据之后进行的解密(解密是全球公认的)
		a) 拿到第2个字节(8位),取其后7位(即前两个字节的10-16位),也就是数据的前9位都不要,我们取到的7位称之为payload length(7位最大值是127);
		b) 服务端对payload length的值进行判断:
			1> 若payload length =  127:
				  再往后读8个字节(即64bit/位),也就是说前10个字节(8+2)是数据头,后面才是数据
			2> 若payload length =  126:
				  再往后读2个字节(即16bit/位),也就是说前4个字节(2+2)是数据头,后面才是数据部分
			3> 若payload length <= 125:
				  不往后读,前面2个字节就是数据头,后面都是数据部分
	3)通过b解密过程获取数据,但是该数据也不是明文的,还需要再解密
		a) 获取到数据部分后,再往后读4个字节,该4个字节称之为masking key,剩下部分是真正的数据;
		b) 让masking key与数据的每一个字节进行位运算(与或运算),运算完之后就获取到了最终的数据(具体过程可见官网)
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值