本文提出了一個(gè)旨在幫助指導(dǎo)設(shè)計(jì)分布式計(jì)算系統(tǒng)各模塊功能的原則,稱之為端到端原則。該原則表明,考慮到在底層提供功能的成本,這些實(shí)現(xiàn)在系統(tǒng)底層的功能可能是多余的或沒有提供什么價(jià)值。本文討論的例子包括比特錯(cuò)誤恢復(fù)、基于加密的安全、重復(fù)信息抑制、系統(tǒng)崩潰恢復(fù)以及交付確認(rèn),性能是當(dāng)前在底層支持這些功能的唯一理由。
簡(jiǎn)介
定義功能之間的適當(dāng)界限也許是系統(tǒng)設(shè)計(jì)師的主要活動(dòng),為功能實(shí)現(xiàn)選擇合適位置的指導(dǎo)原則是系統(tǒng)設(shè)計(jì)者最重要的工具之一。本文討論的這組原則已經(jīng)用了很多年,但既沒有被明確識(shí)別,也沒有有力的論證。然而,數(shù)據(jù)通信網(wǎng)絡(luò)作為計(jì)算機(jī)系統(tǒng)的組成部分的出現(xiàn),使該原則的論點(diǎn)更加鮮明,其適用情況和理由更加明顯。本文明確闡述了這一原則,以便研究其性質(zhì),看看到底有多普遍。該原則訴諸于應(yīng)用需求,并提供了在分層系統(tǒng)中在上層實(shí)現(xiàn)功能的理由,使其更接近使用該功能的應(yīng)用。接下來我們首先考慮這一原則的通信網(wǎng)絡(luò)版本。
在一個(gè)包括通信的系統(tǒng)中,通常在通信子系統(tǒng)周圍定義模塊邊界,并在其和系統(tǒng)其他部分之間定義牢固的接口。這么做的時(shí)候,會(huì)發(fā)現(xiàn)一個(gè)功能列表,其中每個(gè)功能都可能以幾種方式中的任何一種來實(shí)現(xiàn): 由通信子系統(tǒng)實(shí)現(xiàn),由其調(diào)用者實(shí)現(xiàn),聯(lián)合實(shí)現(xiàn),或者也許這個(gè)功能是多余的,又或者每個(gè)人都做自己的版本。在考慮不同選擇時(shí),應(yīng)用需求為一類原則提供了基礎(chǔ),其內(nèi)容如下:
相關(guān)功能只有站在通信系統(tǒng)終端的應(yīng)用知識(shí)的幫助下才能完整正確的實(shí)施。因此,提供該功能作為通信系統(tǒng)本身的特征是不可能的。(有時(shí),通信系統(tǒng)提供的不完整版本的功能可能有用,可以提高性能)。
我們將這種反對(duì)在底層實(shí)現(xiàn)功能的原則稱為"端到端原則",下面幾節(jié)將詳細(xì)研究該原則。首先介紹一個(gè)使用該原則的典型案例研究(可靠數(shù)據(jù)傳輸),然后展示同一論點(diǎn)可以應(yīng)用于哪些功能的范圍。就數(shù)據(jù)通信系統(tǒng)而言,這個(gè)范圍包括加密、重復(fù)信息檢測(cè)、信息排序、保證信息交付、檢測(cè)主機(jī)崩潰和送達(dá)保證。在更廣泛的背景下,該原則似乎適用于計(jì)算機(jī)操作系統(tǒng)的許多其他功能,包括文件系統(tǒng)。然而,為了使研究跟容易,我們只考慮更具體的數(shù)據(jù)通信背景。
端到端考量
考慮"可靠文件傳輸"問題。文件通過文件系統(tǒng)存儲(chǔ)在計(jì)算機(jī)A的磁盤存儲(chǔ)器中,主機(jī)A通過數(shù)據(jù)通信網(wǎng)絡(luò)與主機(jī)B相連,后者也有文件系統(tǒng)和磁盤存儲(chǔ)器,目標(biāo)是將文件無損的從主機(jī)A的存儲(chǔ)空間轉(zhuǎn)移到主機(jī)B的存儲(chǔ)空間。在這種情況下,應(yīng)用程序是文件傳輸程序,一部分在主機(jī)A運(yùn)行,一部分在主機(jī)B運(yùn)行。為了討論這個(gè)過程中對(duì)文件完整性的可能威脅,我們假設(shè)涉及以下具體步驟:
在主機(jī)A上,文件傳輸程序調(diào)用文件系統(tǒng)從磁盤上讀取文件,文件駐留在若干個(gè)軌道上,文件系統(tǒng)以獨(dú)立于磁盤格式的固定大小的塊將其傳遞給文件傳輸程序。
同樣在主機(jī)A上,文件傳輸程序要求數(shù)據(jù)通信系統(tǒng)使用某種通信協(xié)議傳輸文件,該協(xié)議將數(shù)據(jù)分割成包,數(shù)據(jù)包大小通常與文件塊大小和磁盤軌道大小不同。
數(shù)據(jù)通信網(wǎng)將數(shù)據(jù)包從計(jì)算機(jī)A傳送到計(jì)算機(jī)B。
在主機(jī)B上,數(shù)據(jù)通信程序?qū)?shù)據(jù)包從數(shù)據(jù)通信協(xié)議中取出來,并將所含數(shù)據(jù)交給文件傳輸應(yīng)用程序的第二部分,即在主機(jī)B內(nèi)操作的部分。
在主機(jī)B上,文件傳輸程序要求文件系統(tǒng)將接收到的數(shù)據(jù)寫到主機(jī)B的磁盤上。
基于該模型所涉及的步驟,細(xì)心的設(shè)計(jì)者可能會(huì)關(guān)注以下一些事務(wù)威脅:
該文件雖然最初正確寫入到主機(jī)A的磁盤上,但由于由于磁盤存儲(chǔ)系統(tǒng)中的硬件故障,現(xiàn)在讀取可能包含不正確的數(shù)據(jù)。
文件系統(tǒng)、文件傳輸程序或數(shù)據(jù)通信系統(tǒng)可能在主機(jī)A或主機(jī)B上緩沖和復(fù)制文件數(shù)據(jù)時(shí)出錯(cuò)。
硬件處理器或其本地內(nèi)存在主機(jī)A或主機(jī)B進(jìn)行緩沖和復(fù)制時(shí)可能會(huì)出現(xiàn)短暫錯(cuò)誤。
通信系統(tǒng)可能會(huì)丟失或改變包中的位,或者丟失整個(gè)包,或者多次傳送某個(gè)包。
任何一個(gè)主機(jī)在執(zhí)行未知數(shù)量(可能是全部)的事務(wù)后,都可能在事務(wù)執(zhí)行的中途崩潰。
那么,一個(gè)可靠文件傳輸應(yīng)用程序?qū)⑷绾螒?yīng)對(duì)這一系列威脅?一種方法可能是使用重復(fù)拷貝、超時(shí)和重試、仔細(xì)定位錯(cuò)誤檢測(cè)的冗余、崩潰恢復(fù)等來強(qiáng)化每個(gè)步驟,目標(biāo)是將單獨(dú)威脅的概率降低到一個(gè)可接受的小概率。不幸的是,系統(tǒng)對(duì)抗第二個(gè)威脅需要編寫正確的程序,這項(xiàng)任務(wù)相當(dāng)困難,而且并非所有必須考慮的程序都是由文件傳輸應(yīng)用的開發(fā)者編寫的。如果進(jìn)一步假設(shè)所有這些威脅的概率相對(duì)較低,低到允許系統(tǒng)完成有用的工作,那么非要采取把所有事情做三遍這樣的蠻力反制措施就顯得不太經(jīng)濟(jì)了。
另一種方法可被稱為"端到端檢查和重試"。假設(shè)作為應(yīng)對(duì)第一種威脅的輔助手段,每個(gè)文件都存儲(chǔ)一個(gè)校驗(yàn)和,該校驗(yàn)和具有足夠的冗余度,可以將文件中未被發(fā)現(xiàn)的錯(cuò)誤的機(jī)會(huì)減少到一個(gè)可接受的概率。然后,作為最后的附加步驟,主機(jī)B中的文件傳輸應(yīng)用程序?qū)⑽募北緩拇疟P存儲(chǔ)系統(tǒng)中讀回內(nèi)存,重新計(jì)算校驗(yàn)和,并將此值送回主機(jī)A,在那里與原始文件校驗(yàn)和進(jìn)行比較。只有當(dāng)兩個(gè)校驗(yàn)和一致時(shí),文件傳輸應(yīng)用程序才會(huì)宣布該事務(wù)已提交。如果比較失敗,則說明出了問題,可以嘗試重試。
如果故障真的相當(dāng)罕見,這種技術(shù)通常會(huì)在第一次嘗試時(shí)發(fā)揮作用,偶爾可能需要第二次甚至第三次嘗試。人們可能會(huì)認(rèn)為在同一個(gè)文件傳輸嘗試中出現(xiàn)兩次或更多故障,表明系統(tǒng)的某些部分需要修復(fù)。
現(xiàn)在我們考慮一個(gè)常見建議,即通信系統(tǒng)在內(nèi)部提供可靠數(shù)據(jù)傳輸保證。通信系統(tǒng)可以通過提供可選擇的冗余來實(shí)現(xiàn),例如數(shù)據(jù)包校驗(yàn)、序列號(hào)檢查和內(nèi)部重試機(jī)制等。在大部分情況下,未檢測(cè)到的比特錯(cuò)誤的概率可以減少到理想水平。問題是,通信系統(tǒng)方面的這種嘗試是否對(duì)可靠文件傳輸應(yīng)用有幫助。
答案是,第四種威脅可能已經(jīng)被消除了,但可靠文件傳輸應(yīng)用程序仍然必須對(duì)抗其余的威脅,所以仍應(yīng)根據(jù)文件的端到端校驗(yàn)提供重試。而如果這樣做了,在通信系統(tǒng)中為提供可靠數(shù)據(jù)傳輸保證所花費(fèi)的額外努力只是減少了文件傳輸應(yīng)用的重試頻率,對(duì)結(jié)果的必然性或正確性沒有影響,因?yàn)闊o論數(shù)據(jù)傳輸系統(tǒng)是否特別可靠,端到端校驗(yàn)和重試都能保證文件的正確傳輸。
因此,結(jié)論是: 為了實(shí)現(xiàn)可靠文件傳輸,執(zhí)行傳輸?shù)膽?yīng)用程序必須提供針對(duì)文件傳輸?shù)?、端到端的可靠性保證,在這種情況下,要有檢測(cè)故障的校驗(yàn)和以及重試/提交計(jì)劃。對(duì)于數(shù)據(jù)通信系統(tǒng)來說,不遺余力的做到特別可靠,并不能減少應(yīng)用程序確??煽啃缘呢?fù)擔(dān)。
一個(gè)過于真實(shí)的例子
最近MIT出現(xiàn)了一個(gè)有趣的例子,說明人們可能遇到的陷阱。一個(gè)網(wǎng)絡(luò)系統(tǒng)涉及幾個(gè)由網(wǎng)關(guān)連接的本地網(wǎng)絡(luò),從一個(gè)網(wǎng)關(guān)到下一個(gè)網(wǎng)關(guān)的每一跳都使用了數(shù)據(jù)包校驗(yàn),其假設(shè)是對(duì)正確通信的主要威脅是傳輸過程中的比特?fù)p壞。應(yīng)用開發(fā)者知道這種校驗(yàn),認(rèn)為網(wǎng)絡(luò)提供了可靠的傳輸,而沒有意識(shí)到傳輸?shù)臄?shù)據(jù)在存儲(chǔ)在每個(gè)網(wǎng)關(guān)時(shí)是不受保護(hù)的。一臺(tái)網(wǎng)關(guān)計(jì)算機(jī)出現(xiàn)了某個(gè)瞬時(shí)錯(cuò)誤,當(dāng)把數(shù)據(jù)從輸入緩沖區(qū)復(fù)制到輸出緩沖區(qū)時(shí),一個(gè)字節(jié)對(duì)被交換了,其頻率大約為每百萬字節(jié)中有一個(gè)這樣的交換。在一段時(shí)間內(nèi),一個(gè)操作系統(tǒng)的許多源文件反復(fù)通過有缺陷的網(wǎng)關(guān)傳輸。其中一些源文件被字節(jié)交換破壞了,文件所有者被迫進(jìn)行最終的端到端錯(cuò)誤檢查,即與舊文件進(jìn)行手工比較和糾正。
性能方面
然而,如果得出結(jié)論說較低層級(jí)不應(yīng)該在可靠性方面發(fā)揮任何作用,那就太簡(jiǎn)單了??紤]一個(gè)不太可靠的網(wǎng)絡(luò),每發(fā)送一百條信息就會(huì)丟掉一條,那么上述簡(jiǎn)單策略(即傳輸文件,然后檢查文件是否正確到達(dá))隨著文件長(zhǎng)度的增加,表現(xiàn)會(huì)更差。文件的所有數(shù)據(jù)包正確到達(dá)的概率隨著文件長(zhǎng)度的增加而呈指數(shù)級(jí)下降,因此傳輸文件的預(yù)期時(shí)間隨著文件長(zhǎng)度的增加而呈指數(shù)級(jí)增長(zhǎng)。顯然,在較低層級(jí)上做出一些努力來提高網(wǎng)絡(luò)可靠性,可以對(duì)應(yīng)用性能產(chǎn)生重大影響。但是,這里的關(guān)鍵思想是,較低層級(jí)不需要提供"完美"的可靠性。
因此,在數(shù)據(jù)通信系統(tǒng)內(nèi)投入可靠性措施的工作量被認(rèn)為是基于性能的工程權(quán)衡,而不是對(duì)正確性的要求。請(qǐng)注意,性能在這里有幾個(gè)方面。如果通信系統(tǒng)太不可靠,文件傳輸應(yīng)用的性能就會(huì)受到影響,因?yàn)槎说蕉诵r?yàn)失敗后要經(jīng)常重試。如果通信系統(tǒng)用內(nèi)部可靠性措施來加強(qiáng),這些措施也有性能成本,其形式是冗余數(shù)據(jù)所損失的帶寬,以及在傳送數(shù)據(jù)之前等待內(nèi)部一致性檢查所增加的延遲。如果考慮到無論通信系統(tǒng)變得多么可靠,文件傳輸應(yīng)用的端到端檢查仍然必須實(shí)施,那么就沒有理由在這個(gè)方向上走得太遠(yuǎn)。適當(dāng)"權(quán)衡"需要仔細(xì)思考,例如可以從設(shè)計(jì)通信系統(tǒng)開始,以提供很少的成本和工程努力所帶來的可靠性,然后評(píng)估其錯(cuò)誤水平,以確保與文件傳輸層面可接受的重試頻率一致。在應(yīng)用層以下的任何一點(diǎn)上,爭(zhēng)取實(shí)現(xiàn)可以忽略不計(jì)的錯(cuò)誤率可能并不重要。
基于性能來證明將功能放在低級(jí)子系統(tǒng)中的合理性,必須謹(jǐn)慎行事。有時(shí),通過對(duì)問題的徹底研究,在高層級(jí)上也可以實(shí)現(xiàn)同樣或更好的性能提升。如果在低級(jí)子系統(tǒng)中執(zhí)行某個(gè)功能,只需對(duì)已經(jīng)包含在低級(jí)子系統(tǒng)中的機(jī)器進(jìn)行最小的擾動(dòng),那么在低級(jí)子系統(tǒng)中執(zhí)行這個(gè)功能可能更有效率,但相反的情況也會(huì)發(fā)生,也就是說,在低級(jí)子系統(tǒng)中執(zhí)行這個(gè)功能可能會(huì)花費(fèi)更多。原因有兩個(gè),首先,由于低級(jí)子系統(tǒng)是許多應(yīng)用所共有的,那些不需要該功能的應(yīng)用無論如何都會(huì)為其付出代價(jià)。第二,低級(jí)子系統(tǒng)可能沒有高層級(jí)的信息,所以無法有效完成工作。
性能權(quán)衡通常相當(dāng)復(fù)雜。再次考慮在不可靠網(wǎng)絡(luò)上進(jìn)行可靠文件傳輸?shù)膯栴},提高數(shù)據(jù)包可靠性的技術(shù)通常是某種帶有重試機(jī)制的協(xié)議,并且對(duì)每個(gè)包進(jìn)行錯(cuò)誤檢查,這種機(jī)制既可以在通信子系統(tǒng)中實(shí)現(xiàn),也可以在可靠文件傳輸應(yīng)用中實(shí)現(xiàn)。例如,可靠文件傳輸中的接收器可以定期計(jì)算迄今為止收到的文件部分的校驗(yàn)和,并將其傳回給發(fā)送者,發(fā)送方可以重新傳輸任何錯(cuò)誤部分。
端到端原則并沒有告訴我們應(yīng)該把早期檢查放在哪里,任何一層都可以做這個(gè)性能增強(qiáng)的工作。將早期重試協(xié)議放在文件傳輸應(yīng)用中可以簡(jiǎn)化通信子系統(tǒng),但可能會(huì)增加總體成本,因?yàn)橥ㄐ抛酉到y(tǒng)是在應(yīng)用之間共享的,現(xiàn)在每個(gè)應(yīng)用都必須提供自己的可靠性增強(qiáng)機(jī)制。將早期重試協(xié)議放在通信子系統(tǒng)中可能更有效,因?yàn)榭梢栽诰W(wǎng)絡(luò)內(nèi)部逐跳執(zhí)行,減少糾正故障的延遲。同時(shí),可能有些應(yīng)用會(huì)發(fā)現(xiàn)自己實(shí)現(xiàn)增強(qiáng)的成本太高,但卻沒有選擇余地。為了做出明智選擇,需要大量和系統(tǒng)實(shí)現(xiàn)相關(guān)的信息。
其他端到端原則案例
送達(dá)保證
在低級(jí)子系統(tǒng)支持分布式應(yīng)用,提供本質(zhì)上必須在應(yīng)用層實(shí)現(xiàn)的功能,可能是在浪費(fèi)精力,這個(gè)基本論點(diǎn)適用于除可靠數(shù)據(jù)傳輸之外的各種功能。這個(gè)觀點(diǎn)最古老也許也是最廣為人知的案例是傳輸確認(rèn),數(shù)據(jù)通信網(wǎng)絡(luò)可以很容易的將傳遞給接收者的每條信息所對(duì)應(yīng)的確認(rèn)返回給發(fā)送者。例如,ARPANET,每當(dāng)傳遞一個(gè)信息,都會(huì)返回一個(gè)稱為"請(qǐng)求下一個(gè)信息"(RFNM, Request For Next Message)[1]的包。盡管這種確認(rèn)在網(wǎng)絡(luò)中作為某種擁塞控制機(jī)制可能有用(早期的ARPANET會(huì)在收到RFNM之前拒絕接收來自同一個(gè)發(fā)送端的新消息),但ARPANET的應(yīng)用程序從來沒有覺得該機(jī)制有多大用處,因?yàn)橹佬畔⑹欠癖凰瓦_(dá)目標(biāo)主機(jī)并不十分重要,應(yīng)用程序真正想知道的是目標(biāo)主機(jī)是否對(duì)消息進(jìn)行了處理,在消息送達(dá)后但在被處理之前可能會(huì)發(fā)生各種問題,真正需要的確認(rèn)是端到端的確認(rèn),這只能由目標(biāo)應(yīng)用發(fā)起,告訴發(fā)送端"我完成了",或者"我沒做"。
另一個(gè)獲得即時(shí)確認(rèn)的策略是使目標(biāo)主機(jī)足夠完善,當(dāng)它收到消息時(shí),同時(shí)肩負(fù)起保證消息被目標(biāo)應(yīng)用所處理的責(zé)任,這種方法可以消除某些(但不是所有)應(yīng)用對(duì)端到端確認(rèn)的需求。對(duì)于那些要求目標(biāo)主機(jī)完成的處理只有在其他主機(jī)完成類似處理后才能進(jìn)行的應(yīng)用,仍然需要端到端確認(rèn),這種應(yīng)用需要兩階段提交協(xié)議[5,10,15],這是一種更復(fù)雜的端到端確認(rèn)機(jī)制。另外,如果目標(biāo)應(yīng)用可能會(huì)失敗或拒絕進(jìn)行要求的處理,可能結(jié)果是產(chǎn)生一個(gè)失敗確認(rèn),那么仍然需要實(shí)現(xiàn)端到端確認(rèn)機(jī)制。
數(shù)據(jù)安全傳輸
另一個(gè)可以應(yīng)用端到端原則的領(lǐng)域是數(shù)據(jù)加密,有三點(diǎn)原因。首先,如果數(shù)據(jù)傳輸系統(tǒng)執(zhí)行加密和解密,就必須相信它能安全的管理所需的加密密鑰。其次,數(shù)據(jù)是透明的,因此,當(dāng)數(shù)據(jù)進(jìn)入目標(biāo)節(jié)點(diǎn)并被傳送到目標(biāo)應(yīng)用時(shí),容易受到影響。最后,消息的真實(shí)性仍然必須由應(yīng)用程序檢查。如果應(yīng)用程序執(zhí)行端到端加密,就可以獲得所需的認(rèn)證檢查,可以按照需求管理密鑰,而且數(shù)據(jù)永遠(yuǎn)不會(huì)暴露在應(yīng)用程序之外。
因此,為了滿足應(yīng)用需求,通信子系統(tǒng)沒有必要對(duì)所有流量進(jìn)行自動(dòng)加密。然而,通信子系統(tǒng)對(duì)所有流量的自動(dòng)加密可能是為了確保其他事情: 防止行為不端的用戶或應(yīng)用程序故意傳輸不應(yīng)暴露的信息。所有數(shù)據(jù)在進(jìn)入網(wǎng)絡(luò)時(shí)自動(dòng)加密是系統(tǒng)設(shè)計(jì)者用來確保信息不會(huì)泄漏到系統(tǒng)外的另一個(gè)防火墻。然而請(qǐng)注意,這與系統(tǒng)對(duì)用戶進(jìn)行驗(yàn)證從而保證對(duì)特定數(shù)據(jù)的訪問權(quán)是不同的需求。這種網(wǎng)絡(luò)級(jí)加密可以相當(dāng)簡(jiǎn)單,所有主機(jī)都可以用相同的密鑰,并經(jīng)常改變密鑰。沒有用戶級(jí)密鑰,從而簡(jiǎn)化了密鑰管理問題。該技術(shù)與應(yīng)用級(jí)認(rèn)證及加密是互補(bǔ)的,兩種機(jī)制都不能完全滿足所有需求。
重復(fù)消息抑制
一個(gè)更復(fù)雜的場(chǎng)景是重復(fù)信息的抑制。某些通信網(wǎng)絡(luò)被設(shè)計(jì)為消息或消息的一部分可能會(huì)被傳遞兩次,這通常是由于網(wǎng)絡(luò)內(nèi)的超時(shí)觸發(fā)故障檢測(cè)和重試機(jī)制的結(jié)果。網(wǎng)絡(luò)可以提供監(jiān)控和抑制此類重復(fù)消息的能力,或者只是簡(jiǎn)單的傳遞這些消息。人們可能會(huì)想到,應(yīng)用程序會(huì)發(fā)現(xiàn)處理這種可能會(huì)傳遞兩次相同消息的網(wǎng)絡(luò)是非常麻煩的事情。這的確很麻煩,不幸的是,即使網(wǎng)絡(luò)抑制了重復(fù)消息,應(yīng)用程序本身也可能在自己的失敗/重試程序中意外的產(chǎn)生重復(fù)請(qǐng)求。這些應(yīng)用層的重復(fù)消息在通信系統(tǒng)看來是不同的消息,所以無法抑制。抑制必須由應(yīng)用本身來完成,應(yīng)用需要知道如何檢測(cè)自己造成的重復(fù)消息。
一個(gè)必須在高層處理的重復(fù)抑制的常見例子是,當(dāng)遠(yuǎn)程系統(tǒng)沒有對(duì)用戶操作做出相應(yīng),用戶對(duì)此感到困惑時(shí),會(huì)發(fā)起一次新的操作。另一個(gè)例子是,大多數(shù)通信應(yīng)用涉及到應(yīng)對(duì)多站點(diǎn)事務(wù)中某一端的系統(tǒng)崩潰的規(guī)定: 當(dāng)崩潰的系統(tǒng)再次啟動(dòng)時(shí),重新建立事務(wù)。不幸的是,對(duì)系統(tǒng)崩潰的可靠檢測(cè)是有問題的,因?yàn)榭赡苤皇莵G了一個(gè)包或確認(rèn)消息被延遲了。如果是這樣,重試的請(qǐng)求就是一個(gè)重復(fù)的請(qǐng)求,只有應(yīng)用程序才可以發(fā)現(xiàn)。因此,端到端論點(diǎn)再次出現(xiàn): 如果應(yīng)用層無論如何都要有一個(gè)抑制重復(fù)的機(jī)制,該機(jī)制也可以抑制通信網(wǎng)絡(luò)內(nèi)部產(chǎn)生的任何重復(fù),所以該功能不需要在底層實(shí)現(xiàn),同樣的基本推理也適用于可以被完全忽略的信息以及重復(fù)信息。
保證FIFO消息傳遞
確保消息以相同順序發(fā)送通常是通信子系統(tǒng)的另一項(xiàng)功能,實(shí)現(xiàn)這種先進(jìn)先出(FIFO)行為的機(jī)制保證了在同一虛擬鏈路上發(fā)送的消息的順序。沿著獨(dú)立的虛擬鏈路發(fā)送的消息,或通過通信子系統(tǒng)外的中間進(jìn)程發(fā)送的消息,可能會(huì)以不同于發(fā)送順序的順序到達(dá)。分布式應(yīng)用中,某個(gè)節(jié)點(diǎn)可以發(fā)起請(qǐng)求,在幾個(gè)不同的目的地點(diǎn)發(fā)起某個(gè)操作,這就無法利用先進(jìn)先出的排序特性來保證請(qǐng)求的操作以正確的順序發(fā)生。相反,必須通過一個(gè)比通信子系統(tǒng)更高層的獨(dú)立機(jī)制控制操作的順序。
事務(wù)管理
現(xiàn)在,我們已經(jīng)將端到端原則應(yīng)用于SWALLOW分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)的構(gòu)建中[15],顯著減少了開銷。SWALLOW提供了被稱為存儲(chǔ)庫(kù)的數(shù)據(jù)存儲(chǔ)服務(wù)器,可用于遠(yuǎn)程存儲(chǔ)和檢索數(shù)據(jù)。訪問存儲(chǔ)庫(kù)的數(shù)據(jù)通過向其發(fā)送消息來完成,該消息指定了要訪問的對(duì)象、版本和訪問類型(讀/寫),如果是寫訪問,還要加上要寫的值。底層消息通信并不抑制重復(fù)消息,因?yàn)? a)對(duì)象標(biāo)識(shí)符加上版本信息足以檢測(cè)重復(fù)的寫入,b)重復(fù)的讀請(qǐng)求消息的效果只是產(chǎn)生一個(gè)重復(fù)響應(yīng),調(diào)用方很容易監(jiān)測(cè)并丟棄。因此可以極大簡(jiǎn)化低級(jí)別消息通信協(xié)議。
底層消息通信系統(tǒng)也不提供交付確認(rèn)。寫入請(qǐng)求的調(diào)用方需要的確認(rèn)是數(shù)據(jù)被安全的存儲(chǔ),這種確認(rèn)只能由SWALLOW系統(tǒng)的高層提供。對(duì)于讀請(qǐng)求,交付確認(rèn)是多余的,因?yàn)榘x取值的響應(yīng)已經(jīng)足夠了。通過消除交付確認(rèn),傳輸?shù)南?shù)量減少了一半,從而對(duì)主機(jī)負(fù)載和網(wǎng)絡(luò)負(fù)載都產(chǎn)生了很大影響,提高了性能。這個(gè)思路也被用于開發(fā)遠(yuǎn)程訪問磁盤記錄的實(shí)驗(yàn)性協(xié)議[6],減少低級(jí)協(xié)議中的路徑長(zhǎng)度對(duì)于保持遠(yuǎn)程磁盤訪問的良好性能非常重要。
確定目標(biāo)
使用端到端原則有時(shí)需要對(duì)應(yīng)用需求進(jìn)行微妙的分析。例如,考慮一個(gè)承載分組語音連接(即數(shù)字電話會(huì)話)的計(jì)算機(jī)通信網(wǎng)絡(luò),對(duì)于那些傳輸語音包的連接,端到端原則的一個(gè)適用版本是: 如果通信系統(tǒng)的低層試圖在比特級(jí)完成完美的通信,可能會(huì)在數(shù)據(jù)包交付中引入不受控制的延遲,例如,要求重傳損壞的數(shù)據(jù)包,并在早期數(shù)據(jù)包被正確重傳之前推遲交付。這種延遲對(duì)需要以恒定速率向接收方提供數(shù)據(jù)的語音應(yīng)用來說是一種干擾。最好的辦法是接受輕微損壞的數(shù)據(jù)包,甚至用靜音、前一個(gè)數(shù)據(jù)包的復(fù)制品或噪音來取代。語音的自然冗余,加上高水平糾錯(cuò)程序,甚至其中一個(gè)對(duì)話著說一聲"對(duì)不起,有人掉了一個(gè)杯子。請(qǐng)你再說一遍好嗎?"(如果這種情況比較少的話),都可以處理這種丟包的情況。
然而,這種強(qiáng)端到端原則適合于特定應(yīng)用(兩個(gè)人的實(shí)時(shí)對(duì)話),而不是通用原則(例如一般語音)。如果考慮語音信息系統(tǒng),在該系統(tǒng)中,語音包被存儲(chǔ)在文件中,以便接收者以后收聽,那么情況就不一樣了。將數(shù)據(jù)包傳送到存儲(chǔ)介質(zhì)中的短暫延遲并不具有特別的破壞性,因此在低層實(shí)現(xiàn)可靠性而引入延遲就是可接受的選項(xiàng)。更重要的是,在錄音信息中獲得盡可能多的準(zhǔn)確性,實(shí)際上對(duì)應(yīng)用是有幫助的,因?yàn)槭占嗽诼犱浺舻臅r(shí)候,不可能要求發(fā)件人重復(fù)某個(gè)句子。另一方面,在存儲(chǔ)系統(tǒng)作為語音通信的接收端時(shí),端到端原則確實(shí)適用于數(shù)據(jù)包排序和重復(fù)抑制。因此,端到端原則并不是絕對(duì)的,而是有助于應(yīng)用和協(xié)議設(shè)計(jì)分析的準(zhǔn)則,人們必須謹(jǐn)慎確定該原則適用于哪些場(chǎng)景。
歷史,以及在其他系統(tǒng)領(lǐng)域的應(yīng)用
本文引用的個(gè)別端到端案例并非原創(chuàng),而是多年積累下來的。第一個(gè)案例中的有問題的中間傳遞確認(rèn)案例是M.I.T.兼容時(shí)間共享系統(tǒng)(M.I.T. Compatible Time-Sharing System)的"wait"信息,每當(dāng)用戶輸入一個(gè)命令時(shí),系統(tǒng)就會(huì)在用戶終端上打印出來[3]。(該信息在系統(tǒng)早期有一定價(jià)值,當(dāng)時(shí)崩潰和通信故障非常頻繁,中間確認(rèn)提供了一些需要的保證,即一切都很好)。
與加密有關(guān)的端到端原則是由Branstad在1973年的一篇論文[2]中首次公開討論的,估計(jì)軍事安全界在那之前就進(jìn)行了保密討論。Diffie和Hellman[4]以及Kent[8]更深入地發(fā)展了這些觀點(diǎn),Needham和Schroeder[11]為此設(shè)計(jì)了改進(jìn)的協(xié)議。
Gray[5]、Lampson和Sturgis[10]以及Reed[13]的兩階段提交協(xié)議使用了一種端到端的論證方式來證明其有效性。它們是端到端的協(xié)議,其正確性不依賴于通信系統(tǒng)內(nèi)的可靠性、FIFO排序或重復(fù)抑制,任何可能的問題也可能由其他系統(tǒng)組件故障引入。Reed在關(guān)于去中心化原子操作的博士論文的第二章中明確提出了這個(gè)論點(diǎn)[14]。
端到端原則常被應(yīng)用于系統(tǒng)的錯(cuò)誤控制和糾錯(cuò)。例如,根據(jù)政策和法律要求,銀行系統(tǒng)通常提供高級(jí)別審計(jì)程序,這些高層次審計(jì)程序不僅會(huì)發(fā)現(xiàn)高層次錯(cuò)誤(如對(duì)錯(cuò)誤的賬戶進(jìn)行提款),還會(huì)發(fā)現(xiàn)低層次的錯(cuò)誤(如基礎(chǔ)數(shù)據(jù)管理系統(tǒng)中的協(xié)調(diào)錯(cuò)誤)。因此,相對(duì)于絕對(duì)消除這種協(xié)調(diào)錯(cuò)誤的昂貴算法,可能某種只是該錯(cuò)誤出現(xiàn)頻率較低的低成本算法要更合適。在航空預(yù)訂系統(tǒng)中,可以依靠代理人不斷嘗試,忍受系統(tǒng)崩潰和延遲,直到預(yù)訂被確認(rèn)或被拒絕。因此,保證未確認(rèn)的預(yù)訂請(qǐng)求在系統(tǒng)崩潰后仍然可以恢復(fù)的較低級(jí)別的恢復(fù)程序并不重要。在電話交換機(jī)中,可能導(dǎo)致單個(gè)呼叫掉線的故障被認(rèn)為不值得提供明確的恢復(fù),因?yàn)槿绻斜匾?,呼叫者可能?huì)再次發(fā)起呼叫[7]。所有這些設(shè)計(jì)方法都是端到端原則被應(yīng)用于自動(dòng)恢復(fù)的例子。
網(wǎng)絡(luò)協(xié)議界關(guān)于數(shù)據(jù)報(bào)、虛擬鏈路和無連接協(xié)議的辯論,大部分是關(guān)于端到端的爭(zhēng)論。模塊化論點(diǎn)推崇可靠的、FIFO排序的、重復(fù)抑制的數(shù)據(jù)流,認(rèn)為這是一個(gè)容易構(gòu)建的系統(tǒng)組件,該觀點(diǎn)有利于虛擬鏈路。端到端論點(diǎn)聲稱,集中提供這些功能的每個(gè)版本對(duì)某些應(yīng)用來說是沒有意義的,這些應(yīng)用會(huì)發(fā)現(xiàn)從數(shù)據(jù)報(bào)開始構(gòu)建自己版本的功能會(huì)更容易。
20世紀(jì)50年代,系統(tǒng)分析員開發(fā)了一個(gè)非通信應(yīng)用中的端到端原則版本,他們的職責(zé)包括在大量磁帶卷上讀寫文件。屢次試圖定義和實(shí)現(xiàn)"可靠的磁帶子系統(tǒng)"的努力屢屢失敗,因?yàn)椴环€(wěn)定的磁帶機(jī),不可靠的系統(tǒng)操作者,以及系統(tǒng)崩潰,都對(duì)任何狹隘的可靠性措施產(chǎn)生了影響。最終,每個(gè)應(yīng)用都提供了自己的應(yīng)用相關(guān)的檢查和恢復(fù)策略,并假定低級(jí)別的錯(cuò)誤檢測(cè)機(jī)制最多只能減少高級(jí)別檢查失敗的頻率,這已經(jīng)成為標(biāo)準(zhǔn)做法。Multics文件備份系統(tǒng)[17]就是這樣的例子,它建立在磁帶子系統(tǒng)格式的基礎(chǔ)上,提供了非常強(qiáng)大的錯(cuò)誤檢測(cè)和糾正功能,并以記錄標(biāo)簽和每個(gè)文件的多個(gè)副本的形式提供了自己的錯(cuò)誤控制。
用于支持精簡(jiǎn)指令集計(jì)算機(jī)(RISC)架構(gòu)的論點(diǎn)與端到端觀點(diǎn)類似。RISC的論點(diǎn)是,架構(gòu)的客戶將通過準(zhǔn)確實(shí)現(xiàn)原始工具所需的指令來獲得更好的性能。計(jì)算機(jī)設(shè)計(jì)者如果試圖預(yù)測(cè)客戶對(duì)某一深?yuàn)W功能的要求,很可能無法100%滿足目標(biāo)需求,客戶最終還是會(huì)重新實(shí)現(xiàn)該功能。(感謝M. Satyanarayanan提供了這個(gè)例子)。
Lampson在支持"開放操作系統(tǒng)"[9]的論點(diǎn)中使用了一個(gè)類似于端到端原則的論據(jù)作為理由。Lampson反對(duì)將任何功能作為下層模塊的永久實(shí)現(xiàn),而是認(rèn)為該功能可以由下層模塊提供,但應(yīng)該總是可以被應(yīng)用程序的特殊版本所替代。其理由是,對(duì)于你能想到的任何功能,至少有些應(yīng)用程序會(huì)發(fā)現(xiàn),為了正確滿足自己的需求,必須自己實(shí)現(xiàn)這個(gè)功能。這種推理導(dǎo)致Lampson提出了"開放"系統(tǒng),整個(gè)操作系統(tǒng)由一個(gè)庫(kù)中的可替換例程組成,這種方法直到最近才在專用于單一應(yīng)用的計(jì)算機(jī)中變得可行。可能的情況是,大規(guī)模操作系統(tǒng)中大量典型的功能確定的管理功能只是經(jīng)濟(jì)壓力的產(chǎn)物,因?yàn)橐髮?duì)昂貴的硬件進(jìn)行復(fù)用,因此需要受控的管理功能。事實(shí)上,最近大多數(shù)系統(tǒng)"內(nèi)核化"項(xiàng)目,部分的集中于將功能從低級(jí)系統(tǒng)中解耦[16,12]。盡管其靈感來自于不同的正確性論證,但副作用是產(chǎn)生了一個(gè)對(duì)應(yīng)用程序來說更加靈活的操作系統(tǒng),而這正是端到端原則的主旨所在。
結(jié)論
在選擇通信子系統(tǒng)所提供的功能時(shí),端到端原則是一種"奧卡姆剃刀"。因?yàn)橥ㄐ抛酉到y(tǒng)經(jīng)常在使用該子系統(tǒng)的應(yīng)用被知道之前就被指定,設(shè)計(jì)者可能會(huì)被誘惑通過承擔(dān)更多功能來"幫助"用戶,對(duì)端到端原則的認(rèn)識(shí)可以幫助減少這種誘惑。
如今,談?wù)?分層"的通信協(xié)議很時(shí)髦,但沒有明確標(biāo)準(zhǔn)來分配各層功能。這種分層對(duì)于提高模塊化程度是可取的。端到端的爭(zhēng)論可以被看作是組織這種分層系統(tǒng)的合理原則的一部分。我們希望本文的討論有助于為"適當(dāng)?shù)?分層的爭(zhēng)論增加實(shí)質(zhì)內(nèi)容。
審核編輯:郭婷
-
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7484瀏覽量
163761 -
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7488瀏覽量
87849 -
數(shù)據(jù)包
+關(guān)注
關(guān)注
0文章
260瀏覽量
24385
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論