tcp/ip是一組全世界廣泛應用的協(xié)議,不僅僅用于internet,許多私有網(wǎng)絡也使用tcp/ip作為其協(xié)議組,許多硬件設計都是基于tcp/ip或者相關的協(xié)議來開發(fā)的。傳統(tǒng)的tcp/ip處理網(wǎng)絡數(shù)據(jù)傳輸過程中,要占用大量的主機cpu資源,為了減輕cpu的壓力,一種叫toe(tcp/ip offload engine,tcp/ip卸載引擎)的技術應運而生。toe技術對tcp/ip協(xié)議棧進行擴展,使部分tcp/ip協(xié)議從cpu轉(zhuǎn)移到toe硬件,減輕cpu的負擔。 toe技術 所謂卸載是指將cpu上的計算或處理轉(zhuǎn)移到專門的硬件單元上進行。在目前的以太網(wǎng)環(huán)境中,tcp/ip的處理都是通過軟件在中心處理器上實現(xiàn)的,導致系統(tǒng)在協(xié)議處理、中斷處理、數(shù)據(jù)拷貝方面面臨困難。利用toe技術對tcp/ip卸載則簡化了數(shù)據(jù)包的處理,如圖1所示,toe將tcp/ip協(xié)議從cpu中移到硬件中處理。在主機中安裝和toe通信的驅(qū)動后,內(nèi)核和用戶的應用都可以直接和toe通信,這樣就可以使主機cpu來處理別的工作。toe在接收到網(wǎng)絡上的數(shù)據(jù)后,進行一系列的協(xié)議處理,將數(shù)據(jù)放在指定地址,交給上層應用。發(fā)送方向則相反,將需要處理的數(shù)據(jù)包裝后通過硬件緩沖發(fā)送出去。toe的處理簡化了流程,主機只需要直接處理數(shù)據(jù)而不用對數(shù)據(jù)拆包重組,因而對協(xié)議處理,中斷和數(shù)據(jù)拷貝都大大減少,降低了主機cpu的負擔。 圖1 toe技術的原理框圖 toe硬件結(jié)構 ● 硬件設計方案 從器件的實現(xiàn)上,toe實現(xiàn)方案可以采用兩種結(jié)構:一種是分離元件結(jié)構,另外一種是asic芯片。分離元件采用電路板構建,具有修改靈活性,方便升級改進。采用asic芯片實現(xiàn)的方案是將協(xié)議處理集成到定制的芯片中,在性能上比分離元件的方式有所提高,但它在可編程性、擴展性和靈活性方面比較差。為了提高靈活性又保證處理速度,可以采用fpga來實現(xiàn)toe。 在設計中采用了altera公司的FPGA來實現(xiàn)toe,并配合nios ii實現(xiàn)嵌入式處理器的功能。圖2為toe的框架結(jié)構,它由一個嵌入式cpu、接收部分、發(fā)送部分和物理硬件接口構成。在這個結(jié)構中,所有的發(fā)送模塊在一邊,接收模塊在另一邊,是為了能直接訪問一個共享的存儲器,從而減少數(shù)據(jù)拷貝。為了支持眾多的協(xié)議模塊訪問,通過一條內(nèi)部總線來連接協(xié)議模塊和共享存儲器。由嵌入式cpu協(xié)調(diào)模塊間的通信,狀態(tài)管理以及和上層cpu的通信。 圖2 toe硬件結(jié)構 當網(wǎng)絡上送來一個數(shù)據(jù)包時,物理接口開始啟動,進行簡單的包頭處理后,發(fā)送中斷給嵌入式cpu,cpu移動數(shù)據(jù)到接收緩沖器(buffer),將消息隊列置為有效。協(xié)議接收模塊檢測到有數(shù)據(jù)需要處理,啟動協(xié)議分析處理。當所有的處理完成后,嵌入式cpu發(fā)送一個中斷給主cpu,并將數(shù)據(jù)放入指定的地址。發(fā)送過程和接收過程相反,cpu把需要處理的數(shù)據(jù)放入發(fā)送緩沖器,協(xié)議模塊檢測到有消息后開始啟動處理。完成后將數(shù)據(jù)移到物理層的發(fā)送緩沖中發(fā)送出去。在這個設計中,共享存儲器的訪問控制和協(xié)議模塊的設計是難點,下邊將詳細介紹。 ● 共享存儲器的訪問 在fpga中,所有的協(xié)議模塊將對輸入與輸出緩沖器有控制權。這里使用總線的方式來訪問緩沖器,并加上一個總線仲裁器來處理模塊對緩沖器的訪問。協(xié)議模塊在這個總線上作為訪問發(fā)起者。當某一模塊需要訪問緩沖器的時候,它需要向總線仲裁發(fā)起一個中斷,等待其響應。總線仲裁使用輪詢的方式來處理每個模塊的響應。協(xié)議模塊獲得訪問權限后,就可以對緩沖器進行操作了,操作結(jié)束后,釋放訪問權限。使用總線仲裁器輪詢的方式只是目前設計的一種方式,在不同的應用中,可能會有更好的方式來處理共享存儲器的訪問,需要后續(xù)的研究進一步驗證。 ● 存儲器管理 這里有兩種類型的存儲器:本地的及共享的存儲器。本地存儲器駐留在每個模塊的內(nèi)部。這些本地存儲器是駐留在這些模塊內(nèi)部的寄存器或者高速緩沖存儲器。共享存儲器可以被任何模塊通過指針來訪問。每個模塊使用它自己的本地存儲器來保存索引和偏移量。這個存儲器將保存本模塊運行所需要的臨時變量。每個模塊將控制用來指向被處理的數(shù)據(jù)包引用的編號。特定模塊的編號數(shù)量將直接控制模塊的行為。 圖3描述了在tcp接收模塊中,一個存儲器區(qū)域使用索引來查找的例子。輸入索引和輸出索引對于每個模塊來說都是有訪問控制的權限,索引使得模塊之間保持協(xié)調(diào)。 圖3 共享存儲器的查找索引 每次一個數(shù)據(jù)報離開或者到達一個輸入緩沖器,都要先查詢存儲器管理模塊。這個模塊使用一個稱作空閑隊列表的索引來管理輸入輸出緩沖器中的空閑地址。通過查詢這個表,存儲器管理模塊可以為進入的有效載荷分配空間。當一個數(shù)據(jù)報離開其中一個緩沖器,那么一個新的值將登記到這個空閑隊列表中。這個表是用來管理緩沖器中的空閑地址的。它的結(jié)構包含:一個輸入或者輸出緩沖器的引用;一個緩沖器的識別號;可用空間的大小。丟棄模塊以及內(nèi)存釋放模塊也間接地與空閑空間表打交道。 ● 協(xié)議模塊的設計 實現(xiàn)tcp/ip的卸載離不開和它緊密相關的協(xié)議。為了實現(xiàn)并行處理,整個tcp/ip協(xié)議棧分成了圖4中的各個模塊。不同的報文經(jīng)過不同的數(shù)據(jù)路徑處理報頭信息。每個協(xié)議模塊的緩沖在存儲器中是排隊的。這樣的設計能夠讓tcp_rx模塊處理報文的時候,ip_rx模塊還能為接下來的報文處理ip層的數(shù)據(jù)。簡而言之,每個協(xié)議模塊都是獨立的邏輯電路,協(xié)議的處理同軟件類似。接收時按緩沖中的順序處理報文頭和數(shù)據(jù)。發(fā)送時根據(jù)用戶的指令在緩沖中添加報文頭和所需數(shù)據(jù)段。 圖4 協(xié)議模塊處理 ● 協(xié)議模塊運行狀態(tài) 協(xié)議模塊設計成按照下面圖5所描述的狀態(tài)周期來工作。如果輸入索引中沒有數(shù)據(jù)包進入,處理過程將被鎖定。在進入一個數(shù)據(jù)包之后,硬件開始了數(shù)據(jù)包的處理過程。處理完之后,生成的數(shù)據(jù)包放在輸出索引中。其他的模塊把這個輸出索引當作自己的輸入索引。緩沖器的索引直接依賴于每個模塊。在tcp接收模塊,輸入索引是ip就緒索引,這個ip就緒索引是ip接收模塊的輸出索引。tcp的輸出索引將是tcp就緒索引。應用層以及其他處于tcp上層的協(xié)議將使用這個索引來處理已經(jīng)就緒的tcp/ip數(shù)據(jù)包。一旦一個模塊將一個索引放入它的輸出索引,那么這個模塊將返回到狀態(tài)1等待,直到下一個索引的到來。 圖5 狀態(tài)機 性能分析及模擬 在這里,要估計在100mb/s以太網(wǎng)的性能。當使用tcp最大負荷時候,一個數(shù)據(jù)包是1460b,加上tcp和ip頭,包長達到1500b,加上14b的mac頭和4b的crc校驗字節(jié),一共有1518b。此外mac在傳輸有效報文時,還有8b的前文。這樣在100mb以太網(wǎng)處理一個滿負荷幀需要1526×8×10ns=122 080ns=0.122 08ms。也就是說系統(tǒng)需要在 0.122 08ms或12 208個100mb的時鐘周期內(nèi)完成整個幀處理。這是最好的情況。當tcp沒有任何負荷時,幀的字節(jié)總數(shù)為20(tcp頭)+20(ip頭)+14(mac頭)+4(crc)+8(mac前文)=66b。在100mb/s的以太網(wǎng)中需要66×8×10ns=5.28μs時間傳輸。就是說系統(tǒng)需要在5.28μs內(nèi)處理完這個數(shù)據(jù),這是最壞的情況。 通過系統(tǒng)的分析,對滿負荷的幀來說,從mac緩沖器拷貝數(shù)據(jù)到內(nèi)部存儲器開始,直到處理完畢后放在系統(tǒng)主存儲區(qū)這個時間內(nèi),總共需要的時鐘周期平均為1740個。發(fā)送的時候需要的1784個時鐘周期。沒有負荷的時候分別在發(fā)送和接收需要280和269個時鐘周期。所以,我們可以計算出在100mb/s的以太網(wǎng)需要系統(tǒng)的系統(tǒng)時鐘,如表1所示。根據(jù)綜合的結(jié)果,系統(tǒng)能達到的最大時鐘為49mhz,差不多能夠滿足最壞情況的需要。然而,最壞的情況是很少發(fā)生的,所以目前設計的toe系統(tǒng)能夠很好地滿足百兆位以太網(wǎng)的需求。 使用ping、udp和tcp程序進行模擬。模擬環(huán)境需要2臺通過網(wǎng)絡連接的計算機,一臺作服務器,一臺作客戶機。通過quartus ii編譯dhl文件,下載到toe網(wǎng)卡的fpga中,將toe網(wǎng)卡連接到客戶機。在客戶機運行ping、udp和tcp程序,確認服務器是否能夠響應客戶機的數(shù)據(jù)包。通過客戶機上的network analyzer軟件,可以捕獲發(fā)送接受數(shù)據(jù)包,能夠進一步確認數(shù)據(jù)包的正確性。 結(jié)束語 高速以太網(wǎng)的發(fā)展,導致目前cpu在tcp/ip協(xié)議棧的處理開銷越來越大,需要使用專門的硬件來執(zhí)行tcp/ip的協(xié)議棧處理。本文給出了一種硬件實現(xiàn)的toe參考設計,在與普通網(wǎng)卡測試對比中表明,使用toe技術的網(wǎng)卡能夠大大降低cpu的負擔,而保持網(wǎng)絡高吞吐率。 |