WebSocket 简单介绍

WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信,位于OSI模型的应用层。WebSocket中的握手和HTTP中的握手兼容,使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket,这使得WebSocket程序可以更容易的使用现已存在的基础设施。WebSocket协议相比较于HTTP协议成功握手后可以多次进行通讯,直到连接被关闭。

简介

WebSocket 是目前比较成熟的技术了,WebSocket 协议为客户端和服务器端之间的实时双向通讯提供了一个选择。其作为 HTML5 的一部分,已经成为国际标准,几乎所有的现代浏览器都已经支持 WebSocket,比如 Firefox,IE,Chrome,Safari,Opera,并且越来越多的服务器框架也支持 WebSocket。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

其它特点包括:

  • 建立在 TCP 协议之上,服务器端的实现比较容易。
  • 与 HTTP 协议有着良好的兼容性。默认端口同样是 80 和 443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
  • 可以发送文本,也可以发送二进制数据。
  • 没有同源限制,客户端可以与任意服务器通信。

旧时代的“服务端推送”

在 WebSocket 出现以前,为了实现“服务器推送”,我们一般采用“长连接” + “轮询”的实现方式。即客户端向服务发起 HTTP 请求,服务器收到请求后不立即响应,而是让连接一直处于挂起状态,等到需要向客户端“推送”消息了,再响应这个连接;客户端收到服务端的 HTTP 响应后,这个 HTTP 连接就断开了,所以客户端就再次发起一个 HTTP 请求,服务端收到后再挂起,如此往复。行为类似于我们小时候玩的“纸杯电话”

这种方式虽然也能实现服务端的“推送”,但是存在如下致命问题:

  • 非全双工通信,同一时刻只能由一端进行数据发送,无法同时进行。
  • 客户端和服务端的每一次通信都要建立一次 TCP 连接,而且无法复用链路,在限制 TCP 连接数的浏览器上,可能会导致正常的 HTTP 请求无法发出。
  • 每次 HTTP 握手也要消耗时间,而且每次通信除了真正的数据部分外,还会携带大量 HTTP Header,信息交换效率极低。

新时代的 WebSocket

相对于传统 HTTP 每次请求-应答都需要客户端与服务端建立连接的模式,WebSocket 是类似 Socket 的 TCP 长连接通讯模式。一旦 WebSocket 连接建立后,后续数据都以帧序列的形式传输。在客户端断开 WebSocket 连接或 Server 端中断连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

对比 HTTP 长连接,WebSocket有如下优点:

  • 是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。
  • Websocket 通过第一个 request 建立了 TCP 连接之后,之后交换的数据都不需要发送 HTTP header 就能交换数据。此外还有多路复用(multiplexing),不同的URL可以复用同一个WebSocket 连接等功能。

这些都是 HTTP 长连接所不具备的。

总结

WebSocket 与 HTTP 相同点

  • 都是基于 TCP 协议的,都是可靠性传输协议。
  • 都是应用层协议。

WebSocket 与 HTTP 不同点

  • WebSocket 是双向通信协议,模拟 Socket 协议,可以双向发送或接受信息。HTTP 是单向的。
  • WebSocket 是需要浏览器和服务器握手进行建立连接的。而 HTTP 是浏览器向服务器发起的连接,服务器预先并不知道这个连接。

WebSocket 与 HTTP 联系
在 WebSocket中,客户端和服务端在建立连接之前,是需要通过 HTTP 协议进行一个握手的动作,握手时,数据是通过 HTTP 传输的。但是握手完成之后,会单独建立一条 TCP 的通信通道进行数据的传送,所以在真正传输时候是不需要 HTTP 协议的。