曹雪君,童 心
北京航天自動控制研究所,北京 100854
隨著航天領(lǐng)域業(yè)務(wù)的發(fā)展,戰(zhàn)術(shù)及運載領(lǐng)域?qū)υ囼灁?shù)據(jù)的實時處理效率不斷地提出新的要求。由于試驗數(shù)據(jù)的種類和數(shù)量越來越多,多屏顯示的需求日益增加。數(shù)據(jù)既需要在多個終端之間實現(xiàn)可靠傳輸,又需要保證傳輸?shù)男?。利用TCP通信技術(shù),發(fā)送方與多個終端同時建立多條TCP傳輸通路可以保證傳輸?shù)目煽啃?但TCP的三次握手及確認(rèn)機制,使網(wǎng)絡(luò)傳輸?shù)膲毫^大,由此產(chǎn)生的延遲無法滿足航天領(lǐng)域?qū)?shù)據(jù)處理實時性的要求;基于UDP的組播傳輸能夠解決傳輸效率問題,但由于航天型號試驗中時序數(shù)據(jù)的重要性較高,必須保證傳輸?shù)目煽啃?因此組播的不可靠傳輸又無法滿足此要求。另外,航天領(lǐng)域的特殊性質(zhì)使得設(shè)備的國產(chǎn)化要求日益激增,雖然目前已有一些針對國產(chǎn)化數(shù)據(jù)處理技術(shù)的優(yōu)化方法[1-2],但對于數(shù)據(jù)傳輸?shù)膬?yōu)化研究卻較少。因此,航天領(lǐng)域的數(shù)據(jù)處理對數(shù)據(jù)傳輸提出了更高的要求。
本文提出了一種應(yīng)用層可靠組播傳輸控制方法,該方法在發(fā)送數(shù)據(jù)時添加額外的序號信息、并定時發(fā)送心跳信息,接收方反饋對數(shù)據(jù)的接收情況,通過收發(fā)雙方不斷地進(jìn)行信息交互,實現(xiàn)組播傳輸?shù)目煽啃浴?/p>
目前對應(yīng)用層組播的研究成果方面,文獻(xiàn)[3-6]主要對應(yīng)用層組播算法進(jìn)行了研究和優(yōu)化,提高了組播傳輸?shù)男省⒎€(wěn)定性等,但并不能保證數(shù)據(jù)傳輸?shù)目煽啃?。在提升可靠性方?目前有M-THROM[7]模型,該模型適用于低時延的情況,但由于模型實現(xiàn)的底層依賴TCP協(xié)議,因此開銷過大;主動隨時較發(fā)[8]通過環(huán)結(jié)構(gòu)提高數(shù)據(jù)傳輸?shù)目煽啃?但該方法依賴概率論,并不保證絕對可靠;此外,基于心跳機制的差錯控制模型[9]采用了心跳與序列號控制的方法,該方法仍只提供合理保證。本文在該方法的基礎(chǔ)上進(jìn)行擴(kuò)展,進(jìn)一步保證應(yīng)用層組播傳輸?shù)目煽啃浴?/p>
基于UDP的組播發(fā)送方只負(fù)責(zé)發(fā)送數(shù)據(jù),不考慮接收方對數(shù)據(jù)的接收情況,若要實現(xiàn)可靠傳輸,需要收發(fā)雙方進(jìn)行額外的信息交互,互相反饋各自收發(fā)情況。
對于發(fā)送方,需要定期向接收方反饋已發(fā)送的數(shù)據(jù)報文信息。對于接收方,需要判斷是否存在丟失的數(shù)據(jù)報文,當(dāng)存在丟失的數(shù)據(jù)時,將丟包信息反饋給發(fā)送方進(jìn)行重新發(fā)送。發(fā)送方每發(fā)送一包數(shù)據(jù)報文時,需要先緩存該數(shù)據(jù)報文,以便丟包時重發(fā)。但緩存數(shù)據(jù)又不宜過多,必須定期清除緩存中所有接收方均已收到的數(shù)據(jù)報文。因此,接收方還需要向發(fā)送方反饋已收到的報文信息?;谏鲜鰴C理,將可靠組播傳輸思想闡述如下:
發(fā)送方在發(fā)送數(shù)據(jù)時,對數(shù)據(jù)報文進(jìn)行連續(xù)按序遞增編號,即數(shù)據(jù)報文中攜帶報文序號。發(fā)送方定期廣播心跳報文,心跳報文攜帶已發(fā)送的最大報文序號。接收方接收到心跳報文后,根據(jù)心跳報文中攜帶的序號,判斷是否存在丟包。如若丟包,則向發(fā)送方反饋丟包的數(shù)據(jù)報文序號,以便發(fā)送方在收到丟包信息時重新發(fā)送該序號的數(shù)據(jù)。
發(fā)送方在發(fā)送數(shù)據(jù)后將數(shù)據(jù)在本地進(jìn)行緩存。接收方定期向發(fā)送方反饋已連續(xù)按序收到的最大報文序號。發(fā)送方根據(jù)所有接收方反饋的序號判斷可以清除的緩存數(shù)據(jù)。
接收方接收到的數(shù)據(jù)可能存在丟包和亂序,為了提高處理效率,接收方也采用了緩存機制,將非按序接收到的報文數(shù)據(jù)內(nèi)容進(jìn)行緩存。直到接收到的數(shù)據(jù)包使緩存中的數(shù)據(jù)連續(xù),則從緩存中取數(shù)據(jù)進(jìn)行處理并將該數(shù)據(jù)從緩存清除。
傳統(tǒng)的組播傳播方式中,發(fā)送方直接將數(shù)據(jù)內(nèi)容發(fā)送即可,不考慮接收方丟包及亂序的情況。為了實現(xiàn)組播傳輸?shù)目煽啃?首先對應(yīng)用層的傳輸報文進(jìn)行擴(kuò)展。在本文提出的可靠組播傳輸模型中,發(fā)送方的報文分為2類:數(shù)據(jù)報文和心跳報文。接收方為了反饋接收到的數(shù)據(jù)情況,向發(fā)送方反饋的報文也分為2類:NAK重發(fā)報文和ACK確認(rèn)報文。
2.1.1 發(fā)送方報文
數(shù)據(jù)報文:發(fā)送方的數(shù)據(jù)報文攜帶數(shù)據(jù)內(nèi)容和報文序號,其中報文序號從1開始遞增,用來控制組播傳輸數(shù)據(jù)的可靠性與有序性。
心跳報文:發(fā)送方定時發(fā)送心跳報文,用于通知接收方目前已發(fā)送的最大數(shù)據(jù)報文序號。
發(fā)送方報文的具體格式見表1。
表1 發(fā)送方報文格式
2.1.2 接收方報文
NAK重發(fā)報文:接收方反饋的NAK重發(fā)報文攜帶丟失的報文序號,用于通知發(fā)送方重新發(fā)送該序號的數(shù)據(jù)報文,以實現(xiàn)丟包重傳機制。
ACK確認(rèn)報文:接收方反饋的ACK確認(rèn)報文攜帶已按序且連續(xù)收到的最大報文序號,用于發(fā)送方清除緩存中的數(shù)據(jù)報文。
接收方報文的具體格式見表2。
表2 接收方報文格式
1)發(fā)送數(shù)據(jù)報文的處理邏輯
發(fā)送方每發(fā)送一包數(shù)據(jù)報文,首先更新當(dāng)前已經(jīng)發(fā)送的最大報文序號,用于后續(xù)發(fā)送心跳報文時使用;其次緩存該數(shù)據(jù)報文內(nèi)容,以便在接收方丟包時重發(fā)。
2)發(fā)送心跳報文的處理邏輯
發(fā)送方定時發(fā)送心跳報文,心跳報文攜帶發(fā)送方已經(jīng)發(fā)送的最大報文序號。
3)接收NAK重發(fā)報文的處理邏輯
每當(dāng)發(fā)送方收到一條NAK重發(fā)報文,根據(jù)NAK重發(fā)報文中的序號,在緩存中查找該序號對應(yīng)的數(shù)據(jù)內(nèi)容,將該數(shù)據(jù)內(nèi)容重新進(jìn)行廣播發(fā)送。
4)接收ACK確認(rèn)報文的處理邏輯
ACK確認(rèn)報文攜帶該接收方已按序收到的最大報文序號,用于發(fā)送方刪除數(shù)據(jù)報文緩存。由于組播存在多個接收方,每個接收方收到的最大報文序號可能不同,因此需要分別記錄。
每當(dāng)發(fā)送方收到一條ACK確認(rèn)報文,記錄該報文發(fā)送者的IP地址、發(fā)送時間、以及攜帶的最大報文序號。由于接收方可能中途退出或掉線,當(dāng)發(fā)送方清除數(shù)據(jù)報文緩存時,首先需要判斷當(dāng)前在線的接收方。判斷某個接收方是否在線時,根據(jù)當(dāng)前時間以及最后收到該接收方ACK確認(rèn)報文的時間,當(dāng)兩者之間的時間差超過一定域值時,認(rèn)為該接收方已經(jīng)退出。其次,比較所有在線接收方的最大報文序號,取最小值作為發(fā)送方可以刪除的最大報文序號,這樣可保證所有當(dāng)前在線的接收方均已收到該序號前的所有數(shù)據(jù)報文。發(fā)送方清除該序號前的所有緩存報文。
2.3.1 接收數(shù)據(jù)報文處理邏輯
應(yīng)用層可靠組播傳輸?shù)暮诵脑谟诮邮辗綄?shù)據(jù)報文的處理。當(dāng)收到亂序甚至丟包的數(shù)據(jù)報文時,如何對報文進(jìn)行緩存、重排處理,是整個可靠組播技術(shù)的關(guān)鍵所在。
接收方收到數(shù)據(jù)報文后,根據(jù)該數(shù)據(jù)報文的序號,有如下幾種操作方式:丟棄處理、緩存處理、正常處理該報文、處理該報文及緩存報文。
1)丟棄處理:由于存在多個接收方,某一接收方丟失數(shù)據(jù)并要求發(fā)送方重發(fā)數(shù)據(jù)報文時,其他接收方可能會收到重復(fù)的數(shù)據(jù)報文,對于收到的重復(fù)報文,直接丟棄即可。
2)緩存處理:當(dāng)收到一條未收到過的非按序的數(shù)據(jù)報文時,將該報文內(nèi)容進(jìn)行緩存,待接收到全部連續(xù)按序報文時再進(jìn)行處理。例如,已收到序號為4~6的數(shù)據(jù)報文,然后收到了序號為8的數(shù)據(jù)報文,則將該報文內(nèi)容緩存,待收到序號為7的數(shù)據(jù)報文后再進(jìn)行處理,以防止亂序。
3)正常處理該報文:當(dāng)已收到的所有報文序號均連續(xù),且下一條收到的數(shù)據(jù)報文序號也是按序的,則正常處理該報文即可。例如已收到序號為1~5的報文,接下來收到序號為6的數(shù)據(jù)報文。
4)處理該報文及緩存報文。針對上述2)中緩存數(shù)據(jù)報文的情形,當(dāng)收到的報文使緩存報文按序且連續(xù)時,屬于該情形。如2)中的示例,已收到序號為4、5、6和8的數(shù)據(jù)報文(序號為8的報文已緩存),當(dāng)收到序號為7的數(shù)據(jù)報文時,依次處理序號為7和8的數(shù)據(jù)報文,即處理序號為7的該報文以及序號為8的緩存報文。
2.3.2 接收心跳報文處理邏輯
接收方收到心跳報文后,根據(jù)心跳報文中的序號,判斷該序號前的數(shù)據(jù)報文是否有未收到的情形,若存在未收到的數(shù)據(jù)報文,則向發(fā)送方發(fā)送攜帶丟失數(shù)據(jù)報文序號的NAK重發(fā)報文。
2.4.1 發(fā)送方流程
發(fā)送方的處理包括以下幾個流程:
1)發(fā)送數(shù)據(jù):發(fā)送數(shù)據(jù)報文并緩存,其中報文序號從1開始按序遞增。
2)發(fā)送心跳:定時廣播當(dāng)前已發(fā)送最大數(shù)據(jù)報文序號的心跳報文。
3)監(jiān)聽反饋報文:若收到NAK重發(fā)報文,優(yōu)先發(fā)送丟失的數(shù)據(jù)報文;若收到ACK確認(rèn)報文,記錄該接收方已按序收到的最大報文序號。
4)清除緩存:根據(jù)接收方反饋的ACK確認(rèn)報文序號,定時清除緩存中所有當(dāng)前在線接收方均已收到的數(shù)據(jù)報文。
發(fā)送方的具體處理流程如圖1所示。
圖1 發(fā)送方處理流程
2.4.2 接收方流程
接收方的處理包括以下幾個流程:
1)監(jiān)聽報文:根據(jù)接收到的報文類型,判斷該報文的處理邏輯。
2)處理數(shù)據(jù)報文:根據(jù)報文序號進(jìn)行相應(yīng)的處理(包括丟棄、正常處理、緩存等)。
3)處理心跳報文:首先根據(jù)心跳報文中的報文序號和目前已經(jīng)接收到的數(shù)據(jù)報文序號,判斷是否丟失數(shù)據(jù),在丟失數(shù)據(jù)時發(fā)送NAK重發(fā)報文。其次根據(jù)已按序收到的最大報文序號發(fā)送ACK確認(rèn)報文。
接收方的具體處理流程如圖2所示。
圖2 接收方處理流程
實驗部分,通過不同的實驗組合驗證組播傳輸?shù)目煽啃?。分別在1~3個接收端的情況下,發(fā)送方連續(xù)發(fā)送700萬條組播數(shù)據(jù),數(shù)據(jù)載荷長度不等,分為長、中、短3個級別。短級別載荷長度包括幾個字節(jié)數(shù)據(jù),中級別載荷長度包括幾十個字節(jié)數(shù)據(jù),長級別載荷長度包括幾百個字節(jié)數(shù)據(jù)。
實驗中,人為地模擬丟包情形。在發(fā)送方模擬丟包場景,丟包率分別為2%、1%和0.5%。為了更有效地接近真實的丟包場景,實驗中不僅在發(fā)送原始數(shù)據(jù)包時模擬丟包,在發(fā)送重發(fā)數(shù)據(jù)包時也模擬丟包情形。
為了直觀地看到接收方是否完整且有序地收到數(shù)據(jù)包,某次實驗中,令發(fā)送方按序發(fā)送從1開始遞增的數(shù)字,使發(fā)送報文編號與數(shù)據(jù)內(nèi)容一致,便 于記錄每包數(shù)據(jù)對應(yīng)的報文序號。觀察發(fā)送方的重發(fā)數(shù)據(jù)包與接收方收到的數(shù)據(jù)內(nèi)容。
實驗中,發(fā)送方模擬丟包并重發(fā)了部分?jǐn)?shù)據(jù)報文,如編號為562、567和573的報文;觀察接收方收到的數(shù)據(jù),接收方能夠按序且完整地收到發(fā)送方重發(fā)的所有數(shù)據(jù)報文。
此外,對3.1節(jié)不同實驗參數(shù)下,分別進(jìn)行了各組實驗。當(dāng)數(shù)據(jù)載荷長度分別為幾字節(jié)、幾十字節(jié)和幾百字節(jié)時,發(fā)送方連續(xù)發(fā)送700萬條組播數(shù)據(jù),在不同丟包率情形下,所有接收方均能收到完整有序的數(shù)據(jù)。因此,實驗驗證了本文提出的應(yīng)用層可靠組播傳輸方法的有效性。
目前組播主要應(yīng)用于航天型號的運載和戰(zhàn)術(shù)領(lǐng)域的數(shù)據(jù)處理。型號在試驗過程中,同時存在多個終端顯示不同的試驗數(shù)據(jù)。發(fā)送方通過組播發(fā)送數(shù)據(jù),多個客戶端同時接收數(shù)據(jù),并對本客戶端所需展示的數(shù)據(jù)進(jìn)行篩選、處理、顯示等操作。
基于重傳與確認(rèn)機制的應(yīng)用層可靠組播傳輸方法結(jié)合了TCP和UDP傳輸?shù)膬?yōu)點,實現(xiàn)了可靠、按序、快速的數(shù)據(jù)傳輸。該方法在較低的網(wǎng)絡(luò)開銷下,有效地滿足了航天運載和戰(zhàn)術(shù)領(lǐng)域多個客戶端同時、可靠、高效地顯示不同數(shù)據(jù)的需求。