构建websocket服务
websocket的优势:
- 客户端与服务器只需要一个tcp连接
- 服务器可以推送到客户端
- 轻量化的协议头,提高传输效率
node使用websocket的优势:
- WebSocket客户端基于事件的编程模式和node的自定义事件类似
- websocket需要客户端与服务器之间的长连接,node事件驱动的方式擅长与量大的客户端保持高并发连接
WebSocket握手
客户端发起升级协议请求:
|
|
Sec-WebSocket-Key用于安全校验,值是随机生成的Base64编码的字符串。服务端将其与字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11拼接,然后再用sha1计算再Base64编码
|
|
客户端校验Sec-WebSocket-Accept,正确的话就开始数据传输
WebSocket数据传输
在握手后就开始websocket数据帧协议, 握手完成客户端onopen()被触发
|
|
服务端没有onopen()方法,想完成tcp套接字事件到websocket事件的封装,需要在收发数据时处理,Websocket的数据帧是在底层data事件上封装的
|
|
当一端调用send()发送时,另一端会触发onmessage,协议可能将数据封装为多帧发送。客户端需要对发送的数据帧做掩码处理,服务端收到无掩码帧会断开连接,而服务端发送时不需要
websocket数据帧定义
- fin 如果这数据帧是最后一帧时为1(如果数据就一帧,它也是1),其余为0
- rsv1、rsv2、rsv3:1位长 用于标识拓展,当有拓展时为1
- opcode: 4位(0~15) 0:附加数据帧 ,1:文本数据帧 ,2:二进制数据帧,8:发送一个连接关闭帧,9:ping数据帧 ,10:pong数据帧 ping,pong用于心跳检测,一端发ping、一端发pong
- masked 是否进行掩码处理 客户端发送时是1 服务端是0
- payload 标识数据长度
- masking key 当masked为1时存在 长度32位 用于解密
- payload data 目标数据 位数为8的倍数
网络服务和安全
- ssl(Secure Sockets Layer,安全套接层),应用在传输层
- TLS(Transport Layer Security,安全传输层协议),由IETF标准化
node提供crypto,tls,https。crypto用于加解密,tls与net功能类似,区别是它建立在TLS/SSL加密的tcp.https和http接口也一致,也是区别在建立于安全的连接
TLS/SSL
非对称加密,公钥用于加密传输数据,私钥解密
node的tls/ssl是用openssl实现的,公、私钥生成参照:
|
|
数字证书
- 由CA颁发,并提供验证
- 防止中间人攻击
中间人攻击
:在服务端和客户端交换密钥时,伪装成其中一方发送公钥,如对客户端就伪装成服务端。所以需要对公钥认证,确认来自目标服务器
服务端通过私钥生成CSR(Certificate Signing Request,证书签名请求),ca通过它颁发属于该服务器的签名证书
自签名证书流程:
|
|
客户端发起安全连接会获取服务端证书,然后用ca的证书验证服务器证书,包括真伪、服务器名称、ip等。对于知名ca,它的证书一般预装在浏览器,自签的ca需要客户端安装才能验证
创建tcl服务
- 通过node的tls创建安全的tcp服务
|
|
https服务
- 使用node的https,比http多了一个配置
|
|