推送技術

推送技術（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 是一個類似接近跨過數據中心交付方法的方案