吳長瑞 徐建清 蔣景紅
摘 要: 為解決嵌入式領域中數據量大、速度高、實時性強等傳輸問題,提出FPGA和PHY芯片相結合的設計方案,用于實現UDP/IP協議。通過深入研究TCP/IP協議棧體系結構和工作原理,按照以太網的幀格式封包和解包,在FPGA中實現UDP/IP數據的正確發(fā)送和接收。在自主研發(fā)的硬件平臺上驗證了該方案的正確性和可靠性。由于使用FPGA實現UDP/IP協議,系統(tǒng)具有移植性高和易于集成等優(yōu)點。
關鍵詞: UDP/IP; 協議棧; 千兆以太網; 現場可編程門陣列; 幀格式; 系統(tǒng)集成
中圖分類號: TN913?34 文獻標識碼: A 文章編號: 1004?373X(2018)09?0001?05
Abstract: In order to solve the transmission problems of large data amount, high speed and strong real?time performance of the embedded field, a design scheme combining FPGA and PHY chip is proposed to implement the UDP/IP protocol. The system architecture and working principle of TCP/IP protocol stack are studied deeply. According to the packed and unpacked frame format of Ethernet, the UDP/IP data is sent and received correctly in FPGA. The correctness and reliability of the scheme are verified on the autonomously?developed hardware platform. The system using FPGA to implement the UDP/IP protocol has the advantages of high portability and easy integration.
Keywords: UDP/IP; protocol stack; Gigabit Ethernet; FPGA; frame format; system integration
0 引 言
千兆以太網在視頻和音頻等大數據量和高實時性的領域存在廣泛的應用。在點對點通信中,數據傳輸的實時性是通信雙方非常關心的問題。針對此類應用,UDP(User Data Protocol)提供了一種高效、低延遲的稱為數據報的傳輸協議,采用UDP這種面向非連接的傳輸協議,可以有效解決數據實時傳輸的問題。目前業(yè)界常用的嵌入式以太網解決方案有微控制器內移植TCP/IP協議棧和ASIC內置協議棧,上述方案都不能同時兼顧傳輸效率、可集成化和可移植性[1?2]。
本文提出一種基于FPGA的UDP/IP協議,實現千兆以太網傳輸方案兼顧傳輸效率、易于集成和便于移植等特點,該方案已在實際工程中得到廣泛應用。
1 TCP/IP協議棧結構及工作原理
OSI參考模型(Open System Interconnection Reference Model)是國際互聯網標準化組織提出的網絡結構標準模型。該模型的目的是使各種硬件在相同的層次上相互通信。實際應用中,OSI模型因為實現太過復雜而很少被采用,TCP/IP模型因簡潔而被廣泛使用。TCP/IP協議棧并不是TCP和IP這兩個協議的合稱,而是指因特網整個TCP/IP協議族[3?5]。TCP/IP參考模型的分層結構與OSI模型的參照圖如圖1所示。
第一層:主機到網絡層,主要包括物理層PHY和介質訪問控制層MAC。TCP/IP參考模型中沒有描述這一層的具體實現方式,只規(guī)定其為上一層提供IP數據包的接口,以太網是其中一種實現方式。
第二層:網絡互連層,是TCP/IP協議棧的核心。該層定義了分組格式和協議類型,具有路由、網際互連和擁塞控制等。
第三層:傳輸層,包含傳輸控制協議(Transmission Control Protocol,TCP)以及用戶數據報協議(User Datagram Protocol,UDP)兩種協議。TCP協議是一種面向連接、可靠、基于字節(jié)流的傳輸協議。它利用IP層的機制,在不可靠的連接基礎上實現可靠的連接,通過發(fā)送窗口控制、超時重發(fā)、分包等一系列方法,將字節(jié)流從一臺主機發(fā)送到其他主機。UDP協議是一種無連接協議,是不可靠的,主要應用于不需要對數據報進行排序以及流量控制的場景。
第四層:應用層,它面向用戶,可實現很多用戶應用協議。
UDP協議是TCP/IP傳輸層協議的一部分。UDP是面向報文的傳輸協議,由于其只負責把報文發(fā)送出去,接收方也不會提供反饋機制,所以它是不可靠的。但正是因為UDP沒有建立連接、撤銷連接、確認報文等開銷,因而相對于TCP協議,它的執(zhí)行速度更快,實時性更強,具有很高的傳輸效率而且它對系統(tǒng)造成的負載低[6]。本文從具體的實際應用出發(fā),系統(tǒng)傳輸層中采用UDP 傳輸協議提供點對點的數據報傳輸服務,網絡層為IP協議,數據鏈路層為ARP協議和MAC協議,物理層采用自適應千兆網1000Base?T的連接通道。
UDP/IP協議的工作原理可以看作是兩個簡單的處理過程:從上層到下層的封包過程和由下層至上層的解包過程,每個過程都是依照每層采用的傳輸協議傳輸數據。當通信主機向從機發(fā)送數據時,應用層的數據首先被送入協議棧中,然后逐層通過協議棧的每一層直至送到網絡。每一層對收到的數據都要增加一些首部信息(有些還要增加尾部信息),整個過程稱作是封包過程。當通信主機接收從機傳過來的以太網數據幀時,幀數據就開始從協議棧的物理層開始傳輸,通過相應層時,檢驗是否匹配當前層的協議幀首部信息,如果不滿足就丟棄該幀,這個過程稱作解包。封包和解包過程如圖2所示。
在實際傳輸應用過程中遵照協議透明的原理,在各自的層中按照標準封包和解包數據后交付下一層。精簡后的協議棧具備以下功能:實現基于UDP傳輸協議的數據傳輸;按需求可以對目的IP地址和源IP地址進行靈活配置;支持ARP地址解析;支持checksum幀校驗;支持數據流控制。
2 以太網的幀格式
以太網幀包含6個域:前導碼,8 B;目的地址,6 B;源地址,6 B;類型域,2 B;數據,46~1 500 B;幀校驗序列FCS,4 B。前導碼是MAC數據到物理層添加的,目的是實現比特同步。前7個字節(jié)是1和0交替的序列,稱為前同步碼,這種序列可以使接收端快速實現比特同步。最后一個字節(jié)是幀開始的定界符,規(guī)定為10101011,接收端在接收到該字節(jié)后,就知道后面的數據是MAC幀了。
以太網MAC層主要實現數據幀的構建與差錯檢查、傳輸控制、接口轉換等功能。常用的以太網MAC幀格式有DIX Ethernet V2和IEEE 802.3兩種。
圖3給出了最常用的以太網MAC V2幀格式,共包含5個字段。開始的兩個字段分別為6 B的目的地址和源地址,即通常所說的MAC地址或者物理地址,它們是固化在網卡中并且是唯一的。第3個字段是用來標記上層協議的類型字段,共2 B,根據該類型就可以把收到的MAC幀數據交給上一層的對應協議。如該類型字段的值是0x0800時,表示上層使用的是IP數據報。第4個字段是數據字段,長度在46~1 500 B之間。最后1個字段是4 B的幀檢驗序列FCS,作為整個數據包的校驗字節(jié)[7?8]。
以太網協議規(guī)定的最短幀長為64 B,這就要求數據填充至少為46 B。當數據字段的長度小于46 B時,為了保證以太網的MAC幀長不小于64 B,MAC子層就會在數據字段的后面添加若干字節(jié)的填充字段[9]。
3 FPGA實現千兆以太網協議的硬件設計
常見FPGA實現以太網協議的結構圖如圖4所示。利用Xilinx公司提供的MAC IP核和IOB以MII(Media Independent Interface),GMII,RGMII或者SGMII形式與PHY芯片連接,PHY芯片以1000Base?T 形式接到RJ45上。其中MII又稱介質無關接口,收發(fā)各有4位數據線,工作在2.5 MHz或者25 MHz時鐘下,理論傳輸速率為10 Mb/s或100 Mb/s。不能滿足千兆以太網的要求,IEEE 208.3工作組又引入了GMII,即千兆介質無關接口,收發(fā)數據線各8位,收發(fā)時鐘為125 MHz,理論速度為1 000 Mb/s。RGMII(Reduced MII)是簡化的GMII接口。收發(fā)數據各有4位,與GMII相比,信號線減半,但收發(fā)時鐘還是125 MHz,為了達到1 Gb/s,TXD和RXD信號線上在時鐘的上升沿發(fā)送GMII接口中的TXD[3:0]/RXD[3:0],在時鐘的下降沿發(fā)送GMII接口中的TXD[7:4]/RXD[7:4]。
MII,GMII和RGMII使用FPGA的GPIO實現,SGMII 使用FPGA的MGT實現。本文給出兩種實現方式的設計方案。
3.1 FPGA GPIO實現以太網協議
本節(jié)描述FPGA使用GPIO以GMII或RGMII接口的形式接入PHY 88E1111,通過PHY 88E1111轉換為1000Base?T;這種情況下不占用MGT資源。
FPGA和PHY連接及PHY的配置設計成GMII或者RGMII是可以選擇的。這樣邏輯設計時可以靈活選擇是生成RGMII接口的IP核還是生成GMII接口的IP核。無論是RGMII還是GMII接口,用戶接口都是locallink形式。所以對于邏輯開發(fā)者來說都是一樣的。FPGA GPIO實現千兆以及網協議的結構框圖見圖5。
3.2 FPGA MGT實現以太網協議
在GPIO資源不足的情況下,還可以采用FPGA的MGT實現千兆以太網。圖6給出FPGA MGT實現千兆以太網協議的結構框圖。MGT連接的是SGMII信號形式。如果要通過SGMII實現1000Base?T就需要2個IP核級聯,即Tri?mod?eth_mac和 Ethernet 1000Base?x PCS/PMA or SGMII 級聯。其中,Tri?mod?eth?mac IP用戶接口是Local link接口,另一端是GMII接口;而PCS/PMA or SGMII IP core一端是GMII接口和Tri?mod?eth?mac相連;另一端是使用FPGA的MGT實現的SGMII接口,SGMII通過PHY 88E1111轉換成1000Base?T;由于PCS/PMA or SGMII core 支持1G和2.5G,故本設計以太網傳輸協議可以工作在1 Gb/s或者2.5 Gb/s兩種速率下。PCS/PMA or SGMII core工作在SGMII模式下[10?12]。
4 UDP/IP協議邏輯實現
根據UDP/IP的工作原理和以太網MAC幀格式,設計發(fā)送和接收模塊對數據進行封包和解包。圖7給出了UDP/IP發(fā)送模塊的封包狀態(tài)跳轉圖。從狀態(tài)轉移圖中idle狀態(tài)跳轉的三個分支可以看出,這個發(fā)送模塊可以發(fā)送ARP包,UDP/IP數據包和用戶自定義的包。這里著重介紹UDP/IP數據包的發(fā)送過程。狀態(tài) send_mac_ dstaddr_sof 是發(fā)送以太網MAC幀的起始狀態(tài),在send_mac_dst_addr狀態(tài)發(fā)送6 B的MAC幀的目的地址,在send_mac_src_addr狀態(tài)發(fā)送6 B的MAC幀的源地址。
send_mac_dst_addr狀態(tài)發(fā)送協議類型,如果類型是0x0800就是IP包,用戶還可以定義別的類型,如圖7中0x5160發(fā)送自定義的數據包格式。
在IP數據包的發(fā)送中,按照IP頭長度(send_ip_header_ length)、服務器類型(send_ip_server_type)、IP總長度(send_ip_total_length)、IP ID(send_ip_id),IP偏移地址(send_ip_fragandoffset)、生成周期(send_ip_ttl),IP協議(send_ip_protocol)、校驗和(send_ip_headchecksum)、IP的源地址(send_ip_srcaddr)、IP目的地址(send_ip_dstaddr)等順序跳轉狀態(tài)機。
最后跳入UDP的封包狀態(tài)機,按照UDP的源端口號(send_udp_srcport)、UDP的目的端口號(send_ udp_dstport)、UDP長度(send_udp_dstport)、校驗和(send_udp_checksum)、數據頭(send_ack_data_head)和數據(send_ack_data)的順序發(fā)送MAC數據幀。
本設計除了能發(fā)送UDP/IP數據包,同時還能傳輸用戶自定義的數據包格式。接收模塊按照同樣的MAC數據幀格式接收數據包。這里不再給其狀態(tài)機。
5 測試平臺與結果分析
在自主研發(fā)的以SP6LX45T?CSG484 FPGA為主芯片的板卡上實現UDP/IP協議棧,外部配置物理層收發(fā)芯片88E1111,通過RJ45連接搭建千兆以太網傳輸通路。按照圖8搭建測試環(huán)境進行系統(tǒng)測試。
通過網線將自研板卡與PC相連,在PC上使用Anysend軟件發(fā)送UDP/IP包,在FPGA內部接收該UDP/IP包,然后通過FPGA轉發(fā)給PC。使用Wireshark分別抓取PC發(fā)給FPGA的以太網數據和FPGA發(fā)送給PC的以太網數據如圖9所示。圖9a)所示為Anysend發(fā)送是標準UDP/IP包,該包被FPGA接收后重新定義了MAC的源地址和目的地址,然后發(fā)送給PC,所以圖9b)是IPv4的以太網包。通過數據分析,本文設計的協議棧功能正確,邏輯端能夠正確發(fā)送和接收以太網數據。并且通過長時間測試(大于24 h),平均丟包率為百萬分之一的量級。
6 結 語
本文介紹了兩種在FPGA實現UDP/IP協議棧的實現方法。無論是利用FPGA GPIO資源還是利用FPGA MGT資源實現千兆以太網通信,邏輯端的收發(fā)模塊設計都是一樣的。因此,這種方法可移植性高,實現簡單,利于系統(tǒng)集成,在實時性要求比較高的點對點通信領域有著廣泛的應用。
參考文獻
[1] 崔鶴,劉云清,盛家進.基于FPGA的UDP/IP協議棧的研究與實現[J].長春理工大學學報(自然科學版),2014,37(2):133?137.
CUI He, LIU Yunqing, SHENG Jiajin. Research and implementation of UDP/IP protocol stack based on FPGA [J]. Journal of Changchun University of Science and Technology (natural science edition), 2014, 37(2): 133?137.
[2] 史鵬騰.基于千兆網的FPGA多通道數據采集系統(tǒng)設計[J].電子科技,2015,28(2):123?126.
SHI Pengteng. Design of multi?channel FPGA?based data acquisition system based on Gigabit Ethernet [J]. Electronic technology, 2015, 28(2): 123?126.
[3] 謝希仁.計算機網絡[M].5版.北京:電子工業(yè)出版社,2005.
XIE Xiren. Computer network [M]. 5th ed. Beijing: Electronic Industry Press, 2005.
[4] 卡薩德·威爾斯. TCP/IP 24學時教程[M].王建華,譯.北京:機械工業(yè)出版社,1999.
WALES J C. TCP/IP 24 hours tutorial [M]. WANG Jianhua, Translation. Beijing: Mechanical Industry Press, 1999.
[5] KOZIEROK C M.TCP/IP指南(卷一):底層核心協議[M].陳鳴,賈永興,宋麗華,譯.北京:人民郵電出版社,2008.
KOZIEROK C M. TCP/IP guide (volume I): the underlying core protocol [M]. CHEN Ming, JIA Yongxing, SONG Lihua, Translation. Beijing: People′s Posts and Telecommunications Press, 2008.
[6] 徐鑫,曹奇英.基于LwIP協議棧的UDP協議分析與優(yōu)化[J].計算機應用與軟件,2011,28(3):246?249.
XU Xin, CAO Qiying. UDP protocol analysis and optimization based on LwIP protocol stack [J]. Computer applications and software, 2011, 28(3): 246?249.
[7] 黃維超,劉橋,黃初華.基于FPGA的循環(huán)冗余校驗并行實現[J].信息技術,2009,33(6):181?183.
HUANG Weichao, LIU Qiao, HUANG Chuhua. Parallel implementation of cyclic redundancy checks based on FPGA [J]. Information technology, 2009, 33(6): 181?183.
[8] 葉懋,劉宇紅,劉橋.CRC碼的FPGA實現[J].重慶工學院學報(自然科學版),2007,21(3):85?87.
YE Mao, LIU Yuhong, LIU Qiao. Implementation of CRC code based on FPGA [J]. Journal of Chongqing Institute of Technology (natural science edition), 2007, 21(3): 85?87.
[9] 嚴力.基于FPGA的以太網MAC協議的設計與實現[D].武漢:華中科技大學,2011.
YAN Li. FPGA?based Ethernet MAC protocol design and implementation [D]. Wuhan: Huazhong University of Science and Technology, 2011.
[10] Xilinx. Tri?mode Ethernet MAC v9.0 [EB/OL]. [2015?09?30]. http://china.xilinx.com/support/documentation/ip_documentation/ru/tri?mode?ethernet?mac.html.
[11] Xilinx. 1 G/2.5 G Ethernet PCS/PMA or SGMII v15.1 [EB/OL]. [2015?11?18]. http://www.xilinx.com/support/answers/54667.html.
[12] Xilinx. LogiCORE IP tri?mode Ethernet MAC V5.1 user guide [EB/OL]. [2015?07?28]. http://www.xilinx.com/support/answers/33111.html.