WebSocket

WebSocket核心

产生背景:HTTP 协议的缺陷:

HTTP1.x时,“请求 - 应答”是一种“半双工”的通信模式,虽然可以双向收发数据,但同一时刻只能一个方向上有动作,传输效率低。

HTTP2之后可以全双工通信,但服务器只能“被动”响应客户端的请求,无法主动向客户端发送数据。

即使提供了Server Push功能,但“请求 - 应答”依然是主要的工作方式。HTTP仍然无法实现良好的服务端主动推送功能(轮询消耗性能)。

于是就出现了WebSocket,很好的弥补HTTP在双向通信和服务端主动推送场景下的不足

是什么?
websocket协议是为了解决HTTP双向通信和服务端主动推送的不足。而专门制定的一种全双工实时通信应用层协议

websocket能够提供低延迟,高性能的客户端与服务端的双向数据通信。它颠覆了之前web开发的请求-响应模式,实现了服务器端主动推送的功能。是真正的双向平等对话,特别适合实时数据交互的场景、

websocket沿用http的端口,目的是为了骗过防火墙。WS的默认端口是80,WSS是443(wss协议是WebSocket使用SSL/TLS加密后的协议,类似HTTP和HTTPS的关系。)

工作原理
WS协议通信由两阶段组成:握手阶段和数据传输阶段

  • 握手阶段利用http协议建立连接。
  • 握手完成后的数据传输阶段就使用websocket协议,底层利用TCP实现可靠的数据传输。

请求报文

当客户端请求连接服务端的时候,会向服务端发送一个类似下面的http报文

GET /chat HTTP/1.1            //1
Host: server.example.com   //2
Connection: Upgrade            //4
Upgrade: websocket            //3
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==            //5
Origin: [url=http://example.com]http://example.com[/url]            //6
Sec-WebSocket-Protocol: chat, superchat            //7
Sec-WebSocket-Version: 13            //8
  • 前两行跟HTTP的Request的起始行一模一样,而真正在WS的握手过程中起到作用的是下面几个header域:

  • Connection的值必须是Upgrade, Upgrade的值必须是websocket, 表示将当前连接升级到websocket连接。

  • Sec-WebSocket-Key
    是客户端生成的一个key,服务器通过这个key和固定的算法生成一个新的key返回给客户端。客户端校验通过后才能建立连接。

  • Sec-WebSocket-Protocol: jsonrpc,jsonrpc
    自定义websocket协议采用jsonrpc和jsonrpc进行通信

  • Origin:作安全使用,防止跨站攻击,浏览器一般会使用这个来标识原始域

  • Sec-WebSocket-Version 是websocket的版本号

响应报文

如果服务端支持websocket协议,那么它就会将自己的通信协议切换到websocket,同时发给客户端类似于以下的一个响应报文头
在这里插入图片描述

  • 返回的状态码为101,表示同意客户端协议转换请求,并将它转换为websocket协议。接下来得到交互将用websocket数据包的协议进行。

  • Connection的值必须是Upgrade, Upgrade的值必须是websocket。跟客户端发送的一样。

  • Sec-WebSocket-Accept
    这个就是用客户端发送的 Sec-WebSocket-Key和固定算法生成的一个key,发给客户端校验,校验通过则连接建立成功。

以上过程都是利用http通信完成的,称之为websocket协议握手
握手完成后,客户端和服务端就建立了websocket连接,以后的通信走的都是websocket协议了。

帧的格式

WebSocket 用的也是二进制帧,不过 WebSocket 和 HTTP/2 的关注点不同,
WebSocket 更侧重于“实时通信”
而 HTTP/2 更侧重于提高传输效率
所以两者的帧结构也有很大的区别。
在这里插入图片描述
解释:
在这里插入图片描述

  • FIN 1bit 表示信息的最后一帧,flag,也就是标记符
  • RSV 1-3 1bit each 以后备用的 默认都为 0
  • Opcode 操作码,其实就是帧类型,比如 1 表示帧内容是纯文本,2 表示帧内容是二进制数据,8 是关闭连接,9 和 10 分别是连接保活的 PING 和 PONG。
  • Mask 1bit 掩码,是否加密数据,默认必须置为1
  • Payload len 7bit 数据的长度,当这个7 bit的数据 = = 126 时,后面的2 个字节也是表示数 据长度,当它 = = 127 时,后面的 8 个字节表示数据长度
  • Masking-key 1 or 4 bit 掩码
  • Payload data playload len bytes 数据

其他的即时通讯的方法

1、定期轮询的方式

客户端按照某个时间间隔不断地向服务端发送请求,请求服务端的最新数据然后更新客户端显示。这种方式实际上浪费了大量流量并且对服务端造成了很大压力。

2、SSE(Server-Sent Event,服务端推送事件)

SSE(Server-Sent Event,服务端推送事件)是一种允许服务端向客户端推送新数据的HTML5技术。与由客户端每隔几秒从服务端轮询拉取新数据相比,这是一种更优的解决方案。

相较于WebSocket,它也能从服务端向客户端推送数据。WebSocket能做的,SSE也能做,反之亦然,但在完成某些任务方面,它们各有千秋。关于SSE的介绍,即时通讯网将在稍后的文章中详细介绍。

3、Comet技术

Comet并不是一种新的通信技术,它是在客户端请求服务端这个模式上的一种hack技术,通常来讲,它主要分为以下两种做法:

3.1、基于长轮询的服务端推送技术
具体来讲,就是客户端首先给服务端发送一个请求,服务端收到该请求之后如果数据没有更新则并不立即返回,服务端阻塞请求的返回,直到数据发生了更新或者发生了连接超时,服务端返回数据之后客户端再次发送同样的请求,如下所示:
在这里插入图片描述
3.2、基于流式数据传输的长连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值