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