使命必達: 深入剖析WCF的可靠會話[概念篇]
在《實例篇》中,我通過可靠會話成功地進行了美女圖片的傳輸,相信大家在保了眼福之餘,會對WCF的可靠會話的功用具有一個深刻的認識。實際上,這涉及到WS中一個重要的概念——可靠消息傳輸(RM:Reliable Messaging)。如果想對可靠會話有一個深入的認識,對可靠消息傳輸的了解是必須的。
一、可靠消息傳輸(Reliable Messaging)
我們可以將一個通過WCF構建的分布式應用劃分為兩個部分,即客戶端應用和服務端應用,它們之間的交互方式即采用某種MEP的消息交換。在這裏,我們需要通過可靠消息傳輸機製確保從客戶端應用(或者服務端應用)發送的消息能夠成功地被服務端應用(或者客戶端應用)接收。也就是說,可靠消息傳輸提供的是一種端到端的消息傳輸確保機製,而不管兩個終端之間是否具有相應的中間結點(Intermediary),比如路由器、防火牆和代理之類。除了確保對消息的可靠交付,可靠消息傳輸還需要解決以下兩個問題:
- 重複消息(Duplicate Message):對於某一個客戶端發出的消息,服務端接收到兩個以上相同的副本。可靠消息傳輸機製需要具有對重複消息的識別能力;
- 無序交付(Disordered Delivery):服務端接收到的消息序列與消息發送序列不一致。在某些情況下,我們要求WCF服務端框架嚴格按照消息在客戶端應用中被發送的順序交付給服務端應用,這需要消息傳輸機製提供有序消息交付(Ordered Message Delivery)的功能。
說道這裏,可能有的讀者對可靠消息傳輸機製有一種是曾相識之感,是不是覺得這個TCP協議對於TCP報文段(TCP Segment)的可靠交付機製有點類似。
二、TCP對報文段(Segment)的可靠交付機製
稍微有點網絡知識的讀者應該都知道,IP協議是TCP/IP協議簇中最為核心的協議。對於協議分層(鏈路層、網絡層、傳輸層和應用層)體係中,屬於網絡層協議。所有的TCP、UPD、ICMP以及IGMP協議均是建立在IP協議之上。
IP協議傳輸的數據單位是數據報(Datagram),數據報的首部(一般20個字節)包含有源和目標的IP地址以及其他的相應的尋址和控製信息。IP協議具有以下兩個顯著的特點:
- 不可靠(Unreliable): IP協議隻能盡可能提供最好的傳輸服務,但不能保證數據報能夠成功地抵達目的地。如果發生某種錯誤,它有一個簡單的錯誤處理算法:丟棄數據報,然後發送通知信息給發送端;
- 無連接(Connectionless):IP協議並不維護任何關於後續數據報的狀態信息,每一個數據報都是被獨立處理的。
而作為傳輸層的TCP協議,眾所周知,這是一個可靠的、基於連接的協議。TCP協議傳輸的數據單位被稱為報文段(Segment),可靠的TCP協議能夠確保發出的報文段能夠成功地抵達目的地。那麼,建立在不可靠的IP協議上的TCP協議是如何實現報文段的可靠交付的呢?大體上說,下麵兩種機製取保了TCP協議對“使命必達”的承諾:
- 消息確認(Message Acknowledgement):當接收端TCP成功接收到TCP報文段之後,會在一個短暫的時間間隔內(並不是在成功接收到報文的那一刻),向發送端發送一個表明該報文段已經被成功接收確認消息(Acknowledgement);
- 超時重傳:發送端具有一個存儲報文段的緩衝區(Buffer),我們一般稱為發送端窗口(Sender Window),用於存放已經發送但是尚未接受到確認的報文段。如果接收到確認,會將相應的報文段從發送端窗口中移除。如果在一定的超時時限內沒有接收到確認消息,會認為相應的報文段發送失敗,此時發送端TCP會從發送端窗口中提取相應的報文段進行重新發送。
對於上述的消息確認和超時重傳的機製,細心的讀者會發現這會出現兩個問題:如果接收端TCP成功接收到某個報文段,並且成功發送了確認。但是,如果確認消息丟失,發送端TCP會對相應的報文段進行重傳,就意味著接收端有可能接收到兩份重複的報文段。很顯然,接收端TCP不能將重複的報文段向上層交付,那麼如何解決重複報文段的問題呢?
第二個問題,報文段在發送端TCP發送的節奏和在接收端TCP被接收的節奏是不同的,所以不可能保證報文段完全以發送的順序被接收。但是,接收端TCP必須保證交付給上層的報文段的順序必須是報文段被發送的順序,這又是如何做到的呢?
要解決上述的兩個問題,首先需要解決的是對報文段的識別機製。對於TCP協議來說,每一個報文段具有一個序號,一般代表報文段承載的數據在整個發送的數據塊所處的位置(以字節為單位),通過這個序列號就可以確定報文段發送的順序。此外,除了發送端TCP具有一個發送端窗口外,接收端TCP同樣具有自己的接收端窗口,用於存放已經接收當時尚未交付的報文段。如果說具有大序列號的報文段被先接收到,會先被置於接收端窗口中,隻有等到前麵的所有的報文段都抵達之後,接收端TCP才會按照序列號的順序依次對報文段實施交付。如果接收到的報文段的序列化小於或者等於接收端窗口的任一個報文段的序列化,接收端TCP會將其作為重複報文段而丟棄。
從上麵的介紹我們可以看出,TCP協議已經解決了我們之前提出關於可靠消息傳輸的三個難題:消息的可靠交付、重複消息處理和有序交付。實際上,WCF基於可靠會話機製的可靠消息傳輸的實現原理和TCP協議基本一致,如果硬是要找出不一致的地方,主要表現在以下四點:
- WCF可靠消息傳輸是基於SOAP消息級別的,TCP則是基於報文段級別;
- WCF可靠消息傳輸是與傳輸協議無關的,並不限於TCP協議;
- WCF的可靠消息傳輸並沒有具體傳輸會話(Transport Session)的限製,可以跨越多個傳輸連接或者會話;
- TCP在當前TCP連接範圍內提供端到端的可靠傳輸,而WCF的可靠消息傳輸在兩個SOAP終結點之間提供可靠傳輸,並不受傳輸連接(Transport Connection)的限製
由於可靠消息傳輸對於SOA的重要性,在WS-*體係中具有專門的規範,即我們即將介紹的WS-Reliable Messaging,簡稱WS-RM。在《協議篇》中我將對WS-RM進行詳細的介紹。
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
最後更新:2017-10-27 15:04:31