商艷娟, 徐卓汀, 王成群
(浙江理工大學信息學院, 杭州 310018)
網絡通信技術的快速發展,為大量數據的傳輸提供了可能[1]。 總線按照傳輸數據的方式可以分為串行總線和并行總線。 并行總線控制復雜,傳輸距離有限,串行總線設計簡單,但是傳輸速率低[2]。以太網技術的發展克服了總線傳輸的缺點,接口速度快,傳輸的距離遠,在復雜的工業控制系統中受到廣泛應用[3]。 傳統的以太網在主控芯片內部編寫以太網協議或者使用嵌入式處理器運行操作系統,在操作系統下完成協議的通信[4]。 使用主控芯片和嵌入式處理器來實現以太網通信協議無法保證較高的數據傳輸實時性和確定性。 使用現場可編程門陣列(FPGA,Field Programmable Gate Array)實現數據的通信,因為通過硬件固化協議的處理邏輯,可以有效地提高數據傳輸系統的性能,FPGA 芯片與物理層(PHY,Physical)芯片相連,連接結構簡單,不需要外部設備驅動與大量的外圍控制電路,可移植性強,系統集成度高[5]。 基于綜上的一些研究,本文設計了一款UDP_IP 協議棧,將其移植到FPGA 芯片中,使用以太網線將包含FPGA 芯片和PHY 芯片的電路板與電腦相連,完成數據的傳輸。 本設計具有以下功能:
(1)實現ARP 請求和應答報文的發送,完成IP地址和MAC 地址的映射;
(2)支持ICMP 報文的ping 操作;
(3)實現UDP 回環通信。
UDP_IP 協議棧模型是將開放式系統互聯通信參考模型(Open System Interconnection Reference Model, OSI)7 層結構簡化成4 層,從上往下分別是應用層、傳輸層、網絡層、網絡接口層,如圖1 所示。應用層支持SMTP、HTTP、TFTP 等協議傳輸[6];傳輸層包含TCP 協議和UDP 協議,TCP 協議是一種基于3 次握手機制的可靠傳輸協議,UDP 是一種不可靠的傳輸協議,該協議實現簡單,適用于低時延、數據量大的快速傳輸場景;網絡層可以實現IP 協議、ICMP 協議通信,IP 協議負責將數據報通過互聯網發送出去,ICMP 協議主要是采用錯誤偵測和回饋機制,為通信環境提供可能發生的問題反饋信息;網絡接口層支持ARP 協議傳輸,將已知的IP 地址解析成MAC 地址,使得交換機可以通過MAC 地址進行相應的通信。 本文設計的UDP_IP 協議棧可以實現ARP 請求、ARP 響應、ICMP 響應、UDP 回環多種協議傳輸。

圖1 UDP_IP 協議棧參考模型Fig. 1 UDP_IP protocol stack model
本文采用模塊化的思想設計UDP_IP 協議棧,整個UDP_IP 協議棧由6 個模塊組成,分別是MAC數據解析模塊、IP 數據解析模塊、ARP 處理模塊、ICMP 處理模塊、UDP 處理模塊、MAC 數據封裝模塊,UDP_IP 協議棧總體架構如圖2 所示。

圖2 UDP_IP 協議棧總體架構Fig. 2 Overall architecture of the UDP_IP protocol stack
MAC 數據解析模塊的作用是分離出ARP 報文和IP 報文,在這個模塊中使用異步先入先出隊列(First Input First Output, FIFO)進行數據的跨時鐘域處理,MAC 數據解析模塊處理報文的流程圖如圖3 所示。 首先,調用異步FIFO 的IP 核,將接收的數據以及接收使能信號全部緩存進FIFO 中;根據FIFO 中存儲數據的個數產生FIFO 讀使能信號,將數據和接收使能信號讀出;根據讀出的使能信號驅動計數器計數,當計數到相應的值時,解析在該值處接收的數據,該數據即是以太網協議類型;判斷協議的類型是否為IP 或ARP 協議類型,如果不是,直接丟棄該數據幀,如果類型值為0x0800,則判斷該報文屬于IP 報文,如果類型值為0x0806,則該報文屬于ARP 報文,根據不同類型報文的判斷結果,將數據送入不同的后級模塊。

圖3 MAC 數據解析模塊流程圖Fig. 3 Flow chart of the MAC data parsing module
ARP 處理模塊的主要功能是對接收的ARP 報文進行分析,更新ARP 緩存表,具體實現過程如圖4 所示。 當上級MAC 數據解析模塊將ARP 報文發送到ARP 處理模塊后,對ARP 接收報文進行解析,得到ARP 報文中的操作碼、發送方IP 地址、發送方MAC 地址、接收方IP 地址。 當接收的操作碼為1,同時報文中的目的IP 等于本地設置的IP,說明接收的是ARP 請求報文,將該報文中的發送方IP 地址和MAC 地址寄存,用作ARP 緩存列表的更新值,同時還用于發送ARP 應答報文中目的IP 地址和目的MAC 地址。 當接收的操作碼為2,同時報文中的目的IP 等于本地設置的IP,判斷接收的是ARP 應答報文,應答報文只需將報文中發送方IP 地址和MAC 地址寄存,用來ARP 緩存列表信息的更新。圖4 虛線部分實現了ARP 列表的更新,本設計定義了一個數組存儲ARP 信息,每當接收一個ARP 請求或者是ARP 應答報文時,定義的數組單元會更新IP 地址和MAC 地址,每8 條ARP 緩存滿時,會自動覆蓋之前的信息,進行下一輪的更新。 另外,本設計還自定義了一個固定的目的IP 地址,協議棧會自動地向這個自定義的目的IP 地址主機定時發送ARP請求報文。

圖4 ARP 處理模塊流程圖Fig. 4 Flow chart of ARP processing module
IP 數據解析模塊有兩個作用:將UDP 報文和ICMP 報文分離;進行IP 層校驗和計算,檢測接收報文的IP 層是否正確,IP 數據解析模塊流程圖如圖5所示。 由MAC 分離出的IP 報文被送入IP 數據解析模塊,對IP 報文的頭部進行解析,得到上層協議類型,目的IP 地址。 在報文解析的同時,對IP 的報頭信息進行校驗和計算,得到的正確值為16’hffff,如果校驗和的計算不是該值,說明接收到的IP 報文是錯誤的,丟棄該報文。 根據報文解析的上層協議類型、目的IP 地址、IP 校驗和來判斷該報文是UDP報文還是ICMP 報文,將不同類型的報文數據使用存儲器寄存,傳輸到接下來的ICMP 處理模塊或者是UDP 處理模塊。

圖5 IP 數據解析模塊流程圖Fig. 5 Flow chart of IP data analysis module
ICMP 處理模塊能夠對ICMP 請求報文作出響應,同時將接收的ICMP 報文數據部分緩存,然后轉發。 在該模塊中整個報文的處理過程經歷3 個不同的狀態,如圖6 所示。 當IP 數據解析模塊沒有發送任何數據給ICMP 處理模塊時,該模塊一直處于空閑狀態,一旦接收到上級模塊發送ICMP 報文,ICMP 報文接收開始使能信號跳變為高電平,狀態跳轉到接收狀態;接收狀態下,對接收的ICMP 報文進行解析,得到ICMP 報文的類型和代碼值分別為0x08 和0x00,則接收的是ICMP 請求報文,直到ICMP 報文接收結束使能信號變為高電平時,狀態跳轉到發送狀態,如果接收的是ICMP 應答報文時,狀態一直保持接收狀態;接收狀態下,另一個操作是使用同步隨機存取存儲器(Random Access Memory,RAM)存儲報文,等到發送狀態下取出報文數據部分內容,發送回電腦。 等到發送的數據正好等于接收的數據長度時,ICMP 報文發送結束信號跳變為高電平,由發送狀態跳轉到空閑狀態,等待IP 數據解析模塊發送下一個ICMP 報文。

圖6 ICMP 處理模塊狀態機圖Fig. 6 State of ICMP processing module
UDP 處理模塊完成UDP 報文的解析并且為發送UDP 回包封裝UDP 首部信息,整個UDP 處理模塊狀態跳轉如圖7 所示。 首先,如果IP 數據解析模塊沒有發送任何UDP 報文,狀態機一直會處于空閑狀態,直到接收到有效的UDP 報文,UDP 報文接收開始使能信號跳為高電平,狀態機隨后跳轉到接收狀態;等到所有數據報文接收完成后,UDP 報文接收結束使能信號變為高電平,狀態機跳轉到計算UDP 校驗和狀態,等到校驗和的計數器計數到9時,狀態會跳轉到發送狀態;當發送的數據長度正好等于接收的數據長度時,UDP 報文發送結束使能信號變為高電平,表示發送完成,狀態機跳轉到空閑狀態,等待IP 數據解析模塊傳輸下一個UDP 報文數據。 在整個狀態機跳轉過程中,數據處于接收狀態時,解析UDP 報文,得到目的端口號、源端口號、UDP 數據長度、發送方IP 地址,為UDP 回環的實現提供目的端口號和源端口號。 數據需要返回給發送端,必須將接收的UDP 數據緩存下來,調用一個同步RAM 的IP 核進行數據的緩存。 在UDP 報頭校驗和計算狀態下,計算校驗和為發送UDP 回包提供正確的UDP 校驗和。

圖7 UDP 處理模塊狀態機Fig. 7 State of UDP processing module
ARP 處理模塊提取的目的IP 和目的MAC 地址,ICMP 處理模塊重新打包的ICMP 應答報文以及UDP 處理模塊重新封裝的UDP 報文都傳入MAC數據封裝模塊合流。 具體選擇返回哪一種協議報文在MAC 數據封裝模塊需要進行仲裁,具體的MAC數據封裝模塊流程圖如圖8 所示。 首先,判斷發送使能信號,如果是ARP 報文發送使能信號,還需要判斷發送的是ARP 應答報文還是ARP 請求報文。如果ARP 應答報文發送使能信號為高電平,按照ARP 數據格式組幀整個ARP 報文內容;如果是ARP 請求發送使能信號為高電平,依照同樣的組幀方式設置ARP 請求報文內容,傳輸到MAC 數據封裝模塊。 ARP 報文前面再封裝以太網首部信息,最終發送給目標主機。 如果判斷是IP 報文發送使能信號為高電平,根據發送的上層協議類型,得到發送的報文是ICMP 報文還是UDP 報文,如果協議類型是0x11,則表示發送UDP 報文,將UDP 處理模塊傳輸過來的內容作為整個以太網幀的數據部分,如果協議類型是0x01,則表示發送ICMP 報文,將ICMP處理模塊傳輸過來的內容作為整個以太網幀的數據部分。 以太網幀其他部分使用以太網首部以及IP首部信息填充。 數據按照標準以太網協議幀封裝完成后,可以將這些數據直接傳輸給MAC 接口,MAC將這些數據傳回給發送端。

圖8 MAC 數據封裝模塊流程圖Fig. 8 Flow chart of MAC data encapsulation module
本設計在Quartus II 13.0 軟件中使用Verilog 語言編寫整個UDP 協議棧代碼,設計完成后使用modelsim 仿真軟件對整個UDP_IP 協議棧進行功能驗證。 ICMP 請求報文和應答報文的仿真時序圖如圖9 和圖10 所示。 從圖9 可以看到兩個報文發送的以太網協議類型都是0x0800, ICMP 報文的首部符合協議數據的設定值,接收數據與發送數據是相同的,報文的結尾都是使用FCS 校驗碼封裝,驗證了本協議棧可以正確接收ICMP 請求報文和發送ICMP 應答報文;此外,關于ARP 協議和UDP 協議的接收和發送功能仿真驗證也是正確的。

圖9 ICMP 請求報文接收圖Fig. 9 ICMP reception diagram

圖10 ICMP 應答報文發送圖Fig. 10 ICMP message sending diagram
仿真驗證后進行板級驗證,使用Cyclone IV 系列FPGA 芯片電路板。 通過電腦發送不同的協議報文,然后使用wireshark 軟件抓取電腦發送的報文以及接收的報文,驗證UDP_IP 協議棧設計的功能。當使用小兵以太網發送ARP 請求報文和ARP 應答報文時,ARP 報文測試結果如圖11 所示。 電腦每發送一個ARP 廣播報文,板子會返回一個ARP 應答報文給電腦。 當電腦發送ARP 應答報文給板子時,板子不會立即返回請求報文,但是本設計設置了一個電腦IP 地址存儲在ARP 處理模塊,會定時發送ARP 請求報文給電腦。 使用ping 命令后,ICMP報文測試結果圖如圖12 所示,可以看到當發送一個ICMP 請求報文,會傳回一個ICMP 應答報文。 接收報文數據和發送報文數據內容完全相同,證明了接收的數據在協議棧中能夠正確緩存并轉發。

圖11 ARP 報文測試結果圖Fig. 11 ARP packet test result

圖12 ICMP 報文測試結果圖Fig. 12 ICMP packet test result diagram
為了評估本設計UDP_IP 協議棧發送UDP 回環報文的性能,使用網絡調試助手每1 ms 發送一次UDP 報文,測試的結果如圖13 所示。 發送UDP 報文次數達到10 萬次,每一次的發送都能正確接收,說明本文設計的UDP_IP 協議棧具有可靠穩定的傳輸性能,傳回電腦的數據與電腦發送出去的數據是完全一致的,驗證了數據能夠在該協議棧內完成正確的數據接收和發送。

圖13 UDP 報文測試結果圖Fig. 13 UDP packet test result diagram
本文設計了一種基于FPGA 的UDP_IP 協議棧,ICMP 報文和UDP 報文數據部分在該協議棧內完成了正確的緩存和轉發,當發送ARP 報文時,在該協議棧內能夠及時進行ARP 列表的更新。 本設計具有良好的穩定性和可靠性,為高速以太網通信提供了一個很好的解決方案,有著廣泛的應用前景。