姜春強(qiáng)
(海裝重慶局,四川 成都 610000)
仿真系統(tǒng)中的網(wǎng)絡(luò)傳輸接口研究
姜春強(qiáng)
(海裝重慶局,四川 成都 610000)
比較大型的仿真系統(tǒng)需要通過(guò)多線路適配器和多協(xié)議路由器來(lái)與其他的專用網(wǎng)絡(luò)連接獲取數(shù)據(jù)。系統(tǒng)所需的外部數(shù)據(jù)經(jīng)外部通信接口進(jìn)入前端處理子系統(tǒng),在對(duì)輸入數(shù)據(jù)進(jìn)行基本的有效性檢查后,根據(jù)接入數(shù)據(jù)的不同類型,分別傳送到不同的功能子系統(tǒng)進(jìn)行處理,各個(gè)子系統(tǒng)處理后再送回?cái)?shù)據(jù)庫(kù),或者直接與其他子系統(tǒng)發(fā)生數(shù)據(jù)交換。系統(tǒng)中,圖象顯示系統(tǒng)和其他的功能子系統(tǒng)都分別處于不同的主機(jī)上,整個(gè)系統(tǒng)處于一個(gè)局域網(wǎng)中,各個(gè)子系統(tǒng)的數(shù)據(jù)交換通過(guò)一個(gè)通用的網(wǎng)絡(luò)接口來(lái)實(shí)現(xiàn)。
仿真系統(tǒng);網(wǎng)絡(luò)傳輸接口
TCP/IP協(xié)議簇中,傳輸層的協(xié)議為在不同主機(jī)上運(yùn)行的進(jìn)程提供通信機(jī)制,傳輸層協(xié)議主要包括TCP協(xié)議和UDP協(xié)議,其中TCP提供可靠的數(shù)據(jù)傳輸服務(wù),在一個(gè)應(yīng)用進(jìn)程向另一個(gè)應(yīng)用進(jìn)程發(fā)送數(shù)據(jù)之前,兩個(gè)進(jìn)程必須為后來(lái)的數(shù)據(jù)傳輸參數(shù)的建立發(fā)送一些預(yù)備數(shù)據(jù)段,通常稱之為TCP的“三次握手連接”;而UDP協(xié)議由于不需要在數(shù)據(jù)發(fā)送之前建立連接,采用盡力服務(wù)的方式,不用對(duì)發(fā)送速率進(jìn)行管理,小量的數(shù)據(jù)報(bào)頭部開銷,因此它的發(fā)送效率高于TCP協(xié)議。在仿真系統(tǒng)中,由于對(duì)實(shí)時(shí)性要求比較高,如何使得數(shù)據(jù)發(fā)送地更快速就顯得非常重要了,因此主要使用UDP來(lái)進(jìn)行數(shù)據(jù)傳送,只有特別重要的數(shù)據(jù)才使用TCP來(lái)傳送。UDP傳送效率雖然高,但提供的是不可靠的數(shù)據(jù)傳送服務(wù),傳送過(guò)程中就存在掉包、數(shù)據(jù)在傳送中發(fā)生錯(cuò)誤、先發(fā)的包后到而后發(fā)的包先到、分屬不同的進(jìn)程的包無(wú)法區(qū)分等問(wèn)題。另外在發(fā)送過(guò)程中還必須解決端口號(hào)的使用的問(wèn)題,下面針對(duì)以上問(wèn)題給出具體的解決方案。
1.1 提高TCP連接建立效率
在利用TCP協(xié)議進(jìn)行通信時(shí),需要事先建立好連接,這樣數(shù)據(jù)發(fā)送時(shí)就不再建立連接。但是由于網(wǎng)絡(luò)連接可能會(huì)發(fā)生意外,如果連接已經(jīng)斷開,則在發(fā)送時(shí)就需要重新建立連接,這樣非常耗時(shí),效率比較低。為保持連接,當(dāng)網(wǎng)絡(luò)斷開時(shí)需要向發(fā)送進(jìn)程和接收進(jìn)程報(bào)告,然后重新建立TCP連接,這樣就避免了發(fā)送數(shù)據(jù)時(shí)才進(jìn)行連接,可以大大提高發(fā)送效率。在網(wǎng)絡(luò)接口設(shè)計(jì)中可以使用一種稱為“心跳”的技術(shù),規(guī)定一個(gè)時(shí)間周期(一般是2秒),定時(shí)發(fā)送一個(gè)“心跳”包,測(cè)試連接是否斷開,如果斷開,則進(jìn)行重新連接。
1.2 端口號(hào)的分配
在網(wǎng)絡(luò)中,不同的主機(jī)使用主機(jī)地址來(lái)唯一確定,而進(jìn)程則使用端口號(hào)來(lái)確定。一般說(shuō)來(lái),在進(jìn)行數(shù)據(jù)發(fā)送時(shí),使用一個(gè)四元組(源IP地址,源端口號(hào),目標(biāo)IP地址目標(biāo)端口號(hào))就可以唯一確定一個(gè)發(fā)送進(jìn)程和其目標(biāo)進(jìn)程。
1.3 數(shù)據(jù)包錯(cuò)誤檢測(cè)
在網(wǎng)絡(luò)接口中,先將用戶數(shù)據(jù)按自定義的緩沖區(qū)大小進(jìn)行分包(稱為大包),然后每個(gè)包再按照UDP包大小進(jìn)行分割(稱為小包),發(fā)送的時(shí)候使用自定義的包頭。
整個(gè)小包長(zhǎng)1472個(gè)字節(jié),其中自定義的包頭占22個(gè)字節(jié),有效數(shù)據(jù)占1450個(gè)字節(jié)。發(fā)送方在發(fā)送數(shù)據(jù)時(shí),將用戶數(shù)據(jù)拷貝到發(fā)送緩沖區(qū)中,先進(jìn)行大包劃分,再對(duì)每個(gè)大包進(jìn)行小包劃分,最后在每個(gè)自定義的包頭中填入各個(gè)字段信息。
其中校驗(yàn)和的計(jì)算采用將各個(gè)字符的ASCII碼值累加起來(lái),這樣在接收方就可以再次計(jì)算這個(gè)值,和包頭中的校驗(yàn)和相比較判斷出數(shù)據(jù)在傳送過(guò)程中是否發(fā)生了錯(cuò)誤。這種方法非常簡(jiǎn)單,效率也比較高,但是只能判斷錯(cuò)誤是否發(fā)生,不能糾正錯(cuò)誤。
1.4 對(duì)收到的包的分類、排序和丟包的檢查
在進(jìn)程通信過(guò)程中,接收方需要區(qū)分分屬不同進(jìn)程的包、進(jìn)行包的排序和丟包檢查。本文采用的方法是采用數(shù)據(jù)鏈表方式組織接收數(shù)據(jù)包,建立一個(gè)進(jìn)程數(shù)組,并為每一個(gè)不同的進(jìn)程建立一個(gè)鏈表。還需要定義一個(gè)結(jié)構(gòu)體ID,用來(lái)唯一標(biāo)識(shí)某個(gè)發(fā)送進(jìn)程,其字段信息包括源進(jìn)程、源主機(jī)號(hào)、目的進(jìn)程和目的主機(jī)號(hào)。
由于接收緩沖區(qū)和發(fā)送緩沖區(qū)都是循環(huán)使用,在對(duì)它們進(jìn)行操作的時(shí)候,需要采取互斥訪問(wèn)的方式進(jìn)行,以免發(fā)生讀取時(shí)寫入等問(wèn)題。
1.5 套接字I/O模型的選擇
比較常用的套接字I/O模型包括:blocking(阻塞)、select(選擇)和completion port(完成端口)等。其中,select模型是一個(gè)應(yīng)用得比較廣泛的I/O模型,利用select函數(shù)實(shí)現(xiàn)對(duì)I/O的管理。使用select的優(yōu)勢(shì)是能夠從單個(gè)線程的多個(gè)套接字上進(jìn)行多重連接及I/O,將一個(gè)套接字分別加入到讀集(readfds)、寫集(writefds)和異常集(exceptfds)中,調(diào)用select函數(shù)就可以判斷出這個(gè)套接字的狀態(tài),然后根據(jù)套接字的狀態(tài)進(jìn)行數(shù)據(jù)接收、接收連接請(qǐng)求等操作。而且select模型在Windows平臺(tái)和UNIX平臺(tái)下都能夠使用。
網(wǎng)絡(luò)接口實(shí)現(xiàn)采用C++語(yǔ)言來(lái)實(shí)現(xiàn),其功能都封裝在一個(gè)網(wǎng)絡(luò)接口類(net_interface)中
(1)SDW ORD initNet(int Local_Proc_Type , int Group_Num =0, int BufferSize = 512000),該函數(shù)函數(shù)實(shí)現(xiàn)網(wǎng)絡(luò)初始化,建立網(wǎng)絡(luò)連接;
(2)SDWORD sendData(BYTE dest_host ,B Y TE d e s t_ proc_type, char *pdata , unsigned short datalen, unsigned short type,CHAR vip_type),實(shí)現(xiàn)數(shù)據(jù)發(fā)送;
(3)SDWORD readData (int BufSize, char *Buf),該函數(shù)接收數(shù)據(jù),將收到的數(shù)據(jù)保存在一個(gè)緩沖區(qū)中;
網(wǎng)絡(luò)接口非常簡(jiǎn)單,在準(zhǔn)備進(jìn)行數(shù)據(jù)傳送之前,實(shí)例化一個(gè)網(wǎng)絡(luò)接口類的對(duì)象,根據(jù)進(jìn)程類型和其組號(hào)調(diào)用initNet函數(shù),如果沒(méi)有錯(cuò)誤發(fā)生,就可以調(diào)用sendData和readData進(jìn)行數(shù)據(jù)發(fā)送和接收了。
姜春強(qiáng)(1977.4-),男,漢,山東威海人,工程碩士,工程師,主要研究方向:電子技術(shù)和軟件技術(shù)。
TP391.9
A
1003-5168(2015)11-001-01