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