推送技术

推送技术（Push technology），或者说是是一种基于Internet通信方式的服务器推送，其特点是通信的请求是由发布者或中央服务器发起。传统的 pull/get 相反与之相对，一般由接收者或客户端发起。

推送技术通常是基于预设置，使用所谓的 publish/subscribe 模型。客户通过订阅由服务器提供的不同的讯息频道，当服务器端有新的讯息产生时，服务器把讯息传递给预定此频道的客户端。

实际情况中，由于客户端的某些安全策略，例如客户端站点屏蔽了外界的HTTP/S请求，推送技术会使用 polling （模仿轮询）的方式去模拟。此时，客户端会间歇性地向服务器发起“是否有新的讯息”的询问，而非等待服务器向其主动发送新的讯息。

## 常见使用

同步会议和即时通信是推送服务的典型事例。聊天讯息和临时文件一旦被发送，用户就会通过推送服务接收到。分离的 peer-to-peer 程序（例如 WASTE）和集中的程序（例如 IRC 或 XMPP）都允许推送文件，这就意味着发件人开始进行数据的传送，而不是收件人。

Email 可能也是一个推送系统：SMTP 协议是一个推送协议（见 Push e-mail）。然而，从邮件服务器到桌面计算机的最后一步通常使用的是像 POP3 或 IMAP 这样的 pull 协议。现代电子邮件客户端通过反复轮询邮件服务器，使这一步看起来是瞬间的，它经常检查是否有新邮件。IMAP 协议包括 IDLE command，它允许服务器当新邮件到达时向客户端发消息。初代的黑莓是第一个在无线环境下推送电子邮件的设备，使得它成为当今的佳话。

其他例子是 PointCast Network （点播式网络），它在二十世纪九十年代具有非常广泛的应用。它通过屏保推送新闻和股票行情。在浏览器战争的巅峰时期，Netscape 和 Microsoft 通过在他们的软件里集成频道定义格式（CDF）推送技术，但是那时并没有多少人关注。CDF 消失了并移出了浏览器的时代，取而代之的是2000年的 RSS （一种下拉式系统）。

## 例子

### 网页推送

这个网络工程师极力推崇的网页推送方案是一个简单的协议，通过使用 HTTP2 版本的去即时的事件。例如来电或留言，能够被即时的传达（或者说推送）出去。这个协议将所有即时的事件都合并到一个简单的会话中，其中这个会话可以确保不管在网络还是音频资源上都有很好的使用效率。这一个简单的服务包含了所有的事件，并在当它到达分发给对应的应用所有的事件。这个请求只需要一个会话，避免了重复发送这样高昂的成本。

### HTTP服务器推送

HTTP 服务器推送（也称为 HTTP 流）是一种将未经请求的（异步）数据从Web服务器发送到Web浏览器的机制。任何一种机制都可以实现 HTTP 服务的推送。

一些 HTML5 的 WebSocket API 允许 Web 服务器和客户端，通过 TCP 全双工通信进行交流。

一般情况下，当响应完毕一个来自客户端的请求之后，Web 服务器不会去终止一个连接。Web 服务器使连接打开，以便当发生事件（例如，需要向一个或多个客户端报告的内部数据的变化）时，可以立即发送它；否则，该事件必须排队，直到接收到客户端的下一个请求为止。大多数 Web 服务器都通过 CGI 提供这种功能（例如，Apache HTTP 服务器上未解析的报头脚本）。这是一种靠分块传输编码方法的基本机制。

另一种机制关系到一个特殊的 MIME 类型，称为 multipart/x-mixed-replace，这是由 Netscape 在1995年引入的。当服务器想向客户端推出新版本时，Web 浏览器将此理解为一个文件改变。它如今仍然被 Firefox、 Opera 和 Safari 支持，但它被 Internet Explorer 忽略了。它可以应用于 HTML 文档，以及用于流式传输图像的相机应用。

网页超文本应用技术工作小组（WHATWG）Web Applications 1.0 proposal 包括一个机制来推送内容到客户端。2006年9月1日， Opera Web 浏览器在一个名为“服务器发送事件”的功能中实现了这个新的实验系统。现在它作为 HTML5 的一部分被标准化了。

### 推送技术

在这个技术，服务器充分利用持久的 HTTP 协议，使得响应永久打开，（即服务器永不关闭响应），有效地去欺骗浏览器保持加载，直到初始页面被认为完全加载完毕之后。然后服务器周期的发送 JavaScript 代码去更新这网页的内容。从而实现推送能力，通过使用这个技术，客户不需要JAVA程序或者其他的插件程序去保持与服务器的连接。客户端也会自动地收到新事件，推送给服务器。这个方法有一个严重的不足，就是缺乏一种控制，服务器已经结束进程使浏览器连接超时；一个页面如果发生连接超时必然会导致其刷新。

### 长轮询

长轮询本身并不是一个真正的推送；长轮询是传统轮询技术的一种变体，但是它允许在一个真正的推送不可能的情况下模拟推送机制，例如安全策略的网站需要阻止的HTTP/S请求。

长轮询，客户端从服务器请求讯息与正常轮询完全相同，但正如你预料到的，服务器可能不会立即回应。当收到轮询时如果服务器的客户端没有新的讯息，不是发送一个空的响应，服务器端公开请求并等待成为有用的响应讯息。一旦它获得新的讯息，服务器会立即向客户端发送 HTTP/S 的响应，完成开放 HTTP 的请求。收到服务器响应后，客户端通常会立即发出另一个服务器的请求，这样，通常的反应延迟（讯息第一次可用到下一个客户端请求的中间时间）与客户端的消除相关。

例如，当这样的连接是困难的或不可能直接采用的（例如，在web浏览器），作为对连续 TCP 连接的长轮询的替代，BOSH 是一个流行的、长寿的 HTTP 技术。在 XMPP 是一个潜在的技术，苹果用于 iCloud 的推送支持。

### Flash XMLSocket 传达

这项技术被 cbox（Cbox is a chat application for online communities and groups. Get a Cbox, and your visitors and users can engage with one another in real-time conversation.）和其他聊天应用程序所使用，并在一个单像素 Adobe Flash 电影中使用 XMLSocket 对象。在 JavaScript 控制下，客户端建立一个 TCP 连接到服务器上的单向中继。中继服务器不会从这个套接字读取任何内容，相反它会向客户端发送一个唯一标识符。接下来客户机向 web 服务器发送 HTTP 请求，包括这个标识符。Web 应用程序可以将向客户机发送的消息发送到中继服务器的本地接口，然后中继服务器通过 Flash 套接字传递给客户机。这种方法的优点是，它能鉴别许多 web 应用程序的典型的读写不对称，包括聊天，它还提供了更高的效率。由于它不接受传出套接字的数据，所以中继服务器根本不需要轮着传出 TCP 连接，使其保持数万个并发连接成为可能。在这个模型中扩展的限制是底层服务器操作系统的 TCP 堆栈。

### 可靠的组数据传送 (RGDD)

例如云计算的服务，增加数据的可靠性和可用性，这通常被推送（被复制）到多台机器上。例如， Hadoop 分布式文件系统（数据库）对所有的储存对象复制两个副本。RGDD 重点研究有效的铸造一个对象从一个位置到多个位置与此同时通过发送极小的数目的副本来节省宽带（在最好的情况下只有一个）在任何跨越网络的对象。例如，数据广播是一个在数据中心传递多个节点，依靠规则和结构化拓扑和 DCCast 是一个类似接近跨过数据中心交付方法的方案