TCP Segment Offload(TSO)的實現原理淺析

早上太燥熱,忽然想起三週前有人跟我交流了TSO的問題,我也描述了其原理,這個原理說來也是特別簡單,無非就是靠網卡硬件來分段,計算 checksum,從而解放CPU週期。其實只要說一個就夠了,既然靠硬件來分段,那麼只能由硬件來計算checksum了,由於你根本就不知道硬件的分 段細節,因此你也無法在分段前計算好每個段的checksum....
       TSO的原理幾乎每一個人都知道,事實上它是怎麼實現的這個問題也不難,難的是細節。在作完了正事以後,我想把這個原理展示出來,固然可能和實際的實現有超級大的出入,無論怎樣,它是一個原理框圖,仔細觀察,應該也能本身實現一個比我這個更好的TSO了。
       這個設計是一個數字邏輯,時序電路的範疇,而這個領域十分地高大上,並非普通的軟件程序員能hold住的,像我這樣的半瓶子也同樣。因此我依然是按照老 樣子,試圖直接給出一個結果,而不是要求聽書的人事先作一些準備,每每在人們作這些準備工做的時候,就已經厭倦放棄了。
       基礎知識不難,就是一些門電路,與門,非門,比較器,譯碼器,觸發器之類的,這些東西隨便找一本計算機組成原理,都很齊全。關鍵是怎麼組合它們,這是另外一 個領域的編程。此時,我想起了15年前個人高中物理老溼劉丹青在講電路的時候說過的一句話:讓電流流一下。這句話在科班人看來徹底不符合電路設計的基本原 則,他們可能更傾向於首先建模,而後分析,而後使用描述語言VHDL寫出代碼,最後再給出電路,我以爲這適合於設計自己,可是不適合於對一個門外漢講述其 精彩。對於一個門外漢來說,他惟一所知道的就是,讓電流流一下,而後衝過這個門,衝過那個管,好了,高電平變成低電平了....在我看來,就是這麼回事。
       在一張白紙上,畫出一堆的門電路,而後隨性隨意組合它們,慢慢的,我忽然發現,這個電路就是TSO的框架了。我記得上週幫人固化了路由轉發表,然而那種固 化行爲可能會由於成本太高而被pass掉,畢竟現在的軟實現已經夠用了吧。因此只有核心傳輸網才須要這種固化的轉發表,然而TSO倒是服務器領域的首推, 服務器太多了,遠比核心轉發設備多,它們的CPU須要減負,確實,CPU去計算一些固定模式的東西,有點浪費,它應該花更多的精力去處理一些不可控的東 西。因此TCP分段這種事情天然而然就由網卡代勞了。你,我,他,咱們都遇到過TSO,可是咱們只會開啓,關閉它,若是你想知道它究竟是怎麼 Offload的,請看下圖,讓電流流一流:

wKiom1WzK0exrDQsAAZR4khvYXY659.jpg
TCP分段和IP分片的區別很大,這個事你必定要明白。而後才能夠看懂上面的圖。
       以上的解析只是一個特例,事實上,全部的硬件加速機制無非都是同樣的機制。當我在看Intel千兆/萬兆網卡的手冊時,我想到在芯片的內部,這種電路的元 件幾乎是海量的,實現了RSS,硬件hash分類等。這就是我所謂的江河氾濫,沿着溝壑瞬間吞噬大地,咱們該如何挖溝填壑,這不是本文的目的,本文只是描 述了這種可能性。這也是這種專用電路和通用CPU之間的本質區別。CPU存在着一個指令集,這意味着它是關注於外部如何調用的,而專用電路的關注點在於內 部的執行邏輯,它幾乎不對外提供任何接口,惟一的就是設置幾個寄存器的值,好比MTU,數據包長度,數據包頭長度等,其它的執行邏輯,外部無權過問。這是 串行編程和並行執行的本質區別。
       對於指令系統,也有一些要說的。在內部控制邏輯上,有一個統一的指令分發系統,實際上就是發射出一系列的0和1的組合,這個組合中的0和1做用於各類門電 路,這些門電路接受了這些不一樣的輸入後,產生不一樣的輸出,而後再做爲另外的門電路的輸入,形成不一樣的輸出,如此反覆...難道事實不是這樣子嗎?你很難否 則定。
       讓電流流一流,若是你以爲比較抽象,那就觀察洪水氾濫的過程吧,大河決堤的地點不一樣,形成的災難也不一樣,關鍵在於決堤處的地勢以及其所鏈接的各類地形,這 一切都是同時發生的,和電流同樣,水流在通過一個彎道或者一道拱橋的時候,也會有一些延時和分流,這就能夠類比電路中的各類門。
       吃飯了,吃飯了,真煩!


程序員

相關文章
相關標籤/搜索