包盈盈 許超峰 謝亞林 中國(guó)船舶重工集團(tuán)公司第七二二研究所
在網(wǎng)絡(luò)技術(shù)取得快速發(fā)展的過(guò)程中,網(wǎng)絡(luò)行為模式日漸復(fù)雜,對(duì)網(wǎng)絡(luò)通信傳輸?shù)目煽啃蕴岢隽烁咭?。而在新型網(wǎng)絡(luò)服務(wù)中,UDP發(fā)展存在通信傳輸數(shù)據(jù)丟失問(wèn)題,無(wú)法滿足網(wǎng)絡(luò)通信要求。因此,需要完成多端口自適應(yīng)UDP通信協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)研究,從而使UDP協(xié)議取得較好發(fā)展。
作為無(wú)連接協(xié)議的一種,UDP在通信過(guò)程中無(wú)需在計(jì)算機(jī)間建立連接,能夠同時(shí)作為應(yīng)用的客戶或服務(wù)器方。建立UDP應(yīng)用,需要將一個(gè)Winsock控制時(shí)設(shè)置為“監(jiān)聽(tīng)”狀態(tài),其他則需要采用Connect實(shí)現(xiàn)初始連接。采用該協(xié)議進(jìn)行數(shù)據(jù)發(fā)送,需要在連接兩端完成RemoteHost屬性的設(shè)置,作為計(jì)算機(jī)名稱,然后將其屬性當(dāng)成是第二個(gè)Winsock控制的LocalPort屬性值,然后進(jìn)行Bind方法申請(qǐng)。采用該方法將Winsock控制捆綁到本地端口,能夠利用該端口進(jìn)行“監(jiān)聽(tīng)”,避免該端口被其他應(yīng)用使用。在數(shù)據(jù)傳輸過(guò)程中,需要對(duì)計(jì)算機(jī)LocalPort屬性進(jìn)行設(shè)置,服務(wù)器計(jì)算機(jī)需要進(jìn)行RemoteHost屬性的設(shè)置,即采用計(jì)算機(jī)域名或IP地址,然后將其屬性當(dāng)成是客戶計(jì)算機(jī)上的LocalPort屬性。通過(guò)申請(qǐng)sendData,能夠?qū)崿F(xiàn)信息發(fā)送,在DataArrial事件中進(jìn)行發(fā)送信息的獲取。從UDP通信協(xié)議應(yīng)用情況來(lái)看,采用該協(xié)議由于無(wú)需進(jìn)行前源端與終端的連接,所以開(kāi)銷較小。但傳輸過(guò)程中容易出現(xiàn)擁塞,導(dǎo)致數(shù)據(jù)傳輸帶寬和速度受到限制。一旦數(shù)據(jù)包傳輸遭遇線路噪音或被第三方篡改,UDP盡管能夠?qū)Τ鲥e(cuò)數(shù)據(jù)進(jìn)行檢測(cè),但是會(huì)直接將損壞消息扔掉處理,導(dǎo)致通信可靠性較差。
針對(duì)UDP應(yīng)用問(wèn)題,設(shè)計(jì)多端口自適應(yīng)UDP能夠在通信擁塞時(shí)采用自適應(yīng)方式將數(shù)據(jù)遷移至新端口鏈路上,確保數(shù)據(jù)能夠得到實(shí)時(shí)傳輸,避免數(shù)據(jù)出現(xiàn)丟失問(wèn)題。采用該協(xié)議進(jìn)行通信傳輸,從格式上來(lái)看包含包頭、塊號(hào)、長(zhǎng)度、數(shù)據(jù)內(nèi)容和校驗(yàn)和五個(gè)部分,分別占用3、1、2、n、2個(gè)字節(jié)。其中,包頭由head1-3組成,塊號(hào)范圍在0-255之間,0為第一次連接建立的塊號(hào),長(zhǎng)度用于對(duì)整個(gè)消息塊長(zhǎng)進(jìn)行記錄,數(shù)據(jù)內(nèi)容最大500個(gè)字,校驗(yàn)和可以采用累加和方式進(jìn)行校驗(yàn)位的計(jì)算。在通信過(guò)程中,服務(wù)端需要先完成N個(gè)端口分配,然后利用整型數(shù)組LinKStatus進(jìn)行各端口鏈路通信狀態(tài)記錄,完成各端口UDP通信初始化,然后進(jìn)行協(xié)議通信。
從協(xié)議通信流程來(lái)看,客戶端首先需要利用多個(gè)端口進(jìn)行0塊通信包的發(fā)送,發(fā)出與服務(wù)器建立連接的請(qǐng)求。經(jīng)過(guò)等待后,接收到回復(fù)的0塊通信包,客戶端會(huì)將LinkStatus[N]置1,說(shuō)明端口已經(jīng)建立通信鏈路。通過(guò)N1鏈路,客戶端能夠從1塊通信包開(kāi)始協(xié)議通信。需要進(jìn)行數(shù)據(jù)發(fā)送,需要在通信包內(nèi)進(jìn)行數(shù)據(jù)內(nèi)容的添加。在通信過(guò)程中,需要監(jiān)聽(tīng)其他鏈路。在接收到回復(fù)通信包的塊號(hào)后,確定塊號(hào)與發(fā)送塊號(hào)相等,客戶端會(huì)認(rèn)為數(shù)據(jù)包已經(jīng)成功發(fā)送,然后進(jìn)行下一個(gè)塊號(hào)的發(fā)送。在回復(fù)的通信包不正確或未得到回復(fù)的情況下,客戶端會(huì)重新進(jìn)行通信包的發(fā)送,直至超過(guò)3次后,會(huì)將LinkStatus[N]置0,重新進(jìn)行鏈路的建立。采用RMP算法,能夠使數(shù)據(jù)通信遷移至新端口鏈路上,然后按照上述流程進(jìn)行通信。在其他端口鏈路Nk監(jiān)聽(tīng)發(fā)現(xiàn)通信包的情況下,說(shuō)明服務(wù)端主動(dòng)進(jìn)行了鏈路遷移,客戶端需要被動(dòng)進(jìn)行通信遷移,完成鏈路重建。從服務(wù)端通信流程上來(lái)看,其多個(gè)端口將同時(shí)等待進(jìn)行通信包的接收。在其中一個(gè)端口接收到戶,會(huì)進(jìn)行通信包的回復(fù),然后將LinkStatus[N]置1。在通信過(guò)程中,服務(wù)端會(huì)先用一個(gè)端口通信,并監(jiān)聽(tīng)其他端口。在接收的塊號(hào)與上次相同時(shí),可以判定未實(shí)現(xiàn)正確通信包的接收。在回復(fù)客戶端時(shí),需要進(jìn)行相同通信包的發(fā)送。如果未能正常進(jìn)行塊號(hào)數(shù)據(jù)接收,需要重新進(jìn)行通信包的發(fā)送,超出3次需要進(jìn)行鏈路遷移。服務(wù)端其他端口監(jiān)聽(tīng)到通信包,說(shuō)明客戶端主動(dòng)進(jìn)行了鏈路遷移,服務(wù)端需要被動(dòng)實(shí)現(xiàn)通信遷移。
為實(shí)現(xiàn)上述流程,需要采用RMP算法。在重建鏈路時(shí),由于N個(gè)鏈路中存在部分重建鏈路,遍歷所有鏈路查找Nk將導(dǎo)致通信效率較低。在網(wǎng)絡(luò)環(huán)境不佳的情況下,容易導(dǎo)致實(shí)時(shí)傳輸?shù)臄?shù)據(jù)出現(xiàn)丟失問(wèn)題。采用RMP算法,針對(duì)每個(gè)鏈路帶有的LinkStatus[N]狀態(tài)標(biāo)志,能夠?qū)崿F(xiàn)當(dāng)前鏈路狀態(tài)的標(biāo)記,如果通信正常標(biāo)記為1,處于初始化或重建狀態(tài)標(biāo)記為0。正常通信過(guò)程中,RMP算法能夠根據(jù)各鏈路狀態(tài)進(jìn)行排序,然后進(jìn)行結(jié)果存儲(chǔ)。鏈路遷移時(shí),可以從存儲(chǔ)的隊(duì)列Quese中進(jìn)行第一個(gè)元素的提取,從而確定Nk。在協(xié)議通信過(guò)程中,各鏈路狀態(tài)隨機(jī),為0或1,能夠快速排序能夠盡快完成標(biāo)記,通常只需完成一次排序。此外,為避免鏈路遷移和數(shù)據(jù)收發(fā)過(guò)程中出現(xiàn)數(shù)據(jù)丟失問(wèn)題,需要進(jìn)行環(huán)形緩沖區(qū)的設(shè)計(jì),利用其附帶讀寫(xiě)指針進(jìn)行數(shù)據(jù)存儲(chǔ)。在初始狀態(tài)下,指針指向緩沖區(qū)起始地址,緩沖區(qū)內(nèi)容為空。在發(fā)送數(shù)據(jù)時(shí),可以移動(dòng)指針進(jìn)行數(shù)據(jù)寫(xiě)入,使得讀指針與寫(xiě)指針狀態(tài)不同。移動(dòng)讀指針,可以進(jìn)行數(shù)據(jù)讀取。在指針達(dá)到最大化狀態(tài)時(shí),需要進(jìn)行指針重置,以便實(shí)現(xiàn)循環(huán)讀寫(xiě)。
在協(xié)議實(shí)現(xiàn)方面,需要采用Simulink進(jìn)行建模仿真,完成客戶端和服務(wù)端模型的搭建,對(duì)協(xié)議通信狀態(tài)轉(zhuǎn)換和邏輯處理情況進(jìn)行分析和判斷,確定協(xié)議能夠保證實(shí)時(shí)數(shù)據(jù)傳輸?shù)耐暾?。從客戶端主?dòng)遷移情況來(lái)看,模型在遷移到新鏈路時(shí)將進(jìn)入RMP_State狀態(tài)。采用RMP算法實(shí)現(xiàn)多端口處理,能夠?qū)㈥?duì)列中Queue[0]遷移至其他鏈路中。在模型操作中,需要對(duì)快速排序Quick-Sort函數(shù)進(jìn)行調(diào)用,實(shí)現(xiàn)隊(duì)列操作??蛻舳四P涂梢詫?duì)鏈路回復(fù)數(shù)據(jù)進(jìn)行監(jiān)聽(tīng),實(shí)現(xiàn)被動(dòng)遷移,進(jìn)入Listen_State狀態(tài)。調(diào)用Listen_Link函數(shù),能夠監(jiān)聽(tīng)iPort以外鏈路,將狀態(tài)標(biāo)志iLStatus返回,實(shí)現(xiàn)iPort數(shù)值更新,實(shí)現(xiàn)新鏈路通信連接。
采用PC機(jī)進(jìn)行仿真驗(yàn)證,利用Matlab進(jìn)行仿真,在[0-1000s]時(shí)間內(nèi)兩臺(tái)計(jì)算機(jī)隨機(jī)產(chǎn)生400個(gè)字符,進(jìn)行數(shù)據(jù)周期性發(fā)送。通過(guò)在UDP發(fā)送函數(shù)模型中進(jìn)行脈沖中斷信號(hào)的添加,定期進(jìn)行中斷信號(hào)的發(fā)送,能夠?qū)︽溌窊砣M(jìn)行模擬,導(dǎo)致通信數(shù)據(jù)發(fā)送失敗。從通信包在各鏈路分布情況來(lái)看,能夠發(fā)現(xiàn)采用多端口自適應(yīng)UDP能夠使通信包在各鏈路連續(xù)分布,通過(guò)鏈路遷移實(shí)現(xiàn)數(shù)據(jù)包的傳輸,并且數(shù)據(jù)包并未出現(xiàn)數(shù)據(jù)丟失問(wèn)題。在中斷發(fā)生后,協(xié)議丟包率依然為0。由此可見(jiàn),采用設(shè)計(jì)的多端口自適應(yīng)UDP協(xié)議,能夠保證協(xié)議通信的可靠性,因此能夠在復(fù)雜網(wǎng)絡(luò)中得到應(yīng)用。
通過(guò)研究可以發(fā)現(xiàn),在UDP協(xié)議通信流量不斷增加的情況下,容易發(fā)生網(wǎng)絡(luò)擁塞問(wèn)題,導(dǎo)致協(xié)議在通信過(guò)程中出現(xiàn)數(shù)據(jù)丟失的問(wèn)題,影響協(xié)議的推廣應(yīng)用。針對(duì)這一問(wèn)題,設(shè)計(jì)多端口自適應(yīng)UDP協(xié)議,能夠在通信包無(wú)法正常傳輸時(shí)進(jìn)行鏈路遷移,重新進(jìn)行端口選擇和鏈路搭建,保證數(shù)據(jù)得到可靠傳輸,因此能夠滿足復(fù)雜網(wǎng)絡(luò)的通信需求。