網絡卡收發包的offload總結

2021-10-01 22:57:44 字數 2747 閱讀 9811

網絡卡的offload是指將cpu對資料報的一些處理操作轉到硬體網絡卡上進行,由此釋放出cpu的計算資源。offload也被稱為硬體解除安裝。從2023年起,offload技術開始在網絡卡上使用。發展至今,網絡卡上已經支援多種形式的offload。

目前,在收發方向上,網絡卡各自支援不同的offload,下面將分別展開描述。每一種offload的具體實現以後再進行補充。

vlan tag的插入

vlan雖然只有四個位元組,卻可以實現乙太網的隔離。其基本使用方式機在乙太網中報文中增加乙個4位元組的802.1q tag,也稱為vlan tag。vlan tag的插入和過濾剝離均可以通過網絡卡來完成。在傳送方向,需要進行vlan的插入操作。

lso(large-segment-offload)

計算機網路上傳輸的資料基本單位是離散的網包,其大小的限制為mtu(maximum transmission unit)的大小,一般是1518位元組。比如我們想傳送很多資料出去,經過os協議棧的時候,會自動幫你拆分成幾個不超過mtu的網包。然而,這個拆分是比較費cpu計算資源的。把這些簡單重複的操作 offload 到網絡卡上就是lso。

在傳送資料超過 mtu 限制的時候(太容易發生了),os 只需要提交一次傳輸請求給網絡卡,網絡卡會自動的把資料拿過來,然後進行切片,並封包發出,發出的網包不超過 mtu 限制。

tso(tcp-segment-offload)/ufo(udp-fragmentation-offload)分片

對於從應用層獲取的比較大的資料報,需要根據下層網路的報文大小限制,將其切分為較小的分片傳送。tcp報文使用tso,而udp報文則使用ufo,都屬於lso的範疇。

gso(generic-segmentation-offload)分片

相對於tso和ufo,gso是一種更通用的機制。其基本思想就是把資料分片的操作盡可能的向底層推遲直到資料傳送給網絡卡驅動之前,並先檢查網絡卡是否支援tso或ufo機制,如果支援就直接把資料傳送給網絡卡,否則的話就軟體進行分片後再傳送給網絡卡,以此來保證最少次數的協議棧處理,提高資料傳輸和處理的效率。

checksum

checksum是用於校驗目的的一組資料項的和,用於在遠距離通訊中保證資料的完整性和準確性。在ethernet、ipv4、udp、tcp、sctp各個協議層中都有checksum欄位。ipv6頭部沒有checksum欄位,因此不需要進行checksum計算。在收發方向上,均需要對checksum進行支援。由於checksum需要整個報文參與計算,逐包計算對於cpu來說是個不小的開銷。

在傳送側,需要計算計算協議的checksum,將其寫入合適的位置。原理上,網絡卡在設計之初就需要依賴軟體做額外設定,軟體需要逐包提供傳送側的上下文狀態描述符,這段描述符通過pcie匯流排寫入到網絡卡裝置內,幫助網絡卡進行checksum計算。

vlan tag的過濾(filtering)剝離(stripping)

在收包時,需要完成vlan tag的過濾和剝離操作。過濾的實現方式是設定vlan過濾表,無法在過濾表中匹配的報文會被直接丟棄。vlan tag的剝離也是由網絡卡來完成的。此時網絡卡會在硬體描述符中設定兩個域,包含此包是否曾被剝離了vlan tag,以及被剝離的vlan tag,並通知驅動軟體。

lro(large-receive-offload)/gro(generic-receive-offload)

與lso對應, 收方向上網絡卡會將接受到的多個資料報分片聚合成乙個大的資料報,然後上傳給協議棧處理。gro對lro有了一些改進,更加通用,目前主流的網絡卡所使用的都是gro的offload。

checksum

在接收方向,通過設定埠配置,強制對所有達到的資料報文進行檢測,即判斷哪些包的checksum是錯誤的,對於出錯的包可直接進行丟棄。

rss(receive-side-scaling)

rss是網絡卡上一種用於將流量均勻分散到不同的佇列上的技術。簡而言之,就是首先在硬體上根據關鍵字進行雜湊值的計算,再由雜湊值確定佇列。不同的資料報型別對應不同的資料報型別,如ipv4包對應四元組,使用者甚至可以修改包型別對應的關鍵字以滿足不同的要求。

具備多個rss佇列的網絡卡,可以將不同的網路流分成不同的佇列,再將這些佇列分配到多個cpu核心上進行處理,從而將負荷分散,充分利用多核處理器的能力,提交資料接收的能力和效率。

flow director

flow director技術是intel公司提出的根據包的精確字段匹配,將其分配到某個特定佇列的技術。如果說rss主要用來做負載均衡的話,flow director則是用來做精確的流導向。

flow director的工作方式為:網絡卡上儲存了一張flow director的表,它記錄了需要匹配關鍵字段的關鍵字以及匹配後的動作。驅動負責操作這張表。網絡卡收到資料報之後,根據關鍵字查詢這張表,匹配後按照表項中的動作來進行處理。

值得注意的是,目前常用的抓包工具如tcpdumpwireshark等大部分都是從協議棧中捕獲資料報,而網絡卡的offload特性會將資料報的分片、重組等工作轉移到協議棧以下的硬體層面 進行,因此在開啟tso、gro等機制的情況下,我們使用抓包工具抓取到的資料報往往不能真實反應鏈路上實際的資料幀, 給網路流量特徵的分析造成不利影響。針對這些情況,可以選擇關閉網絡卡offload的相關選項,或者在鏈路的其他節點進行抓包。

網絡卡驅動收發包過程

網絡卡工作在物理層和資料鏈路層,主要由phy mac晶元 tx rx fifo dma等組成,其中網線通過變壓器接phy晶元 phy晶元通過mii接mac晶元 mac晶元接pci匯流排 phy晶元主要負責 csma cd 模數轉換 編譯碼 串並轉換 mac晶元主要負責 intel的千兆網絡卡以825...

網絡卡驅動收發包過程

網絡卡工作在物理層和資料鏈路層,主要由phy mac晶元 tx rx fifo dma等組成,其中網線通過變壓器接phy晶元 phy晶元通過mii接mac晶元 mac晶元接pci匯流排 phy晶元主要負責 csma cd 模數轉換 編譯碼 串並轉換 mac晶元主要負責 位元流和幀的轉換 7位元組的前...

網絡卡驅動收發包過程

網絡卡工作在物理層和資料鏈路層,主要由phy mac晶元 tx rx fifo dma等組成,其中網線通過變壓器接phy晶元 phy晶元通過mii接mac晶元 mac晶元接pci匯流排 phy晶元主要負責 csma cd 模數轉換 編譯碼 串並轉換 mac晶元主要負責 intel的千兆網絡卡以825...