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