尹會明
YIN Hui-ming
(南京信息職業技術學院,南京 210046)
人們生活水平的提高和信息技術的飛速發展,數字化、智能化且遠程可監控的嵌入式設備將飽受青睞。由于被控對象、測控裝置等設備的地域分散性,以及監控任務的實時性要求,基于Intemet遠程信息處理和控制是一個很好的解決方案。嵌入式系統(Embedded Systems)是根據應用的要求,將操作系統和功能軟件集成于計算機硬件系統之中,從而實現軟件與硬件一體化的計算機系統。
IPv4地址匿乏和中國IT起步較晚等歷史原因,使我國的私網IP遠多于公網IP。大部分主機的工作環境都是在局域網,NAT網絡地址轉換技術為局域網內的主機訪問Intemet提供服務。NAT技術對于局域網內的主機是透明的,但當外網主機要主動連接局域網內的主機時就得設計穿透技術。遠程監控嵌入式系統的絕大部分工作環境都是局域網,因此設計NAT穿透技術就成為必須的工作。
網絡的快速發展極大地增加了對IP地址的需求。解決IP地址匿乏問題可以通過在下一階段部署IPv6予以解決,而在當前IPv4的環境下,應著重考慮通過網絡地址轉換Network Address Translator,NAT)技術來解決。NAT支持私有地址在內部網絡中的應用。由于內網用戶眾多,但大量的都是進行內部通信,因此可能使用只能在內部使用的私有地址。由于公網中的路由器無法識別此類地址,將視其為非法地址。當內網用戶要和外界通信時,可以由網關為其動態分配一個合法的公網地址,網關負責該私有地址和公網地址的映射,這就是NAT的功能。因為內網之間不會通過私有地址直接通信,所以不同的內網之間可以重用兩樣的私有地址空間,這樣就可以解決大量用戶對IP地址的需求。按照地址轉換方式,可以分為以下兩類:
基礎NAT將私有地址轉換成公網地址,但并不將TCP用DP端口信息進行轉換,它將公網地址與內部主機進行綁定,使得外部可以用公網IP地址訪問內部主機。如果私有地址和公網地址為一一對應的映射關系,則稱為靜態綁定;如果公網地址是在主機訪問外網時臨時分配的,則稱為動態綁定。動態綁定僅在一定時間內有效,需要定時刷新。該類NAT的主要目的并非地址擴展,而是配合防火墻隔離私有網絡,并對內部主機訪問外部實施控制。
這類方式比較普遍,網絡地址/端口轉換器檢查、修改包的IP地址和TCP/UDP端口信息,這樣,更多的內部主機就可以同時使用一個公網IP地址。該類NAT的主要目的是實現地址擴展。由于NAT,穿越的端口號將改變,它給許多應用帶來影響。按照地址映射的實現方式,可以分為以下四類:
1)全錐形(Full Cone)NAT
當內部主機發起一個至外網的會話時,NAT為其建立一個私有
2)地址受限錐形(Address Restrieted Cone)NAT
和全錐形NAT相同,當內部主機發起一個至外網的會話時,NAT為其分配一個公有 的數據包才能與主機 3)端口受限錐形(Port Restricted Cone)NAT 和地址受限NAT類似,只是限制范圍從IP地址擴展到 4)對稱形(Synunetric)NAT 和錐形NAT不同,它的地址綁定只能用于指定的內網 嵌入式系統的工作性質決定了它與外網主機通信都是由對方發起連接,同時考慮到局域網大部分應用是錐形NAT,本研究局主要為域網外的主機穿透錐形NAT,和嵌入式設備通信的技術。 局域網外的主機分為兩種:擁有公網IP或擁有私網IP。 擁有公網IP的主機因為無法知道嵌入式設備在NAT,上映射的公網IP地址和端口,它無法向嵌入式設備發送任何數據包,這得提供第三方的幫助才能讓彼此建立連接。工作在局域網的嵌入式系統 針對地址或端口受限的錐形NAT,需要局域網內的嵌入式系統X打一個“洞”,這個“洞”的方向是 主要過程為:公網IP主機圭動連接局域網內嵌入式設備的過程,首先,主機C向服務器S獲取嵌入式系統X的外網地址和端口,同時請求服務器S向嵌入式系統X發送打洞命令,當主機C收到嵌入式系統X的數據包時,NAT穿透成功,主機C和嵌入式系統X建立聯系。 相比公網IP主機而言,私網IP主機連接局域網內的嵌入式系統就要復雜一些,因為都不知道對方的公網IP和端口,誰也無法主動發出連接請求。借助于第三服務器的幫助,首先嵌入式系統X通過NATA時分配公網IP和端口對并與服務器S建立連接,同樣主機C通過NAT B時分配公網IP和端口對 這時嵌入式系統X和主機C都可以與服務器S進行通信,主機C不能通過服務器S獲取X的公網地址和端口對而直接向x發送數據包,因為從X到 步驟1:主機C先從服務器S獲取X的公網地址和端口對,同時請求服務器S向嵌入式系統x發送打“洞”命令;步驟2:服務器S向嵌入式系統X發送主機C的公網地址和端口對 局域網外的主機主動連接嵌入式系統考慮了兩種情形:主機擁有公網IP或擁有私網IP。實現上述的通信,首先得找一臺擁有公網IP地址的第三方充當服務器的角色,并且在服務器和客戶機上得安裝相應的NAT,穿透軟件。如何讓嵌入式系統完成NAT穿透技術中的工作?工作在局域網內的嵌入式系統需要處理的是三個任務:定時刷新與服務器通信的端口以保持會話;接收并解析服務器的命令;打一個方向為特定地址和端口的“洞”。 當嵌入式系統向擁有公網IP地址的服務器登錄時,網關會在NAT轉換時給其分配公網IP地址和端口,只要此UDP會話有效,服務器都可以通過此公網IP地址和端口和嵌入式系統通信。問題是,這個UDP會話能保持多久呢?這得依具體情況而定。因此,為了保持和服務器通信,嵌入式系統得定時刷新這個公網地址和端口。 本研究采取的辦法是每隔一分鐘向服務器發送一個保持激活的數據包,以維持這個公網IP地址和端口對的有效性。具體實施的方法是:復用了定時器2,它在UDP數據包的發送過程中己經被使用,復用可以提高效率節省硬件資源。在定時器2的中斷服務程序中,定義一個記錄分鐘的變量,每當一分鐘時間到就將發送保持激活數據包的信號量置1,然后退出中斷服務程序。在程序的主循環中查詢發送保持激活數據包的信號量是否為1,如果使能就向服務器發送保持激活數據包,否則繼續執行其它的任務,這部分的邏輯處理如圖1所示。 圖1 Timer2中斷服務程序和主循環處理 發送給服務器的保持激活數據包的格式措施為:封裝好一個UDP包,其中填寫服務器的端口號和IP地址,然后調用發送此UDP包的函數即可。 接收并解析服務器的命令是依賴于接收判別數據包的函數,系統接收到來自服務器的特定SOCKET的數據包,服務器的命令數據包會調用解析函數來處理,解析函數首先檢查UDP有效負載中的前2個字節是否為命令字(自定義為:0xAA,0x55),如果是則繼續從UDP中的有效負載中分離出想連接嵌入式系統的主機的公網IP地址和端口號;否則退出解析過程。 現在有了該主機的公網IP(它可能是該主機自己的IP,也可能是其網關在NAT時分配的IP)和端口信息,這個UDP數據包就很容易封裝,跟發送保持激活數據包相似,最后調用發送數據包函數將包發送出去。這樣嵌入式系統向想連接嵌入式系統的主機就可以發送打“洞”的UDP數據包。 考慮到嵌入式系統絕大部分工作是局域網且由外網主機主動發起連接,本研究關注了NAT穿透技術的實現。首先,對NAT的原理和分類進行了詳細的闡述;然后,分析了針對分別擁有公網IP和私網IP的主機的NAT穿透技術;最后,講述了本嵌入式系統具體實現方法。 在NAT穿透技術的實現當中,缺少對symmetric(對稱形)NAT洞穿技術的研究,它在某些場合下也會有應用;安全性能不強,應用層協議的設計缺乏基于加密的握手協議,這給一些未經授權的主機非法操作本嵌入式系統提供了機會。 [1]田澤.嵌入式系統開發與應用教程[M].北京:北京航空航天大學出版社,2005,3.1-3. [2]李兵建.基于嵌入式Intemet的遠程電網參數實時檢測系統的設計[D].江蘇:江蘇大學,2008:23-39. [3]Deitel,GoldBerg.Intemet&Worrld Wide Web How to Program.3th Edition.Prentice Hall,2004.321-330. [4]楊恢先,等編著.單片機原理及應用[M].長沙:國防科技大學出版社,2003:253-259. [5]Simon,D.E,著,陳西群,等譯.嵌入式系統軟件教程.[M]北京:機械工業出版社,2005,09:120-128. [6]StuartRBallPE.嵌入式微處理器系統設計實例[M].北京:電子工業出版2004:136-144. [7]John Catsoulis.Designing Embedded Hardware[M].OReilly-Media Inc.2002:97-113. [8]沈紅衛.單片機應用系統設計實例與分析[M].北京:北京航空航天大學出版社,2003:258-262.2 實用高效的NAT穿透技術的設計
2.1 公網主機與局域網嵌入式設備通訊方法
保持會話,當公網主機C想和嵌入式系統X連接時,它先從服務器S獲取x的公網地址和端口對。此時主機C能否通過直接向嵌入式系統x發送數據包呢?如果是Full Cone是可以的,但Address/Port Restricted Cone會丟棄這種數據包。2.2 私網主機與局域網嵌入式設備通訊方法
3 嵌入式系統實現NAT穿透技術
3.1 保持和服務器通信技術

3.2 解析服務器技術
3.3 UDP數據包發送
4 結論及建議