2
原文:http://zhangxiao.org/2018/WebSocket/intro/

使用场景

  • 服务器,需要向客户端主动端推送消息(数据)
  • 客户端,需要实施获取服务器上数据更新或变化

基本概念

WebSocket是一种能在单个TCP连接上进行全双工通讯的协议。

特点

较少的控制开销

在连接创建,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。

更强的实时性

由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和Comet等类似的长轮询比较,其也能在短时间内更多次地传递数据。

保持连接状态

与HTTP不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。

更好的二进制支持

Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。

可以支持扩展

Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。

更好的压缩效果

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

没有跨域问题

不同于HTTP,WebSocket并没有同源限制,客户端可以与任意服务器通信

与 HTTP 协议有着良好的兼容性

默认端口同HTTP/HTTPs,也是80443

握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

对比 HTTP WebSocket
协议标识 http/https ws/wss
端口 80/443 80/443

普通80端口:ws://example.com:80/some/path
加密443端口:wss://example.com:80/some/path

服务器端容易实现

Java/Python/Node/Php/.NET,好像都是支持的(表示心虚,我只是百度了一圈,都能找到现成解决方案)

参考文章

参考文章

维基百科 WebSocket
WebSocket 教程(阮一峰)
WebSocket资料总结
websocket与comet的性能对比
浅谈HTTP长连接
WEB通讯技术之短轮询、长轮询(comet)、长连接(SSE)、WebSocket

MichaelZ
374 声望13 粉丝

web全栈工程师