1. 程式人生 > >訊息通訊機制

訊息通訊機制

在不可靠的介質上實現可靠的資訊交換。考慮由資料網路連線的兩個程序 a 和 b,從一個程序向另一個程序傳輸訊息。訊息發出之後,可以在任意時間內接收,也可能在網路中丟失。

網路控制過程(network control procedure,NCP)的使用增加了通訊的可靠性,通過NCP,程序 a 和 b 訪問網路。程序 a 給NCP A 一個資訊單元 m 來初始化通訊。NCP之間的互動作用(經過資料網路,DN)必須保證資訊 m 被髮送到程序 b(通過NCP B),之後 NCP A 通知程序 a 關於資訊的傳送。
這裡寫圖片描述
即使程序 a 只傳送了一個資訊單元給程序 b,由於網路不穩定,NCP A 和 NCP B 之間的對話由幾條訊息組成,它們要維持這個對話的狀態資訊,但是由於每一個程序可能的對話物件數量很大, 因此在訊息交換完成之後,狀態資訊即被拋棄。狀態資訊的初始化稱作開啟,拋棄稱作關閉。
如果 a 傳送訊息給 b,而該資訊單元未傳送到 b,則稱資訊單元m是丟失的。
如果它被髮送兩次,則稱單元 m 為可複製的。
可靠的通訊機制不僅防止複製而且防止丟失。
可靠的通訊不存在
不管 NPC 設計的如何複雜,也不可能達到完全可靠的通訊。這一結論獨立於資料網或者 NCP 的設計並僅僅取決於這樣一個假設:NCP 可能丟失有關一次啟用對話的資訊。

假設程序 a 進行通訊初始化之後,NCP A 與 NCP B 開始對話,再接到來自 NCP A 的訊息 m 之後,假定 NCP B 將訊息傳送至 b。

我們嘗試設計這樣一種協議,在任何情況下,它都可以避免丟失。
一訊息對話
1、在最簡單的設計中,初始化之後,NCP A 單獨由網路傳送不可更改的資料,並通知 a,然後關閉。
2、NCP B 總是將所接收的資料傳送給 b,傳送之後即關閉。
當網路訊息傳送失敗時,這種協議就會引起資訊丟失,但是不會引入訊息複製。

兩訊息對話
在協議中增加一個確認,就可對訊息進行有限的保護以防丟失。
1、NCP A 傳送 <data,m>


2、NCP B 接收 <data,m>,傳送 m,傳送 <ack>,關閉
3、NCP A 接收 <ack>,通知,關閉;如果超時沒有接到確認應答,重新進行步驟1
當 NCP A 超時沒有收到應答,重新發送資訊時,此時 NCP B 可能收到了訊息,並返回了 ack,已關閉。重新收到的這個訊息會被當做一個新到達的訊息處理,造成了資訊複製的問題。

該協議也不能保證資料不會丟失,考慮程序 a 提供兩個資訊單元 m1 和 m2 進行傳輸
1)NCP A 傳送 <data,m1>
2)NCP B 接收 <data,m1> ,傳送 m1,傳送 <

ack>,關閉
3)NCP A 超時,傳送 <data,m1>
4)NCP B 接收 <data,m1> , 傳送 m1,傳送 <ack> ,關閉
5)NCP A 接收 <ack> ,通知,關閉
6)NCP A 傳送 <data,m2>
7)DN <data,m2> 丟失
8)NCP A 接收 <ack> (step 2),通知,關閉

三訊息對話
1)NCP A 傳送 <data,m>
2)NCP B 接收<data,m>,傳送 m,傳送<ack>
3)NCP A 接收<ack>,通知,傳送<close>,關閉
4)NCP B 接收 <close>,關閉
如果訊息 <data,m> 丟失,引起 NCP A 超時,這種情況下,NCP A 重發訊息,沒有問題。<ack> 訊息丟失也會引起 <data,m> 訊息重發,但這不會導致複製,因為 NCP B 存在一個開啟的對話,並且能夠識別它已經接收的訊息。
該協議仍然存在丟失和複製的可能。當 <close> 丟失時,NCP B 也必須關閉,如果沒有接收到 <close> 訊息,它必須重傳 <ack> 訊息。在 NCP B 關閉之後,NCP A 應答沒有對話。重傳的 <ack> 可能會到下一次 NCP A 的對話中,被當做那次對話的確認訊息。
1)NCP A 傳送 <data,m1>
2)NCP B 接收 <data,m1>,傳送 m1,傳送 <ack>
3)NCP A 接收 <ack>,通知,傳送 <close>,關閉
4)DN <close> 丟失
5)NCP A 傳送 <data,m2>
6)DN <data,m2> 丟失
7)NCP B 重傳 <ack> (第2步)
8)NCP A 接收 <ack>,通知,傳送 <close>,關閉
9)NCP B 接收 <close>,關閉
由於一個對話中的訊息干擾了另一對話中的訊息,再次引出問題。可以為每個新的對話選擇一個新的對話識別號解決這個問題。NCP A,NCP B 各一個,所選的識別號包括在所有對話的資訊中,用於驗證所接收到的訊息是否確實屬於當前對話。一般的三訊息協議如下:
1)NCP A 傳送 <data,m,x>
2)NCP B 接收 <data,m,x>,傳送 m,傳送 <ack,x,y>
3)NCP A 接收 傳送 <ack,x,y>,通知,傳送 傳送 <close,x,y>,關閉
4)NCP B 接收 <close,x,y>,關閉
該修改排除了之前給出的錯誤對話。
然而在傳送 m 之前(第2步),NCP B 並不驗證一條訊息 <data,m,x> 的有效性,這很容易導致資訊的複製。如果在第1步所發的訊息延遲並重新發送,後到的 <data,m,x> 將引起 NCP B 再次傳送訊息 m。
可考慮對三訊息對話做修改,使得 NCP B 在第 4 步而不是第 2 步傳送資料。這樣不會導致資料的重複傳送,但是必須保證,NCP B 可以在任意情況下傳送資料,尤其是當 <close,x,y> 訊息丟失時。NCP B 重發 <ack,x,

相關推薦

NSNotificationCenter訊息通訊機制介紹(KVO)

作用:NSNotificationCenter是專門供程式中不同類間的訊息通訊而設定的. 註冊通知:即要在什麼地方接受訊息                [[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector(m

IOS NSNotificationCenter訊息通訊機制介紹

訊息傳送機構:舉例說明 在有需要的類中,傳送訊息 //傳送訊息出去,這裡的物件是一個數組:saveImageArray [[NSNotificationCenter defaultCenter] postNotificationName:@"postData" object:saveImageArray];

訊息通訊機制

在不可靠的介質上實現可靠的資訊交換。考慮由資料網路連線的兩個程序 a 和 b,從一個程序向另一個程序傳輸訊息。訊息發出之後,可以在任意時間內接收,也可能在網路中丟失。 網路控制過程(network control procedure,NCP)的使用增加了通訊的

程序間互斥、程序間同步 & 訊息通訊機制的同步、非同步

程序的互斥、同步: 互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。   同步:是指在互斥的基礎上(大多數情況),通過其

Linux中程序間通訊機制----訊息佇列

一、什麼是訊息 訊息(message)是一個格式化的可變長的資訊單元。訊息機制允許由一個程序給其它任意的程序傳送一個訊息。當一個程序收到多個訊息時,可將它們排成一個訊息佇列。 1、訊息機制的資料結構 (1)訊息首部 記錄一些與訊息有關的資訊,如訊息的型別、大小、

Storm 訊息容錯機制通訊

ack 是什麼 ack 機制是 storm 整個技術體系中非常閃亮的一個創新點。 通過 ack 機制,spout 傳送的每一條資訊,都可以確定是被成功處理或失敗處理,從而可以讓開發者採取行動。比如在meta中,成功被處理,即可更新偏移量,當失敗時,重複傳送處理。 因此,

訊息傳遞機制通訊

一 同步和非同步(執行緒) 在維基百科中的釋義是:在計算機程式設計中,非同步,指的是獨立於主程式流發生的事件,以及處理該事件的方式。這些可能是“外部”事件,例如訊號的到達,或由程式發起的操作,該操作與程式同時/併發的執行,而程式不需要阻塞的等待結果。非同步的輸入(input)/輸出(outp

執行緒通訊機制---共享記憶體:訊息傳遞

在併發程式設計中,我們必須考慮的問題時如何在兩個執行緒間進行通訊。這裡的通訊指的是不同的執行緒之間如何交換資訊。 目前有兩種方式: 1、共享記憶體 2、訊息傳遞(actor 模型) 共享記憶體 共享記憶體這種方式比較常見,我們經常會設定一個共享變數。然後多個執行緒去操作

程序間通訊機制(管道、訊號、共享記憶體/訊號量/訊息佇列)、執行緒間通訊機制(互斥鎖、條件變數、posix匿名訊號量)

(1)系統中每個訊號量的資料結構(sem)struct sem {     int semval; /* 訊號量的當前值 */     unsigned short  semzcnt;  /* # waiting for zero */     unsigned short  semncnt;  /* # w

OpenStack建立例項完整過程原始碼詳細分析(14)----依據AMQP通訊架構實現訊息接收機制解析之一

感謝朋友支援本部落格,歡迎共同探討交流,由於能力和時間有限,錯誤之處在所難免,歡迎指正! 如果轉載,請保留作者資訊。 部落格地址:http://blog.csdn.net/gaoxingnengjisuan 郵箱地址:[email protected] 這篇博文

一個簡單的pingpong程式測試mpi訊息通訊的開銷

一個簡單的pingpong程式測試mpi訊息通訊的開銷 隨著科技的進步,叢集單節點計算能力的提高,似乎通訊開銷成了平行計算中dominant,再提高計算能力對於並行的增益似乎效果不明顯,限制性能的瓶頸從處理器計算能力上轉移到通訊開銷上。顯然,此時設法降低MPI訊息通訊帶來的時間消耗,

Spark內建框架rpc通訊機制及RpcEnv基礎設施-Spark商業環境實戰

本套系列部落格從真實商業環境抽取案例進行總結和分享,並給出Spark原始碼解讀及商業實戰指導,請持續關注本套部落格。版權宣告:本套Spark原始碼解讀及商業實戰歸作者(秦凱新)所有,禁止轉載,歡迎學習。 Spark商業環境實戰及調優進階系列 Spark商業環境實戰-Spark內建框架rpc通訊機制及

MFC訊息對映機制的理解

當窗體,控制元件,點選標題欄等時,會產生訊息,然後發給訊息處理函式進行處理,而訊息與訊息對映表是一一對應的關係,這個關係就是訊息對映表,根據根據訊息通過訊息對映表來查詢對應的訊息處理函式,這就稱為訊息對映機制。 而Windows有自己的訊息佇列,通過訊息迴圈,採用GetMessage來獲取訊

Rabbitmq中的RPC通訊機制

具體工作機制: Our RPC will work like this: When the Client starts up, it creates an anonymous exclusive callback queue. For an RPC request, the

android 非同步訊息處理機制 — AHandler

1. 引入 ALooper、AHandler、AMessage 在 android multimedia stagefright 的框架程式碼中,通篇都是這幾個類的身影,所以熟悉 android 多媒體框架的第一步必須理解這幾個類的含義。 這幾個類是為了實現非同步訊息機制而設計的

通訊機制解決生產者消費者問題

                                   通訊機制解決生產者消費者問題實現高併發 生產者

深入剖析 Web 伺服器與 PHP 應用之間的通訊機制 - 掌握 CGI 和 FastCGI 協議的執行原理

本文首發於 深入剖析 Web 伺服器與 PHP 應用之間的通訊機制 - 掌握 CGI 和 FastCGI 協議的執行原理,轉載請註明出處! 身為一名使用 PHP 語言開發後端服務的程式猿,我們每天都和 PHP 以及 Web 伺服器產生無數次的親密接觸。得益於它們,我們才能

Android核心技術-day04-01-網路圖片檢視器(安卓訊息迴圈機制)

package com.gaozewen.netimageviewer; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import and

基於Java NIO2實現的非同步非阻塞訊息通訊框架

原文傳送門 基於Java NIO2實現的非同步非阻塞訊息通訊框架 前奏 AIO應用開發 Future方式 Callback方式 Reader/Writer方式實現 執行緒池和Group PendingExceptio

JMS訊息可靠機制

ActiveMQ訊息簽收機制: 客戶端成功接收一條訊息的標誌是一條訊息被簽收,成功應答。 訊息的簽收情形分兩種: 1、帶事務的session    如果session帶有事務,並且事務成功提交,則訊息被自動簽收。如果事務回滾,則訊息會被再次傳送。 2、不帶事務的sess