專利名稱:一種基于NetFPGA的可編程虛擬路由器內部通信方法
技術領域:
本發(fā)明涉及通信及計算機技術領域,具體是一種基于NetFPGA的可編程虛擬路由器內部通信方法。
背景技術:
未來互聯(lián)網體系結構、協(xié)議、算法與實現(xiàn)技術都需要大量的理論分析和仿真實驗, 更需要在實驗網絡系統(tǒng)中進行評估和驗證。為了提供驗證其算法和新協(xié)議的平臺,保證不破壞現(xiàn)有的網絡結構又能夠利用真實的網絡流量驗證算法和協(xié)議,研究者們提出了可編程虛擬化路由器技術。
可編程虛擬路由器包括轉發(fā)硬件和虛擬路由器兩部分轉發(fā)硬件的核心是 NetFPGA板卡(用于網絡的可編程門陣列,由斯坦福大學開發(fā)),完成數(shù)據包接收和發(fā)送;虛擬路由器運行于操作系統(tǒng)為CentOS的主機上,由虛擬化軟件OpenVZ(基于Linux內核和作業(yè)系統(tǒng)的操作系統(tǒng)級虛擬化技術)生成,完成路由計算和路由交換功能。轉發(fā)硬件和虛擬路由器之間通過主機操作系統(tǒng)通信。
然而,目前對可編程路由器的研究都還停留在原型構造階段,只是對路由器的整體架構進行了描述,沒有涉及到內部的實現(xiàn)細節(jié),即使是一些已經做出原型系統(tǒng)的設計,其著眼點也放在硬件的設計與開發(fā)上,對整體的通信過程也僅僅是作出一個概括性的描述, 而沒有給出一個具體可行的方案。發(fā)明內容
本發(fā)明解決的問題是在Linux內核支持數(shù)據包轉發(fā)的基礎上,提供一種虛擬可 編程路由器的內部通信方法,使得虛擬路由器與網絡上其他路由器、虛擬路由器與底層硬件之間正確的交換數(shù)據包。
本發(fā)明采用了以下技術方案一種基于NetFPGA的可編程虛擬路由器內部通信方法,包括以下步驟捕獲進入Linux 內核的NetFPGA數(shù)據包,將該數(shù)據包封裝后發(fā)送到虛擬路由器;經所述虛擬路由器處理后的數(shù)據包通過主機操作系統(tǒng)轉發(fā)出去,并將路由信息部署到NetFPGA中。
A、初始化建立以下模塊數(shù)據包入口設備檢查模塊;產生虛擬網卡nf的網卡虛擬模塊,nf的MAC稱為vMAC ;數(shù)據封裝模塊,在數(shù)據包封裝模塊存放vMAC_VR映射表(虛擬網卡-虛擬路由器映射表,包含nf網卡MAC地址vMAC,虛擬路由器標識符VRID,虛擬路由器網卡veth的MAC地址veMAC和IP地址velP), nfc信息表(NetFPGA板載網卡nfc的配置信息,包括網卡名稱interface,MAC地址,IP地址);數(shù)據分發(fā)模塊,信息接收模塊。
B、在Linux內核網絡協(xié)議棧入口處設置數(shù)據包入口設備檢查模塊,檢查每一個流 Λ Linux內核的數(shù)據包的入口設備名稱。
C、如果入口設備名稱為nfc則觸發(fā)數(shù)據封裝模塊,并將該流入Linux內核的數(shù)據包緩沖區(qū)skb (數(shù)據包在Linux內核中的表現(xiàn)形式)和入口設備名稱nfc傳送到數(shù)據封裝模塊,由數(shù)據封裝模塊將skb封裝到一個新的IPv4數(shù)據包,然后該新的數(shù)據包通過Linux 內核發(fā)送到虛擬路由器;由NetFPGA板卡發(fā)送給主機的數(shù)據包包括三類a.路由信息包, b.需要進行路由計算的普通數(shù)據包,c.出錯數(shù)據包,a、b、c三類統(tǒng)稱為P1。
D、如果入口設備名稱不為nfc,則不作任何處理。
在步驟C之后還包括如下步驟Cl、在數(shù)據包封裝模塊接到觸發(fā)通知后,獲取skb中的協(xié)議數(shù)據區(qū)skb->head中的MAC 地址字段即dMAC,將dMAC與在vMAC-VR映射表中的表項vMAC比較,查找對應的VR( Virtual Router)信息的IP地址velP (虛擬路由器IP地址)和MAC地址veMAC (虛擬路由器MAC地址)。
C2、如果在vMAC-VR映射表中找到對應此MAC地址的VR信息,則查找nfc信息表, 查到入口設備的MAC地址nfcMAC和入口設備的IP地址nfcIP,將該skb中包含的協(xié)議數(shù)據區(qū)skb_>head封裝到一個新的IPv4數(shù)據包newHead中,對于步驟C中所述的三種數(shù)據包封裝方法相同;否則將數(shù)據包丟棄。
C3、將步驟C中所述數(shù)據包Pl中的skb_>head替換為skb_>newHead,替換后的數(shù)據包稱為P2,替換步驟為釋放skb_>head,并將skb_>head賦值為NULL ;將skb_>head指向 newHead,即skb_>head=newHead ;重新對P2作CRC校驗,然后將P2送回內核網絡協(xié)議棧處理隊列,數(shù)據包P2會由Linux內核自動轉發(fā)到指定虛擬路由器。
C4、數(shù)據分發(fā)模塊會將虛擬路由器網卡veth設置為混雜模式,采用Iibpcap庫 (Packet Capture library,即數(shù)據包捕獲函數(shù)庫)抓取veth上的數(shù)據包,將抓取到的數(shù)據包P2去掉協(xié)議頭后,得到與Pl數(shù)據相同 的P3,將P3解包后得到獲取目的MAC地址即dMAC, 然后將dMAC與虛擬路由器的網卡nf的MAC地址比較。
C5、如果比較結果相同,則將此數(shù)據包送往此虛擬網卡η。
C6、如果比較結果不同,則將此數(shù)據包丟棄。
所述步驟C5之后還包括C7、送往網卡nf的數(shù)據包P3由上層路由軟件(如XORP或者Qugga等)讀取,對于C3中所述數(shù)據包Pl的a、c兩類,路由軟件處理后沒有任何輸出,對于數(shù)據包Pl的b類,經處理后得到與Pl結構相同的P4,將P4封裝成以太網數(shù)據包P5 (如圖6)后從網卡veth發(fā)送出去。
CS、在虛擬路由器之外,即主機操作系統(tǒng)內,位于主機操作系統(tǒng)的用戶空間路由信息接收模塊通過監(jiān)控網關venet,捕獲每一個從veth發(fā)送出去的數(shù)據包(ARP廣播包),對其中抓取的數(shù)據包P5,去掉以太網首部后,得到P4,根據P4中的目的IP地址及目的MAC地址, 形成一條路由信息。通過調用NetFPGA的驅動程序API將路由信息部署到NetFPGA中;數(shù)據段通過Iibnet函數(shù)庫封裝成標準IPv4數(shù)據包P6由主機操作系統(tǒng)的網卡發(fā)送出去。
具體地,利用TUN/TAP模擬與所述NetFPGA所帶網卡數(shù)量相同的路由器虛擬網卡 veth,使虛擬路由器更加貼近真實環(huán)境。
具體地,通過Iibnet將經虛擬路由器處理后的數(shù)據包封裝成一個ARP廣播包,并通過路由器虛擬網卡veth發(fā)送出去。
信息接收模塊監(jiān)控網關venet,對每一個發(fā)送出去的ARP廣播包,解包后去掉以太網首部,分析數(shù)據段內容獲取路由信息,然后將數(shù)據段發(fā)送出去,通過調用NetFPGA的API將路由信息部署到NetFPGA中。
所述通過Iibnet將經虛擬路由器處理后的數(shù)據包封裝成一個ARP廣播包的步驟包括調用libnet_init_packet初始化一個數(shù)據包;調用libnet_build_ethernet封裝一個以太網數(shù)據包;libnet_open_raw_sock打開一個套接字;調用libnet_write_link_ layer發(fā)送一個鏈路層數(shù)據包。
具體地,所述獲取路由信息的步驟包括通過Iibpcap庫抓取網關venet上的數(shù)據包,去掉以太網首部,獲得數(shù)據段;申請一段新的緩沖區(qū),將所述數(shù)據段的第7 12字節(jié)、31 35字節(jié)復制進去,然后調用ioctl命令將其部署到NetFPGA中;通過Iibnet將所述數(shù)據段發(fā)送出去。
本發(fā)明通過一種隧道方式將NetFPGA反饋給主機的數(shù)據包分發(fā)到相應的虛擬路由器,依托于內核網絡協(xié)議棧內的Netfilter框架,僅通過少量代碼就能夠實現(xiàn)傳輸目的, 加快了數(shù)據包在傳輸過程中的時延,減少了部署的難度;模擬了 NetFPGA的接口特性,使用戶在使用中更加貼近真實環(huán)境;可編程虛擬化路由器是未來網絡研究項目中重要的試驗平臺,本發(fā)明填補了其研究中虛擬路由器內部通信方法缺失的空白。
圖1為系統(tǒng)結構示意圖;圖2為NetFPGA原始數(shù)據包Pl格式;圖3為vMAC_VR映射表,VRID為虛擬路由器編號,vMAC是虛擬網卡nf的MAC地址, veMAC、velP為虛擬路由器網卡ve th的MAC地址和IP地址;圖4為nfc信息表,此表包含了 NetFPGA板載網卡的信息,包括MAC地址和IP地址; 圖5為封裝數(shù)據包newHead格式;圖6為封裝數(shù)據包P5格式;圖7為虛擬路由器接收數(shù)據包流程圖;圖8為數(shù)據包發(fā)送及路由信息部署流程圖。
具體實施方式
本發(fā)明基于NetFPGA的可編程虛擬路由器通信方法需要設置以下功能模塊數(shù)據包入口設備檢查模塊通過讀取每一個流入Linux內核的數(shù)據包緩沖區(qū)skb的input_dev結構,獲取輸入設備的名稱。
數(shù)據封裝模塊將從NetFPGA送往主機的原始數(shù)據包封裝到一個新的IPv4數(shù)據包內,并初始化vMAC_VR映射表和nf信息表;網卡虛擬模塊在OpenVZ虛擬機通過TUN/TAP虛擬出多個以太網虛擬網卡nf,TUN是操作系統(tǒng)內核中的虛擬網絡設備,向運行于操作系統(tǒng)上的軟件提供與硬件的網絡設備完全相同的功能,供虛擬路由器使用;網卡nf有如下特性操作系統(tǒng)通過TUN/TAP設備向綁定該設備的用戶空間的程序發(fā)送數(shù)據,反之,用戶空間的程序也可以像操作硬件網絡設備那樣,通過TUN/TAP設備發(fā)送數(shù)據。在后種情況下,TUN/TAP設備向操作系統(tǒng)的網絡棧投遞(或 “注入”)數(shù)據包,從而模擬從外部接受數(shù)據的過程;初始化虛擬路由器VR標識符VRID。
數(shù)據分發(fā)模塊捕捉虛擬路由器網卡veth上的數(shù)據包,并將其中的NetFPGA數(shù)據包寫入對應的網卡nf ;信息接收模塊通過偵聽網關venet,分析由網卡veth發(fā)送出去的數(shù)據包,獲取路由信息,并通過調用NetFPGA的驅動程序API將路由信息下發(fā)到NetFPGA中。
本發(fā)明包括以下步驟步驟一將所述數(shù)據包入口設備檢查模塊設置在Linux內核網絡協(xié)議棧入口處,即在內核協(xié)議棧入口函數(shù)netif_receive_skb出增加一個函數(shù),對進入內核的每一個數(shù)據包緩沖區(qū)skb,檢查緩沖區(qū)內成員in_device的值,即入口設備的名稱。
步驟二 如果入口設備的名稱不是nfcx(x為網卡編號),則不做任何處理,將該數(shù)據包送回內核數(shù)據包處理隊列;如果入口設備的名稱為nfcx,則觸發(fā)數(shù)據封裝模塊,并將該數(shù)據包緩沖區(qū)skb和輸入設備名稱nfcx傳遞給該模塊;由NetFPGA板卡發(fā)送給主機的數(shù)據包包括三類a.路由信息包,b.需要進行路由計算的普通數(shù)據包,c.出錯數(shù)據包,對于這三類信息包,封裝方法相同,將其統(tǒng)稱為P1。
步驟三獲取步驟二中所述數(shù)據包Pl的協(xié)議數(shù)據區(qū)skb->head中7 12字節(jié)所包含的目的MAC地址dMAC,并根據此MAC地址與vMAC-VR映射表(如圖3 )中的表項vMAC比較,查找對應虛擬路由器VR自帶網卡veth的MAC地址veMAC及IP地址velP。
步驟四如果沒有在映射表中找到對應信息,則將此數(shù)據包丟棄;如果在映射表中查找到對應信息,再次根據網卡名稱nfcx查找nfc信息表(如圖4),查找輸入設備nfcx 的MAC地址nfcMAC及IP地址nfcIP,根據這些信息封裝一個新的IPv4數(shù)據包newHead, 數(shù)據包格式如圖5,以太網首部中源MAC地址為nfcMAC,目的MAC地址為veMAC,類型字段 type為0x0800,IP首部中源IP地址為nfcIP,目的IP地址為velP,protocol為177,IP數(shù)據段包括VRID和傳遞進來的數(shù)據包協(xié)議數(shù)據區(qū)skb->head。
步驟五將步驟二中所述數(shù)據包Pl的協(xié)議數(shù)據區(qū)skb->head替換為新封裝的數(shù)據包skb->newHead,并重新作CRC校驗,此時數(shù)據包Pl變成數(shù)據包P2,最后將整個緩沖區(qū)skb 送回內核協(xié)議棧處理隊列,Linux內核會將數(shù)據包自動轉發(fā)到對應的虛擬路由器。
步驟六數(shù)據分發(fā)模塊將OpenVZ虛擬機自帶網卡veth設置為混雜模式,捕捉、分析到達網卡數(shù)據包,如果是一個IPv4數(shù)據包并且protocol字段是177,則這個數(shù)據包是 P2,去掉P2的以太網首部和IP首部,讀取VRID字段并與本路由器的VRID比較,如果不同, 則將數(shù)據包丟棄;如果VRID相同,去掉VRID段,得到結構、數(shù)據與Pl相同的數(shù)據包P3。
步驟七讀取P3的第7 12字節(jié),獲取目的MAC地址,即dMAC,分別與由網卡虛擬模塊產生的各個虛擬網卡nfx (X為網卡編號)的MAC地址比較,如果MAC地址相同,則將 P3寫入該網卡。
步驟八寫入nfx的數(shù)據包P3,會由路由軟件,如X0RP、Qugga等讀取并處理,對于步驟三中所述數(shù)據包Pl中的a、c兩類,經過路由軟件處理后不會有任何輸出,Pl中的b類經過處理后會產生格式與P3相同的數(shù)據包P4,P3與P4內容上唯一不同的地方是P4的目的MAC被路由軟件修改成了下一跳的MAC地址。
步驟九通過Libnet將P4封裝成一個以太網數(shù)據包P5 (如圖6),源MAC地址為 veth的MAC地址veMAC,目的MAC地址為廣播地址FF: FF: FF: FF: FF: FF, TYPE字段為OxCCFE, payload (負載)為P4,然后通過網卡veth直接發(fā)送出去;封裝的具體步驟包括1.調用libnet_init初始化一個數(shù)據包;2.根據步驟九中所述的信息,調用libnet_build_ ethernet將P4封裝成一個以太網數(shù)據包P5 ;3.調用libnet_write將數(shù)據包P5發(fā)送出去。
步驟十路由信息分析模塊監(jiān)控位于主機操作系統(tǒng)內的網關venet,抓取從veth 上面發(fā)送出去的數(shù)據包,分析這些數(shù)據包中以太網首部中的目的MAC地址和TYPE字段,如果目的MAC地址為FF:FF:FF:FF:FF:FF,TYPE字段為OxCCFE,那么這個數(shù)據包就是步驟九中所述的從網卡veth發(fā)送出去的數(shù)據包P5,去掉數(shù)據包P5的以太網首部區(qū)域,獲取經路由軟件處理后產生的數(shù)據包P4。
步驟^^一 分析P4,獲取目的MAC地址和目的IP地址,記錄成一條路由信息,通過 NetFPGA提供的參數(shù),調用ioctl將信息存儲至NetFPGA中。
步驟十二 將P4通過主機自帶網卡ethx發(fā)送出去。具體步驟包括1.分析P4以太網首部,獲取源MAC地址、目的MAC地址、TYPE字段,IP首部的ihl (首部長度)、TOS (服務類型)、tot_len (總長度)、TTL (生存時 間)、protocol (協(xié)議)、源IP地址、目的IP地址, payload (負載)指針;2.調用libnet_init初始化一個數(shù)據包;3.根據步驟I中所述的11 條信息,調用libnet_build_ipv4創(chuàng)建一個標準IPv4數(shù)據包P6 ;4.調用libnet_write將數(shù)據包P6發(fā)送出去。
權利要求
1.一種基于NetFPGA的可編程虛擬路由器內部通信方法,其特征在于,包括以下步驟 捕獲進入Linux內核的NetFPGA數(shù)據包,將該數(shù)據包封裝后發(fā)送到虛擬路由器; 經所述虛擬路由器處理后的數(shù)據包通過主機操作系統(tǒng)轉發(fā)出去,并將路由信息部署到NetFPGA 中。
2.根據權利要求1所述一種基于NetFPGA的可編程虛擬路由器內部通信方法,其特征在于所述捕獲進入Linux內核的NetFPGA數(shù)據包,將該數(shù)據包封裝后發(fā)送到虛擬路由器的步驟包括 初始化建立數(shù)據封裝模塊,在數(shù)據封裝模塊中存放vMAC-VR映射表和nfc信息表; 在Linux內核網絡協(xié)議棧入口處設置數(shù)據包入口設備檢查模塊,檢查每一個流入Linux內核的數(shù)據包的入口設備名稱; 如果入口設備名稱為nfc則觸發(fā)數(shù)據封裝模塊,并將該流入Linux內核的數(shù)據包緩沖區(qū)skb和入口設備名稱nfc傳送到數(shù)據封裝模塊,由數(shù)據封裝模塊將skb封裝到一個新的IPv4數(shù)據包,然后該新的數(shù)據包通過Linux內核發(fā)送到虛擬路由器; 如果入口設備名稱不為nfc則不作任何處理。
3.根據權利要求2所述一種基于NetFPGA的可編程虛擬路由器內部通信方法,其特征在于所述數(shù)據封裝模塊將skb封裝到一個新的IPv4數(shù)據包的步驟包括 獲取skb中的協(xié)議數(shù)據區(qū)skb->head中的MAC地址字段,并在vMAC_VR映射表中查找VR信息的IP地址,即虛擬路由器IP地址veIP和虛擬路由器MAC地址veMAC ; 如果在vMAC-VR映射表中找到VR信息,則查找nfc信息表,查到入口設備的MAC地址nfcMAC和入口設備的IP地址nfcIP,將該skb中包含的協(xié)議數(shù)據區(qū)skb_>head封裝到一個新的IPv4數(shù)據包newHead中;否則將數(shù)據包丟棄。
4.根據權利要求1所述一種基于NetFPGA的可編程虛擬路由器內部通信方法,其特征在于利用TUN/TAP模擬與所述NetFPGA所帶網卡數(shù)量相同的路由器虛擬網卡veth。
5.根據權利要求1所述一種基于NetFPGA的可編程虛擬路由器內部通信方法,其特征在于所述經所述虛擬路由器處理后的數(shù)據包通過主機操作系統(tǒng)轉發(fā)出去,并將路由信息部署到NetFPGA中的步驟包括 通過I ibnet將經虛擬路由器處理后的數(shù)據包封裝成一個ARP廣播包,并通過路由器虛擬網卡veth發(fā)送出去; 信息接收模塊監(jiān)控網關venet,對每一個發(fā)送出去的ARP廣播包,解包后去掉以太網首部,分析數(shù)據段內容獲取路由信息,然后將數(shù)據段發(fā)送出去,通過調用NetFPGA的API將路由信息部署到NetFPGA中。
6.如權利要求5所述的一種基于NetFPGA的可編程虛擬路由器內部通信方法,其特征在于所述通過Iibnet將經虛擬路由器處理后的數(shù)據包封裝成一個ARP廣播包的步驟包括調用libnet_init_packet初始化一個數(shù)據包;調用libnet_build_ethernet封裝一個以太網數(shù)據包;libnet_open_raw_sock 打開一個套接字;調用 libnet_write_link_layer發(fā)送一個鏈路層數(shù)據包。
7.如權利要求5所述的一種基于NetFPGA的可編程虛擬路由器內部通信方法,其特征在于所述獲取路由信息的步驟包括通過Iibpcap庫抓取網關venet上的數(shù)據包,去掉以太網首部,獲得數(shù)據段; 申請一段新的緩沖區(qū),將所述數(shù)據段的第7 12字節(jié)、31 35字節(jié)復制進去,然后調用ioctl命令將其部署到NetFPGA中; 通過Iibnet將所述數(shù)據段發(fā)送出去。
全文摘要
本發(fā)明公開了一種基于NetFPGA的可編程虛擬路由器內部通信方法,其包括以下步驟通過檢查進入Linux內核的數(shù)據包的入口設備,將其中設備名稱為nfc的數(shù)據包封裝到一個新的IPv4數(shù)據包內,目的MAC地址和IP地址為虛擬路由器網卡veth的MAC地址和IP地址,發(fā)送到虛擬路由器,去掉封裝包的以太網首部和IP首部,分析其數(shù)據段并寫入對應網卡,由路由軟件處理后,將數(shù)據包通過主機操作系統(tǒng)發(fā)送出去,路由信息通過調用ioctl部署到NetFPGA中。加快了數(shù)據包在傳輸過程中的時延,減少了部署的難度。
文檔編號H04L12/741GK103001883SQ20121054686
公開日2013年3月27日 申請日期2012年12月17日 優(yōu)先權日2012年12月17日
發(fā)明者徐川, 趙磊, 唐紅, 趙國鋒 申請人:重慶郵電大學