季 杰 白瑞林 陳大峰
(江南大學輕工過程先進控制教育部重點實驗室1,江蘇 無錫 214122;江南大學智能控制研究所2,江蘇 無錫 214122)
由于傳統工業控制系統的計算資源(包括CPU和存儲器)有限,在設計時只考慮到效率與實時相關的特性,未將控制系統網絡安全作為一個主要的指標進行考慮[1-2]。網絡入侵檢測系統(network intrusion detection system,NIDS)作為網絡安全檢測的重要工具,對網絡設備的安全管理意義重大。
目前,網絡入侵檢測的研究主要集中在OSI網絡架構的第7層(L7,應用層)。OSI采用字符串和正則表達式作為L7內容的特征描述和檢測方法[3-4],吞吐率高達16 Gbit/s,但系統整體的吞吐率不到1 Gbit/s,這說明TCP/IP協議棧已經嚴重制約了系統的整體性能。使用優化TCP/IP協議棧的方法[5],可以使吞吐率提高到2.7~9.5 Gbit/s;而由于其并沒有充分利用現有PC的硬件特性來充分優化協議棧,因此吞吐率還有提高的可能性。
本文在工業物聯網協議棧的基礎上,實現了一種運行在多核通用計算機平臺上的高速并行工業物聯網協議棧。該協議棧滿足了高速入侵檢測的需求。
工業物聯網是指在傳統工業網絡的基礎上,融合互聯網、WSN和現場總線網絡等異構網絡,將具有環境感知能力的各類終端、云計算模式、移動通信和實時通信等不斷融入到各個工業環節的網絡。
工業物聯網協議棧框架如表1所示。
在工業物聯網協議棧的感知層中,基站利用網絡拓撲發現協議從配置服務器獲取網絡地址配置池,感知設備利用網絡拓撲發現協議從基站獲得網絡地址。在獲得網路配置之后,數據采集子層負責采集PLC設備所獲取的環境數據,令牌網和實時以太網負責工業總線的實時數據傳輸問題。對于網絡層,應著重解決其異構網絡間的數據融合傳輸。網關協議結合泛在計算模式,著重解決網絡傳輸和計算的負擔問題;用戶協議是解決訪問資源權限和訪問資源負擔的協議。應用層支持多協議,包括傳統的互聯網協議和自定義工業總線協議。
鑒于Windows系統中已經實現了TCP/IP協議棧,在實現工業物聯網絡協議棧驅動時,可直接調用Windows的TCP/IP協議棧方式實現以太網的部分功能。物聯網協議棧的內部模塊調用關系如圖1所示。

圖1 驅動調用關系示意圖Fig.1 Relationship of driver calling
圖1 中,TCP/IP.sys和 ndis.sys驅動是 Windows自帶的驅動;ApplicationLayer.sys、NetWorkLayer.sys 和SenseLayer.sys分別為應用層驅動、網絡層驅動和感知層驅動。
利用內核定時器對內核調用進行時間測量,再運用計數器對內核調用進行計數,可分析得出協議棧的瓶頸所在。
CPI是函數所執行的指令總數與函數執行這些指令所消耗時間的比值,CPI的值越大,意味著函數執行效率越低。函數執行效率測量如表2所示。

表2 函數執行效率測量Tab.2 Measurement of the function execution efficiency
由CPI數值可以分析出系統的資源消耗。協議棧處于內核空間,協議棧在內存拷貝函數RtlCopyMemory(Windows的運行函數)、哈希計算函數KeHashCalc和搜索數據流函數find_stream_data上所耗費的時間占用了總時間的44.1%,尤其是哈希計算,所花費的時間占整個協議棧處理時間的16.8%。
函數KeHashCalc利用源網絡地址、遠程網絡地址和端口號計算出哈希值。函數采用的計算方法是查表和取模(mod)運算。雖然查表極大地簡化了計算量,但卻是一種利用空間換時間的辦法。
函數find_stream_data利用計算所得的哈希值來查詢數據流表,數據流表包含了218個條目,每個條目均指向一個動態分配的數據流結構。因此,該函數也相當耗費時間。
函數RtlCopyMemory是微軟提供的一個內核API,用于在內核空間拷貝內存。如從網卡中讀取的網絡流量,網卡驅動會使用直接內存訪問(direct memory access,DMA)將流量數據寫入內核空間,用戶空間的程序調用系統調用內核空間拷貝數據。優化內核空間和用戶空間之間的內存拷貝,可以極大地提高協議棧的處理速度。
根據上述分析結果,協議棧的優化可以分為內存操作優化、計算優化和并行處理3個方面。
2.2.1 內存操作優化
數據之間的依賴關系可能會導致大量的訪問延遲。例如,處理器初始化內存讀取立即數的請求,而這個立即數被下一條指令使用,此時處理器必須掛起,直到立即數從內存中返回。
為了減小內存訪問延遲、提高處理器效率,處理器可以發起連續幾個讀請求,并分別使用返回的數據。此時,即使處理器處于延遲狀態,仍然可以保持在運行狀態,從而提高了性能。
分散-聚合直接內存訪問(scatter-gather DMA,SGDMA)[6]使用鏈表描述物理不連續的存儲器。SGDMA首先把鏈表首地址發送給DMA Master,DMA Master在傳輸完一塊連續地址的內存數據后,再根據鏈表傳輸下一塊連續地址的內存數據,最后進行一次中斷,通知CPU傳輸結束。這為DMA提供了傳輸時間,尤其適合網卡與操作系統之間的數據傳輸。
2.2.2 計算效率優化
在工業物聯網協議棧中,報文校驗碼的長度為32位。由于報文的校驗碼包含在報文頭部,因此在發送大量報文時,累計的報文校驗碼運算量非常大。為了提高計算效率,結合X86架構的特性,使用匯編實現校驗碼算法。各個校驗碼計算操作之間沒有相關性,4個32位數可以組成一個128位數,然后利用單指令多數據流(single instruction multiple data,SIMD)指令擴展指令集(streaming SIMD extensions,SSE)計算校驗碼。相比較使用32位指令,使用SSE指令[7-8]可將計算速度提高4倍。使用SSE指令的哈希算法如圖2所示。

圖2 哈希算法Fig.2 Hash algorithm
在哈希算法的預處理階段,首先將4個整數打包成一個128位數,放入XMM0寄存器。W數組存放左移計算的臨時結果,W[i]的值依賴于 W[i-3]、W[i-7]、W[i-11]和 W[i-15]相互異或的結果;A、B、C、D數組適用于存放每組哈希計算的臨時結果。循環結束,A[64]、B[64]、C[64]和 D[64]就是保存的哈希計算結果。這樣就可以一次計算4個哈希值。
2.2.3 并行處理
為了進一步提高協議棧的處理能力,可以在多核CPU上實現并行線程[9],但將單進程的協議棧改成多進程協議棧,將不可避免地遇到共享資源訪問的問題。因此,本文提出一種多核CPU下的多進程劃分方式。協議棧線程分配如圖3所示。
Intel的E5200有2個CPU核,由于網關進程的運算負載相對較重,而且網關進程是與TCP/IP進程有關聯的唯一進程,因此將網關進程與TCP/IP進程分別運行在2個處理核心上。
為了實現動態的負載均衡、減少進程間的通信開銷,網關進程的負載會隨著網絡數據流量的變化而變化,因此需要創建多個處理線程,以達到負載均衡。網關進程創建的子線程之間通過共享緩存傳遞數據,減少了實際傳輸的數據量。

圖3 協議棧線程分配Fig.3 Thread allocation of the protocol stack
評估系統帶有3 GB內存和1個Intel E5200處理器。CPU有2個運行在2.5 GHz的處理核心,這2個核心共享2 MB Cache,操作系統是Windows XP。為了測試協議棧的有效吞吐率,本文采用Darpa-1和Darpa-2[10]作為入侵檢測的數據集,具體如表3所示。

表3 數據集Tab.3 Data set
首先使用表3中的數據集Darpa-1和Darpa-2測試優化前的協議棧,依次為協議棧添加內存優化、SSE指令計算和多進程功能;再對CPU進行多線程壓力測試。優化前,Darpa-1的吞吐率與Darpa-2的吞吐率略高,大約為1.2 Gbit/s。采用內存優化方法之后,兩者的吞吐率分別達到1.7 Gbit/s和1.8 Gbit/s;進一步采用SSE指令加速計算的優化方法后,兩者的吞吐率分別達到3.1 Gbit/s和3.5 Gbit/s;最后采用雙進程的優化方案,兩者的吞吐率可分別達到4.9 Gbit/s和5.6 Gbit/s。優化后的協議棧對每一個流量的吞吐率都在原始系統的4倍以上。
操作系統調度的最小單位是線程。線程壓力測試結果如圖4所示。由圖4可知,網關進程創建線程數量達到一定值之后,協議棧的吞吐率反而下降,這是因為線程之間的切換會帶來額外的開銷。對于大量的數據流量,并不能通過創建無限多的線程來提高協議棧的吞吐率,這樣做將使收益小于開銷,導致吞吐率下降。由于優化的主要目標是提高工業物聯網協議棧的吞吐率,因此選擇一個最大線程數是非常有必要的。由圖4可知,當線程數量為4時,吞吐率最高。此外,整個數據集的數據包平均長度越大,其吞吐率也越大。這是因為每發送或者接收一個數據包都會帶來校驗碼計算、查找等操作的系統開銷。

圖4 線程壓力測試Fig.4 Stress tests of the threads
利用特定資源協議棧函數進行優化之后,協議棧在內存操作、哈希計算和查找操作的耗費時間明顯下降,達到了預期目標。函數優化前后耗時比如表4所示。

表4 函數優化前后耗時比Tab.4 Time-consumption of the function before and after optimization
工業物聯網的數據流量越來越大,對高速入侵檢測是一個嚴峻的挑戰。本文提出了適用于工業物聯網的協議棧優化方案。在PC機現有資源的情況下,該方案利用內存DMA解決了數據的高速流量問題,并利用CPU并行指令解決了協議棧的計算負載問題。測試表明,在工業物聯網絡架構上,優化后的協議棧完全能夠滿足工業物聯網絡高速入侵檢測的需求。
[1]干開峰.嵌入式EPA安全網關開發——安全功能模塊的設計與實現[D].重慶:重慶郵電大學,2007.
[2]楊云,宓佳,黨宏社.嵌入式入侵檢測系統的設計與實現[J].計算機工程與設計,2011,20(1):21 -23.
[3]Vasiliadis G,Polychronakis M,Antonatos S,et al.Regular expression matching on graphics hardware for intrusion detection[C]//Proceedings of the 12th International Symposium on Recent Advances in Intrusion Detection.Saint-Malo,France:Springer Verlag,2009:265 -283.
[4]徐乾,鄂躍鵬,葛敬國,等.深度包檢測中一種高效的正則表達式壓縮算法[J].軟件學報,2009,20(8):2214 -2226.
[5]Xia Gao,Liuy Bin.Accelerating network applications on X86 - 64 platforms[C]//Proceedings of IEEE Symposium on Computers and Communications.Ricci on e,Italy:IEEE Computer and Communications Societies,2010:906 -912.
[6]陳卓,楊愛良,王驥,等.基于PLB總線的多通道SGDMA設計[J].航空電子技術,2009,40(1):12 -15.
[7]陳虎,歐彥麟,陳海波,等.面向多核處理器平臺的并行Hash JOIN算法設計與實現[J].計算機研究與發展,2010,47(z1):171-175.
[8]張順利,張定華,李明君,等.基于SIMD技術的錐束ART算法快速并行圖像重建[J].儀器儀表學報,2010,31(3):630 -634.
[9]楊春陽,段勃勃,袁淮,等.多核平臺上基于可聲明并行性的程序優化框架[J].東北大學學報:自然科學版,2011,32(1):22 -26.
[10]MIT Lincoln Laboratory.MIT DARPA intrusion detection data sets[Z/OL].[2010 - 09 - 25].http://www.ll.mit.edu/mission/communications/ist/corpora/ideval/data/index.html.