众所周知,Web应用的通讯过程一般是客户端经过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现。这种机制对于信息变化不是特别频繁的应用能够良好支撑,但对于实时要求高、海量并发的应用来讲显得捉襟见肘,尤为在当前业界移动互联网蓬勃发展的趋势下,高并发与用户实时响应是Web应用常常面临的问题,好比金融证券的实时信息、Web导航应用中的地理位置获取、社交网络的实时消息推送等。web
传统的请求-响应模式的Web开发在处理此类业务场景时,一般采用实时通信方案。好比常见的轮询方案,其原理简单易懂,就是客户端以必定的时间间隔频繁请求的方式向服务器发送请求,来保持客户端和服务器端的数据同步。其问题也很明显:当客户端以固定频率向服务器端发送请求时,服务器端的数据可能并无更新,带来不少无谓请求,浪费带宽,效率低下。浏览器
基于Flash,AdobeFlash经过本身的Socket实现完成数据交换,再利用Flash暴露出相应的接口给JavaScript调用,从而达到实时传输目的。此方式比轮询要高效,且由于Flash安装率高,应用场景普遍。然而,移动互联网终端上Flash的支持并很差:IOS系统中没法支持Flash,Android虽然支持Flash但实际的使用效果差强人意,且对移动设备的硬件配置要求较高。2012年Adobe官方宣布再也不支持Android4.1+系统,宣告了Flash在移动终端上的死亡。服务器
传统的Web模式在处理高并发及实时性需求的时候,会遇到难以逾越的瓶颈,须要一种高效节能的双向通讯机制来保证数据的实时传输。在此背景下,基于HTML5规范的、有Web TCP之称的 WebSocket应运而生。早期HTML5并无造成业界统一的规范,各个浏览器和应用服务器厂商有着各异的相似实现,如IBM的MQTT、Comet开源框架等。直到2014年,HTML5终于尘埃落地,正式落实为实际标准规范,各个应用服务器及浏览器厂商逐步开始统一,在 JavaEE7中也实现了WebSocket协议。至此不管是客户端仍是服务端的WebSocket都已完备。用户能够查阅HTML5规范,熟悉新的HTML协议规范及WebSocket支持。websocket
如下简要介绍一下WebSocket的原理及运行机制。网络
WebSocket是HTML5下一种新的协议。它实现了浏览器与服务器全双工通讯,能更好的节省服务器资源和带宽并达到实时通信的目的。它与HTTP同样经过已创建的TCP链接来传输数据,可是它和HTTP最大不一样是:并发
WebSocket是一种双向通讯协议。在创建链接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,就像Socket同样;
WebSocket须要像TCP同样,先创建链接,链接成功后才能相互通讯。
传统HTTP客户端与服务器请求响应模式以下图所示:
负载均衡
WebSocket模式客户端与服务器请求响应模式以下图:
框架
上图对比能够看出,相对于传统HTTP每次请求-应答都须要客户端与服务端创建链接的模式,WebSocket是相似Socket的TCP长链接通信模式。一旦WebSocket链接创建后,后续数据都以帧序列的形式传输。在客户端断开WebSocket链接或Server端中断链接前,不须要客户端和服务端从新发起链接请求。在海量并发及客户端与服务器交互负载流量大的状况下,极大的节省了网络带宽资源的消耗,有明显的性能优点,且客户端发送和接受消息是在同一个持久链接上发起,实时性优点明显。dom
相比HTTP长链接,WebSocket有如下特色:socket
是真正的全双工方式,创建链接后客户端与服务器端是彻底平等的,能够互相主动请求。而HTTP长链接基于HTTP,是传统的客户端对服务器发起请求的模式。
HTTP长链接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。Websocket协议经过第一个request创建了TCP链接以后,以后交换的数据都不须要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别因此它须要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)。此外还有 multiplexing、不一样的URL能够复用同一个WebSocket链接等功能。这些都是HTTP长链接不能作到的。
下面再经过客户端和服务端交互的报文对比WebSocket通信与传统HTTP的不一样点:
在客户端,new WebSocket实例化一个新的WebSocket客户端对象,请求相似 ws://yourdomain:port/path 的服务端WebSocket URL,客户端WebSocket对象会自动解析并识别为WebSocket请求,并链接服务端端口,执行双方握手过程,客户端发送数据格式相似:
GET /webfin/websocket/ HTTP/1.1 Host: localhost Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg== Origin: http://localhost:8080 Sec-WebSocket-Version: 13
能够看到,客户端发起的WebSocket链接报文相似传统HTTP报文,Upgrade:websocket参数值代表这是WebSocket类型请求,Sec-WebSocket-Key是WebSocket客户端发送的一个 base64编码的密文,要求服务端必须返回一个对应加密的Sec-WebSocket-Accept应答,不然客户端会抛出Error during WebSocket handshake错误,并关闭链接。
服务端收到报文后返回的数据格式相似:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
Sec-WebSocket-Accept的值是服务端采用与客户端一致的密钥计算出来后返回客户端的,HTTP/1.1 101 Switching Protocols表示服务端接受WebSocket协议的客户端链接,通过这样的请求-响应处理后,两端的WebSocket链接握手成功, 后续就能够进行TCP通信了。用户能够查阅WebSocket协议栈了解WebSocket客户端和服务端更详细的交互数据格式。
在开发方面,WebSocket API 也十分简单:只须要实例化 WebSocket,建立链接,而后服务端和客户端就能够相互发送和响应消息。在WebSocket 实现及案例分析部分能够看到详细的 WebSocket API 及代码实现。
腾讯云公网有日租类型七层负载均衡转发部分支持Websocket,目前包括英魂之刃、银汉游戏等多家企业已接入使用。当出现不兼容问题时,请修改websocket配置,websocket server不校验下图中圈出的字段:
一个使用WebSocket应用于视频的业务思路以下:
使用心跳维护websocket链路,探测客户端端的网红/主播是否在线
设置负载均衡7层的proxy_read_timeout默认为60s
设置心跳为50s,便可长期保持Websocket不断开
近期Websocket将开放自定义配置,敬请期待。
本文转载自:https://www.qcloud.com/document/product/214/4150?fromSource=gwzcw.93403.93403.93403