使命必達 深入剖析WCF的可靠會話 概念篇

2022-01-16 20:35:45 字數 1807 閱讀 7396

在《例項篇》中,我通過可靠會話成功地進行了美女的傳輸,相信大家在保了眼福之餘,會對wcf的可靠會話的功用具有乙個深刻的認識。實際上,這涉及到ws中乙個重要的概念——可靠訊息傳輸(rm:reliable messaging)。如果想對可靠會話有乙個深入的認識,對可靠訊息傳輸的了解是必須的。

我們可以將乙個通過wcf構建的分布式應用劃分為兩個部分,即客戶端應用和服務端應用,它們之間的互動方式即採用某種mep的訊息交換。在這裡,我們需要通過可靠訊息傳輸機制確保從客戶端應用(或者服務端應用)傳送的訊息能夠成功地被服務端應用(或者客戶端應用)接收。也就是說,可靠訊息傳輸提供的是一種端到端的訊息傳輸確保機制,而不管兩個終端之間是否具有相應的中間結點(intermediary),比如路由器、防火牆和**之類。除了確保對訊息的可靠交付,可靠訊息傳輸還需要解決以下兩個問題:

說道這裡,可能有的讀者對可靠訊息傳輸機制有一種是曾相識之感,是不是覺得這個tcp協議對於tcp報文段(tcp segment)的可靠交付機制有點類似。

稍微有點網路知識的讀者應該都知道,ip協議是tcp/ip協議簇中最為核心的協議。對於協議分層(鏈路層、網路層、傳輸層和應用層)體系中,屬於網路層協議。所有的tcp、upd、icmp以及igmp協議均是建立在ip協議之上。

而作為傳輸層的tcp協議,眾所周知,這是乙個可靠的、基於連線的協議。tcp協議傳輸的資料單位被稱為報文段(segment),可靠的tcp協議能夠確保發出的報文段能夠成功地抵達目的地。那麼,建立在不可靠的ip協議上的tcp協議是如何實現報文段的可靠交付的呢?大體上說,下面兩種機制取保了tcp協議對「使命必達」的承諾:

對於上述的訊息確認和超時重傳的機制,細心的讀者會發現這會出現兩個問題:如果接收端tcp成功接收到某個報文段,並且成功傳送了確認。但是,如果確認訊息丟失,傳送端tcp會對相應的報文段進行重傳,就意味著接收端有可能接收到兩份重複的報文段。很顯然,接收端tcp不能將重複的報文段向上層交付,那麼如何解決重複報文段的問題呢?

第二個問題,報文段在傳送端tcp傳送的節奏和在接收端tcp被接收的節奏是不同的,所以不可能保證報文段完全以傳送的順序被接收。但是,接收端tcp必須保證交付給上層的報文段的順序必須是報文段被傳送的順序,這又是如何做到的呢?

要解決上述的兩個問題,首先需要解決的是對報文段的識別機制。對於tcp協議來說,每乙個報文段具有乙個序號,一般代表報文段承載的資料在整個傳送的資料塊所處的位置(以位元組為單位),通過這個序列號就可以確定報文段傳送的順序。此外,除了傳送端tcp具有乙個傳送端視窗外,接收端tcp同樣具有自己的接收端視窗,用於存放已經接收當時尚未交付的報文段如果說具有大序列號的報文段被先接收到,會先被置於接收端視窗中,只有等到前面的所有的報文段都抵達之後,接收端tcp才會按照序列號的順序依次對報文段實施交付如果接收到的報文段的序列化小於或者等於接收端視窗的任乙個報文段的序列化,接收端tcp會將其作為重複報文段而丟棄

從上面的介紹我們可以看出,tcp協議已經解決了我們之前提出關於可靠訊息傳輸的三個難題:訊息的可靠交付重複訊息處理有序交付。實際上,wcf基於可靠會話機制的可靠訊息傳輸的實現原理和tcp協議基本一致,如果硬是要找出不一致的地方,主要表現在以下四點:

由於可靠訊息傳輸對於soa的重要性,在ws-*體系中具有專門的規範,即我們即將介紹的ws-reliable messaging,簡稱ws-rm。在《協議篇》中我將對ws-rm進行詳細的介紹。

出處:

深入剖析C 的多型

一 什麼是多型 物件導向程式設計中的另外乙個重要概念是多型性。在執行時,可以通過指向基類的指標,來呼叫實現 派生類中的方法。可以把一組物件放到乙個陣列中,然後呼叫它們的方法,在這種場合下,多型性作用就體現出來了,這些物件不必是相同型別的物件。當然,如果 它們都繼承自某個類,你可以把這些派生類,都放到...

深入剖析C 的多型

天雨 一 什麼是多型 物件導向程式設計中的另外乙個重要概念是多型性。在執行時,可以通過指向基類的指標,來呼叫實現派生類中的方法。可以把一組物件放到乙個陣列中,然後呼叫它們的方法,在這種場合下,多型性作用就體現出來了,這些物件不必是相同型別的物件。當然,如果它們都繼承自某個類,你可以把這些派生類,都放...

深入剖析C 的多型

天雨 一 什麼是多型 物件導向程式設計中的另外乙個重要概念是多型性。在執行時,可以通過指向基類的指標,來呼叫實現派生類中的方法。可以把一組物件放到乙個陣列中,然後呼叫它們的方法,在這種場合下,多型性作用就體現出來了,這些物件不必是相同型別的物件。當然,如果它們都繼承自某個類,你可以把這些派生類,都放...