您當前的位置:首頁 > 收藏

P4 學習筆記(一)- 導論

作者:由 YAOJ 發表于 收藏時間:2021-01-23

寫在前面:

最近在學習 P4

[1]

,就在這裡簡單的記錄一下筆記,希望和大家一起交流,共同進步!

導言

這幾年 Programmable Hardwares(可程式設計硬體)越來越重要了。大家比較熟悉的可能有 FPGA 在 Machine Learning 領域針對一些特別的演算法進行計算加速,包括谷歌的 TPU、蘋果 M1 晶片裡面的神經網路計算單元,都是在 FPGA 上面做 prototype 測試之後才做成 ASIC 產品釋出出來的。

計算機網路方面,上個時代的 OpenFlow

[2]

講究的是在 Control Plane (控制層)可以實時(runtime)改寫 switch 和 router 上的路由表。OpenFlow 的工作方式可以簡單的用下面這個圖來說明。

P4 學習筆記(一)- 導論

Source: github。com/nsg-ethz/p4-learning

當我們收到一個從 1。2。1。1 到 3。4。5。6 的網路包的時候,我們會在 switch 上面對照已經配置好的 rules,每個 rule 是一個 match action function。比如對於這個網路包,前兩個 rule 都是符合的,第一個 rule 對應的 action 是丟掉這個包,第二個 rule 對應的 action 是從 2 號 port 轉發出去。但每個 rule 的前面還有一個優先順序,在有多個 rules 同時匹配的情況下,會選擇最高優先順序的 rule,所以這個包最終會被無情的丟掉。

十年過去了,OpenFlow 也嘗試過廣泛的部署,但是也面臨了很多很多的問題,比如:

各個大廠生產的 switch 規格不一樣,能夠儲存的 rules 的數量不一樣…

Control Plane 比 Data Plane 慢了太多,有太多時延…

可以實時程式設計的結果引入了新的複雜度,進而產生了更多可能的 bug…

所以大佬們開始琢磨,能不能從更底層入手,搞一個

Protocol Independent Switch Architecture (PISA)

出來,就把計算機網路裡 packet 的轉發最基礎的過程高度抽象化,變成下面這個圖的樣子,從左到右,分別是:

Parser:先看看包裡面都有啥,每一個 bit 都是什麼;

Ingress:一堆 Match-Action 的流水線,看看哪些 bits 組成的 fields 有沒有我們想要的,比如目標 IP 是不是 8。8。8。8,是的話就改寫一下 header 讓包能被轉發到它該去的地方;

Switching Logic:還要有個地方實現我們想要的邏輯,或者為了高效能,放一個 buffer,存放剛被上一個環節處理完,準備給下一個環節處理的包

[3]

Egress:又來一堆 Match-Action 的流水線,比如改寫源 MAC 地址,同時提供更多對網路包的操作空間;

Deparser:最後把我們改寫好的 headers 重新寫回網路包,然後送它出去。

P4 學習筆記(一)- 導論

PISA, Source: github。com/nsg-ethz/p4-learning

為了能夠實現這樣一個架構,

P4

[4]

,就這麼誕生了。

P4 + PISA

其實就是一個更具普適性的 OpenFlow。

初識 P4

P4 作為一個程式語言,還算比較年輕,但也已經有 6 年多的歷史了。類似於 Python 2 和 3 的版本區別,P4 也有兩個版本,老的是 P4 14,新的是 P4 16。現在大廠都支援 P4 16,所以我們就好好學習新版的就好了。

P4 16 實現的模型基本等同於 PISA,叫做 v1model,長成下面這個樣子。

P4 學習筆記(一)- 導論

Source: https://p4。org/p4-spec/p4-14/v1。0。4/tex/p4。pdf

畢竟作為一個假裝是硬體語言的語言,用 P4 編出來的邏輯,也可以實現在 FPGA 上,比如 Xilinx 的 NetFPGA Sume(關於如何購買這塊板子,可以看我之前寫過的回答:斯坦福使用netfpga 開發板在哪兒可以購買?)。大概的邏輯就是下圖所示。由 P4 的程式碼,經由 Xilinx 的編譯器編譯成他們的架構可以理解的 binary,就可以在具有超高 throughput 的板子上跑了。當然這一切說來簡單,真正去用了 Xilinx 的編譯器,然後模擬驗證,再上板子上跑,其實是很漫長的過程… 而且一路都會被玄學的迷霧所籠罩,所以如果有同學在做這方面的工作,加油你是最棒的!

P4 學習筆記(一)- 導論

Source: http://isfpga。org/fpga2018/slides/FPGA-2018-P4-tutorial。pdf

接下來就說一下 P4 的語法。P4 是一種靜態語言,有點類似 C。一個程式碼檔案基本上都長成下面這個樣子。

P4 學習筆記(一)- 導論

Source: github。com/nsg-ethz/p4-learning

Libraries:一開始要 include 一些庫檔案,省的造輪子;

Declarations:定義一下基本的資料結構,也支援 typedef;

Parse packet headers:這個 Parser 的地方會放一些解析 headers 的程式碼;

Control flow:這個地方基本是最重要的邏輯部分了,這裡會透過我們定義的 Match-Action functions 按照修改網路包裡的內容(這裡只寫了 Ingress 這一步,其實還會有 Egress,等到下面 main 的時候會提到);

Assemble:然後就是在 Deparser 的地方會把我們前面改好的部分重新組裝成為一個新的 packet,轉發出去;

main():這就是我們的 main 函數了,這裡其實就是把我們剛剛寫的所有的部分,按照正確的順序排列好,一個一個的呼叫,所有的步驟都已經羅列出來了:

大體的結構可以分成三段式:Parser -> Match-Action Pipeline -> Deparser

是不是和 PISA 的結構很像?

P4 學習筆記(一)- 導論

P4 的工作流

小結

這一篇簡單介紹了一下 P4 的背景,和基本的架構,它所做的,就是把計算機網路裡最基本的 packet forwarding 進行了高度的抽象,變成 Parser, Match-Action Pipeline (Ingress & Egress), Deparser 等一系列過程,更方便大家在不那麼“靈活”的硬體上編寫自己設計的“靈活”的 protocol。

這一篇就先說這麼多,如果有同學看到的話,希望這篇文章能讓你對 P4 有了一個大概的認識。

如果大家有興趣,歡迎去看P4 學習筆記(二)- 語法基礎和 Parser。我會繼續講 P4 的基本資料結構和語法,然後學習一下上面工作流那個圖裡面的第一個 Parser 的部分。

參考

^

ETHz Networking Systems Group: P4-Learning

https://github。com/nsg-ethz/p4-learning

^

1

https://dl。acm。org/citation。cfm?id=1355746

^

Maglev: A Fast and Reliable Software Network Load Balancer

https://www。usenix。org/conference/nsdi16/technical-sessions/presentation/eisenbud

^

P4: Programming Protocol-Independent Packet Processors

https://dl。acm。org/doi/abs/10。1145/2656877。2656890

標簽: p4  rule  parser  source