聊聊 WebSocket,还有 HTTP

还记得曾经风靡一时的 QQ 秀聊天室吗?那时,还在上初、高中的咱们,QQ 是最经常使用的聊天交友工具;而 QQ 秀聊天室的出现打破了只能按条件查找好友的局限性,你们能够随意进入聊天室房间,进行在线聊天。怀念那个穿着最酷炫的 QQ 秀的我在聊天室闪亮登场,质朴的问出一句:“有 GG/MM 吗?”html

WebSocket 的诞生

随着互联网的发展,网上出现了各类聊天室软件,各类新奇的玩法,却再也找不到当年那种纯真的感受了。固然了,不管是曾经的聊天室,仍是现在的视频弹幕,吸引人的地方就在于实时沟通交流。要实现相似实时交互的应用场景,须要低延迟、高及时的技术。web

曾经,不少网站为了实现上述场景,所用的技术都是轮询。即每隔一段时间(如每 1 秒),由浏览器对服务器发出 HTTP 请求,询问服务器有没有新的信息,而后由服务器返回最新的数据给客户端。这种传统的轮询模式存在很明显的缺点,即浏览器须要不断的向服务器发出请求,然而 HTTP 请求包含较长的请求头,真正有效的数据可能只占一小部分,这样显然会浪费一部分带宽资源。那有没有更好的方法呢?api

WebSocket 应运而生。WebSocket 协议诞生于 2008 年,在 2011 年成为国际标准,而且 WebSocket 一样是 HTML 5 规范的组成部分之一。WebSocket 是一种全新的协议,它将 TCP 的 Socket(套接字)应用在了 web page 上,从而使通讯双方创建起一个保持在活动状态链接通道,而且属于全双工(双方同时进行双向通讯)。WebSocket 协议更好的节省了服务器资源和带宽,而且可以更实时地进行通信。浏览器

相比 HTTP 协议,WebSocket 究竟有哪些不一样呢?缓存

HTTP vs WebSocket

HTTP 协议是半双工协议,也就是说在同一时间点只能处理一个方向的数据传输,属于单向传输。在客户端向服务器发起链接以前,服务器并不知道有这个链接。发起一个请求,获得一个响应,通讯便结束了,客户端和服务器也“忘记了彼此”。不过如今能够经过 Cookie 使客户端保持某种状态,以便服务器能够识别客户端。安全

而 WebSocket 协议是全双工的,服务器能够随时主动给客户端下发数据,能够双向发送或接受信息,属于双向传输。WebSocket 能够经过客户端和服务器的握手创建链接,而且链接一直保持“打开”状态,不只仅是一个请求 + 一个响应。首先,客户端会先发起请求创建链接,若服务器接受了此请求,则将创建双向通讯。而后,服务器和客户端就能够进行信息交互了,直到客户端或服务器发送消息将其关闭为止。服务器

固然,WebSocket 和 HTTP 也是有联系的。由于 WebSocket 须要先经过 HTTP 协议的 101 状态码创建链接。为了建立 WebSocket 链接,须要经过浏览器发起请求,等待服务器进行回应,这个过程一般称为“握手”(Handshaking)。websocket

一个典型的 WebSocket 握手请求以下:网络

客户端请求:socket

GET / HTTP/1.1

Upgrade: websocket

Connection: Upgrade

Host: localhost.com

Origin: http://localhost.com

Sec-WebSocket-Key: aN3cRrW/n8NuIgdhy2VJFX==

Sec-WebSocket-Version: 13

服务器回应:

HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: pFDoeB2FAdLlXgESz0UT2v7hp0s=

Sec-WebSocket-Location: ws://localhost.com/

字段说明:

  • Connection 字段必须为 Upgrade,表示客户端但愿链接升级。
  • Upgrade 字段必须为 WebSocket,表示但愿升级到 WebSocket 协议。
  • Sec-WebSocket-Key 的值是随机字符串,服务器端会用这些数据来构造出一个SHA-1的信息摘要。把“Sec-WebSocket-Key”加上一个特殊字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,而后计算 SHA-1 ,再进行 Base64 编码,将结果作为“Sec-WebSocket-Accept”头的值,并返回给客户端。这样能够尽可能避免普通 HTTP 请求被误认为 WebSocket 协议。
  • Sec-WebSocket-Version 字段表示支持的 WebSocket 版本。RFC6455 要求使用的版本是13,以前草案的版本均应当弃用。
  • 其余一些定义在 HTTP 协议中的字段,如 Cookie 等,也能够在 WebSocket 中使用。

WebSocket 使用 ws 或 wss 的统一标识符,相似于 HTTP/HTTPS。其中 wss 表示使用了 TLS 的 WebSocket。例如:

ws://localhost.com/api

wss://securelocalhost.com/api

WebSocket 与 HTTP/HTTPS 使用相同的 TCP 端口。默认状况下,WebSocket 协议使用 80 端口;运行在 TLS 之上时,默认使用 443 端口。

WebSocket 的优点

做为“后起之秀”,到现在的普遍应用,毋庸置疑 WebSocket 拥有不少优势:

- 较少的资源浪费

在链接建立后,服务器和客户端之间交互时,传输的数据包头部相对较小。相对于 HTTP 请求每次都要携带完整的头部,资源浪费显著减小了。

- 更强的实时性

因为 WebSocket 协议是全双工的,因此服务器能够随时主动给客户端传输数据。相对于 HTTP 请求须要等待客户端发起请求服务端才能响应,延迟明显更少。

- 保持长链接

与 HTTP 不一样的是,WebSocket 须要先建立链接,这就使得其成为了一种有状态的协议。而 HTTP 请求可能须要在每一个请求都携带状态信息(如身份认证等)。

- 更好的二进制支持

WebSocket 定义了二进制帧,相对 HTTP,能够更轻松地处理二进制内容。

- 更好的压缩效果

相对于 HTTP 压缩,WebSocket 在适当的扩展支持下,能够沿用以前内容的上下文,在传递相似的数据时,显著地提升压缩率。

不一样的业务场景如何选择

相比较 WebSocket 和 HTTP,能够说 HTTP 请求比 WebSocket 更简单,可是也有局限性。在不一样的使用场景能够选择更合适的协议。

目前互联网上大多数网站都是直接加载网页,除了单击加载新页面以外,交互工做都不多。在这种场景下没有必要保持长链接,使用 WebSocket 会显得过于“笨重”。通常的网页都会使用静态资源,例如 Image 图片,Javascript 或 CSS 文件等。为了加载更快,这些静态资源都须要进行缓存,并且它们可能并不来自同一个域名,这时固然使用 HTTP 更为轻便快捷。

HTTP 协议的每一个请求都须要发送一次请求头,而 WebSocket 仅在初始请求创建链接中携带头信息(固然了,传递消息中也会有一些开销,但都是比较小的)。所以,若是想持续发送多个消息,使用 Websocket 会更节省资源。若是要开发一个客户端和服务器持续交互的程序,那么 WebSockets 将是最佳选择。例如:

- 社交、聊天

社交聊天工具,网站在线咨询窗口等,这一类聊天应用的特色是低延迟,高及时。其采用 WebSocket 协议,实现了实时沟通交流,以高效的方式知足沟通的需求。

- 弹幕

看视频,弹幕少不了,精彩的点评、搞笑的段子,网友之间的实时互动,有时对于一个视频来讲,弹幕才是精华。而发弹幕须要实时显示,经过 WebSocket 协议可将本地客户端发送的弹幕信息经过服务端所有推送至其余用户的客户端并进行实时展现。

- 在线教育

在线教育近几年发展迅速,不用出门便可和老师、同窗实时沟通、交流。老师布置做业、学生互动、咨询老师问题等等均可实时在线进行,此类实时交互均可由 WebSocket 协议支撑完成。

- 位置信息更新的应用

当前移动设备中实时的位置定位、实时的网络数据更新,使用 HTTP 协议显得有些笨拙,借用 WebSocket 可让数据实时更新更快。

又拍云 WebSocket 服务产品,突破传统 CDN 厂商只能加速 HTTP/HTTPS 协议的局限,将 WebSocket 协议与 CDN 相融合,并结合自身多年 CDN 行业技术经验,采用多种优化技术,为使用 WS/WSS 协议进行通讯的客户提供了优质的加速服务,能有效下降延迟,提高效率。快来抢先体验!

推荐阅读

说说 WebSocket,3 分钟让你全面认识它

为何 HTTPS 比 HTTP 安全

相关文章
相关标签/搜索