WebSocket

  • WebSocket本质上一种计算机网络应用层的协议,用来弥补http协议在持久通信能力上的不足。

说明

  • http协议本身是无状态协议,每一个新的http请求,只能通过客户端主动发起,通过 建立连接-->传输数据-->断开连接 的方式来传输数据,传送完连接就断开了,也就是这次http请求已经完全结束了(虽然http1.1增加了keep-alive请求头可以通过一条通道请求多次,但本质上还是一样的)。

long pull和ajax轮询

  • ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。
  • long poll其实原理跟ajax轮询差不多,都是采用轮询的方式,不过采取的是阻塞模型,也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。
  • ajax轮询需要服务器有很快的处理速度和资源;long poll需要有很高的并发,也就是说同时接待客户的能力。都非常消耗资源。

WebSocket协议的原理

与http协议一样,WebSocket协议也需要通过已建立的TCP连接来传输数据。
具体实现上是通过http协议建立通道,然后在此基础上用真正的WebSocket协议进行通信,所以WebSocket协议和http协议是有一定的交叉关系的。
WebSocket协议是一个独立的基于TCP的协议。它与HTTP唯一的关系是它的握手是由HTTP服务器解释为一个Upgrade请求。
从概念上讲,WebSocket只是TCP之上的一层,执行以下操作:

  • 为浏览器添加一个web 基于来源的安全模型;
  • 添加一个寻址和协议命名机制来支持在一个IP地址的一个端口的多个主机名的多个服务;
  • 在TCP之上分一个帧机制层以回到TCP基于的IP包机制,但没有长度限制;
  • 包括一个额外的带内(in-band)关闭阶段握手,其被设计来工作在现存的代理和其他中间件。

相比HTTP长连接,WebSocket有以下特点:

  • 是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。而HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。
  • HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。Websocket协议通过第一个request建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)。此外还有 multiplexing、不同的URL可以复用同一个WebSocket连接等功能。这些都是HTTP长连接不能做到的。

WebSocket协议头

请求头中重要的字段:

    Connection:Upgrade

    Upgrade:websocket

    Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits

    Sec-WebSocket-Key:mg8LvEqrB2vLpyCNnCJV3Q==

    Sec-WebSocket-Version:13
  • Connection和Upgrade字段告诉服务器,客户端发起的是WebSocket协议请求

  • Sec-WebSocket-Extensions表示客户端想要表达的协议级的扩展

  • Sec-WebSocket-Key是一个Base64编码值,由浏览器随机生成

  • Sec-WebSocket-Version表明客户端所使用的协议版本

得到的响应头中重要的字段:

    Connection:Upgrade

    Upgrade:websocket

    Sec-WebSocket-Accept:AYtwtwampsFjE0lu3kFQrmOCzLQ=
  • Connection和Upgrade字段与请求头中的作用相同

  • Sec-WebSocket-Accept表明服务器接受了客户端的请求

WebSocket协议的优缺点

优点:

  • WebSocket协议一旦建议后,互相沟通所消耗的请求头是很小的;
  • 服务器可以向客户端推送消息。

缺点:

  • 少部分浏览器不支持,浏览器支持的程度与方式有区别。

WebSocket协议的应用场景

  • 即时聊天通信
  • 多玩家游戏
  • 在线协同编辑/编辑
  • 实时数据流的拉取与推送
  • 体育/游戏实况
  • 实时地图位置

使用WebSocket应用于视频的业务思路

  • 使用心跳维护websocket链路,探测客户端端的网红/主播是否在线;
  • 设置负载均衡7层的proxy_read_timeout默认为60s;
  • 设置心跳为50s,即可长期保持Websocket不断开。

results matching ""

    No results matching ""