網卡收發包的offload總結

    網卡的offload是指將CPU對數據包的一些處理操作轉到硬件網卡上進行,由此釋放出CPU的計算資源。offload也被稱爲硬件卸載。從2012年起,offload技術開始在網卡上使用。發展至今,網卡上已經支持多種形式的offload。
目前,在收發方向上,網卡各自支持不同的offload,下面將分別展開描述。每一種offload的具體實現以後再進行補充。

發送方向:

  1. VLAN Tag的插入
       VLAN雖然只有四個字節,卻可以實現以太網的隔離。其基本使用方式機在以太網中報文中增加一個4字節的802.1q Tag,也稱爲VLAN Tag。VLAN Tag的插入和過濾剝離均可以通過網卡來完成。在發送方向,需要進行VLAN的插入操作。
  2. LSO(large-segment-offload)
       計算機網絡上傳輸的數據基本單位是離散的網包,其大小的限制爲MTU(Maximum Transmission Unit)的大小,一般是1518字節。比如我們想發送很多數據出去,經過os協議棧的時候,會自動幫你拆分成幾個不超過MTU的網包。然而,這個拆分是比較費CPU計算資源的。把這些簡單重複的操作 offload 到網卡上就是LSO。
       在發送數據超過 MTU 限制的時候(太容易發生了),OS 只需要提交一次傳輸請求給網卡,網卡會自動的把數據拿過來,然後進行切片,並封包發出,發出的網包不超過 MTU 限制。
  3. TSO(Tcp-segment-offload)/UFO(udp-fragmentation-offload)分片
        對於從應用層獲取的比較大的數據包,需要根據下層網絡的報文大小限制,將其切分爲較小的分片發送。TCP報文使用TSO,而UDP報文則使用UFO,都屬於LSO的範疇。
  4. GSO(generic-segmentation-offload)分片
       相對於TSO和UFO,GSO是一種更通用的機制。其基本思想就是把數據分片的操作儘可能的向底層推遲直到數據發送給網卡驅動之前,並先檢查網卡是否支持TSO或UFO機制,如果支持就直接把數據發送給網卡,否則的話就軟件進行分片後再發送給網卡,以此來保證最少次數的協議棧處理,提高數據傳輸和處理的效率。
  5. Checksum
        Checksum是用於校驗目的的一組數據項的和,用於在遠距離通信中保證數據的完整性和準確性。在Ethernet、IPV4、UDP、TCP、SCTP各個協議層中都有checksum字段。IPV6頭部沒有checksum字段,因此不需要進行checksum計算。在收發方向上,均需要對checksum進行支持。由於checksum需要整個報文參與計算,逐包計算對於CPU來說是個不小的開銷。
       在發送側,需要計算計算協議的checksum,將其寫入合適的位置。原理上,網卡在設計之初就需要依賴軟件做額外設置,軟件需要逐包提供發送側的上下文狀態描述符,這段描述符通過Pcie總線寫入到網卡設備內,幫助網卡進行checksum計算。

接收方向:

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

  2. LRO(large-receive-offload)/GRO(generic-receive-offload)
       與LSO對應, 收方向上網卡會將接受到的多個數據包分片聚合成一個大的數據包,然後上傳給協議棧處理。GRO對LRO有了一些改進,更加通用,目前主流的網卡所使用的都是GRO的offload。

  3. Checksum
       在接收方向,通過設置端口配置,強制對所有達到的數據報文進行檢測,即判斷哪些包的checksum是錯誤的,對於出錯的包可直接進行丟棄。

  4. RSS(Receive-side-scaling)
       RSS是網卡上一種用於將流量均勻分散到不同的隊列上的技術。簡而言之,就是首先在硬件上根據關鍵字進行哈希值的計算,再由哈希值確定隊列。不同的數據包類型對應不同的數據包類型,如IPV4包對應四元組,使用者甚至可以修改包類型對應的關鍵字以滿足不同的要求。
    具備多個RSS隊列的網卡,可以將不同的網絡流分成不同的隊列,再將這些隊列分配到多個CPU核心上進行處理,從而將負荷分散,充分利用多核處理器的能力,提交數據接收的能力和效率。

  5. Flow Director
       Flow Director技術是Intel公司提出的根據包的精確字段匹配,將其分配到某個特定隊列的技術。如果說RSS主要用來做負載均衡的話,Flow Director則是用來做精確的流導向。
    Flow Director的工作方式爲:網卡上存儲了一張Flow Director的表,它記錄了需要匹配關鍵字段的關鍵字以及匹配後的動作。驅動負責操作這張表。網卡收到數據包之後,根據關鍵字查詢這張表,匹配後按照表項中的動作來進行處理。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章