WebSocket
Posted 木林森__
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebSocket相关的知识,希望对你有一定的参考价值。
# WebSocket
1.概述
1.1 WebSocket 是什么?
WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准。
WebSocket 是 html5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
2.原理
HTTP
首先从HTTP说起,HTTP1.0是无连接的。每次都得重新发起TCP连接;
HTTP1.1实现了长连接;
这一功能实质是复用了TCP连接,HTTP协议中的connection:keep-alive 是指在一次TCP连接中完成多个HTTP请求,但是对每个请求仍然要单独发 header;
AJAX
在此基础之上出现了AJAX,就是客户端周期性的请求服务器数据并在刷新页面中的部分数据;
每个request对应一个response,由于HTTP/1.1的持久连接(建立一次TCP连接,发送多个请求)和管线化技术(异步发送请求),使得HTTP请求可以在建立一次TCP连接之后发起多个异步请求。
AJAX有两个不足或者说可以优化的地方:
- 连接的开销;每一次请求仍是一次HTTP请求;
- 服务器不能主动推送,只能由客户端polling;
comet
而比较新的技术向服务器轮询获取数据的实现是Comet,即服务端推送。简单的说,服务端推送就是在客户端发起HTTP请求之后,服务器可以主动的向客户端推送数据。实现Comet的方式有两种:Ajax长轮询和HTTP流。
Ajax长轮询(Ajax Long-polling)
Ajax长轮询本身不是一个真正的推送。长轮询是短轮询的一种变体。在客户端向服务器发起HTTP请求之后,服务器并不是每次都立即响应:当服务器得到最新数据时,会向客户端传输数据;当数据没有更新时,服务器会保持这个连接,等待更新数据之后,才向客户端传输数据。当然,如果服务端数据长时间没有更新,一段时间后,请求就会超时。客户端收到超时信息后,会重新发送一个HTTP请求给服务器。
也就是说,只有在服务器获取更新后的数据,才会向客户端传输数据。这种方式也存在弊端。虽然服务端可以主动的向客户端传输数据,但是依然需要反复发出请求(HTTP请求数量比短轮询少很多)。
短轮询和长轮询的相同点在于客户端都需要向服务器发起HTTP请求,不同点在于服务器如何响应:短轮询是服务器立即响应,不管数据是否有效;长轮询是等待数据更新后响应。HTTP流
HTTP流不同于轮询技术,HTTP流只建立一次TCP连接,在3次握手之后进行HTTP通信,此时客户端向服务器发起一个HTTP请求,而服务器保持连接打开,周期性的向客户端传输数据。双方在没有明确提出断开连接时,服务器就会持续向客户端传输数据。也就是说,假如服务器数据没有更新,服务器不会返回响应,而是保持连接;如果数据更新了,会立即将数据传输给客户端。此时会发起下一个HTTP请求,过程周而复始。
对(长、短)轮询和HTTP流做一个小小的总结:
传统轮询技术(Ajax短轮询)是客户端向服务器发起HTTP请求,无论数据是否更新,服务器都会传输数据。一个request对应一个response。
服务器推送技术(Ajax长轮询)是短轮询的变种,是客户端向服务器发起HTTP请求,只有等待数据更新后才会传输数据,否则服务器保持连接状态。接着发起下一次HTTP请求,一个request对应一个response。
服务器推送技术(HTTP流),在客户端只发起一次HTTP请求,服务器保持连接状态,在数据更新之后,服务器会传输数据,否则保持连接状态。此时一个requset对应多个response。
无论是短轮询、长轮询,还是HTTP流,相同点在于都需要客户端先发起HTTP请求。
websocket
上面的HTTP1.1 和AJAX模式有一个共同的缺点,就是除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。它们建立的“长连接”都是伪长连接,只不过好处是不需要对现有的HTTP server和浏览器架构做修改就能实现。
WebSocket 看成是 HTTP 协议为了支持长连接所打的一个大补丁,它和 HTTP 有一些共性,是为了解决 HTTP 本身无法解决的某些问题而做出的一个改良设计。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
WebSocket是一个独立的基于TCP的协议,是与HTTP同一级的协议;
它与HTTP之间的唯一关系就是它的握手请求可以作为一个升级请求(Upgrade request)经由HTTP服务器解释(HTTP/1.1 协议的101状态码)。
WebSocket是一个网络通讯协议, 只要理解它的数据帧格式和握手流程, 都可以完成基于websokect的即时通讯。
2.1 其它概念
- TCP的keep alive:检查当前TCP连接是否活着;
- HTTP的Keep-alive:要让一个TCP连接活久点。
它们是不同层次的概念。
TCP keep alive的表现:
当一个连接“一段时间”没有数据通讯时,一方会发出一个心跳包(Keep Alive包),如果对方有回包则表明当前连接有效,继续监控。
这个“一段时间”可以设置。
以上是关于WebSocket的主要内容,如果未能解决你的问题,请参考以下文章