https://blog.csdn.net/weixin_42096901/article/details/103972505
現有的SDN解決方案將控制平面與轉發平面分離,並為我們提供了控制平面的可編程能力。而事實上,目前通過軟件編程實現的控制平面的功能,在傳統的高級交換機和路由器上也都能實現,差別是廠商把這些功能固化在了系統/硬件中,這些系統/硬件是封閉的,第三方難以介入進行定制或二次開發。雖然一些高級設備提供了SDK,使得用戶能夠進行一定程度的定制,但也必須受廠商所制定的規范的限制,能做到的事情十分有限。目前SDN所做的就是打破這些限制,讓設備和網絡更加的靈活,讓用戶不被廠商設備綁定,從而擁有無限的可能。
現有的SDN解決方案為用戶開放的是控制平面的可編程能力,那轉發平面呢?正常情況下,轉發設備的數據包解析,轉發流程是由設備轉發芯片固化的,所以設備在協議的支持方面並不具備擴展能力。並且,廠商開發新的轉發芯片以支持新的協議或者擴展協議特性的代價也非常高,需要將以前的硬件重新設計,勢必導致更新成本高,時間周期長等一系列問題。所以在一定程度上,這種將設備功能和協議支持與硬件綁定的模式限制了網絡的快速發展。
因此,我們可以得出以下結論:新一代的SDN解決方案必須讓數據轉發平面也具有可編程能力,讓軟件能夠真正定義網絡和網絡設備。而P4正是為用戶提供了這種能力,打破了硬件設備對數據轉發平面的限制,讓數據包的解析和轉發流程也能通過編程控制,使得網絡及設備自上而下地、真正地向用戶開放。
下面,我們主要從以下幾個方面談談我對P4這門轉發平面的編程語言的理解:P4的架構及特性、交換機結構、P4程序工作流程。
1.P4架構及特性
首先我們談談P4的誕生,由Nick教授,博科姆教授等聯合發布了一篇論文《P4: Programming Protocol-Independent Packet Processors》,該論文在SDN界引起了極大的反響和關注度。隨后,Nick教授等人又發布了《The P4 Language Specification》、《Barefoot白皮書》等文件。目前,P4已經在國外引起了足夠的重視,ONF成立了協議無關轉發的開源項目(PIF),該項目目前的工作重點就是為P4提供配套的中間表示IR(Intermediate Representation),另外PIF工作的成果將被用來設計下一代的OpenFlow協議。
目前人們提及最多的OpenFlow協議在逐漸的完善演化過程中,表字段和表類型不斷的增加。白牌交換機在支持OpenFlow協議的版本更新上,面臨着和傳統交換設備廠商同樣的困境——OpenFlow並不支持彈性地增加匹配域支持,協議新特性的支持所需要的成本大、時間周期長。同時,隨着網絡中新的協議不斷出現,OpenFlow協議也必將變得越來越臃腫,表的擴展也必將變得越來越困難。
P4語言在設計之初,就是為了實現以下三個特性:
(1)協議無關性
網絡設備不與任何特定的網絡協議綁定,用戶可以使用P4語言描述任何網絡數據平面協議和數據包處理行為。這一特性通過自定義包解析器、匹配-動作表的匹配流程和流控制程序實現。
(2)目標無關性
用戶不需要關心底層硬件的細節就可實現對數據包的處理方式的編程描述。這一特性通過P4前后端編譯器實現,前端編譯器將P4高級語言程序轉換成中間表示IR,后端編譯器將IR編譯成設備配置,自動配置目標設備。
(3)可重構性
允許用戶隨時改變包解析和處理的程序 ,並在編譯后配置交換機,真正實現現場可重配能力。
為了實現上述特性,P4語言的編譯器采用了模塊化的設計,各個模塊之間的輸入輸出都采用標准格式的配置文件,如p4c-bm模塊的輸出作為載入到bmv2模塊中的JSON格式配置文件。P4的架構圖如圖1所示。
圖1 P4架構圖
2. 交換機結構
在傳統交換機中,數據流轉化為數據幀之后進行解析,首先檢查的是tag,包括有無tag、靈活Q-in-Q、VLAN映射等。VLAN tag的檢查和處理在所有廠商的交換機中都是必須的,但隨后數據包處理流程就因廠商而異了,不同廠商的芯片設計會產生不同的處理流程,每個處理流程就是一個基礎的數據處理單元,一般情況下,交換機的流水線包含6-8個數據處理單元。
圖2 傳統交換機流水線結構
圖2中列出的是幾個比較常見的數據幀處理單元,如二層轉發、ACL轉發等。流水線上每個基礎數據處理單元處理數據的過程,就是根據數據幀解析后的包頭信息,重復查表、匹配並執行對應的交換機指令的過程。
P4交換機中也有流水線(pipeline)的概念,一條流水線表示一組完整的數據處理流程,這一概念和傳統交換機中的的流水線是相似的。如圖3所示,在P4交換機中一條流水線可以包含以下組件:解析器/逆解析器、匹配-動作表、元數據總線。其中除了元數據總線,其他組件都是非必須的。
解析器(parser):將分組數據轉化成元數據。
逆解析器(Deparser):將元數據轉化成序列化的分組數據。
匹配動作表(match-action table):操作元數據。
元數據(metadata):在流水線內存儲數據信息。
圖3 P4交換機流水線結構
P4交換機中將流水線處理數據的過程進行抽象和重定義,數據處理單元對數據的處理抽象成匹配和執行匹配-動作表的過程,包頭的解析抽象成P4中的解析器,數據處理流程抽象成流控制。P4中基礎數據處理單元是不記錄數據的,所以就需要引入一個元數據總線,用來存儲一條流水線處理過程中需要記錄的數據。P4交換機的專用物理芯片Tofino,最高支持12個數據處理單元,可以覆蓋傳統交換機的所有功能。
有了以上的知識儲備,就可以很輕松的刻畫出P4交換機的結構。如圖4所示,P4交換機中含有兩條流水線——入口流水線和出口流水線;同時還有一些數據流管理功能,例如:擁塞控制,隊列控制,流量復制等。
圖4 P4交換結構
對比圖2 圖3和圖4,我們不難看出P4交換機結構與傳統的交換機並沒有多少差別,而且在芯片的設計上也僅僅是增加了可以自定義基礎數據處理單元和轉發流程的功能,其他設計與傳統交換機芯片無異,這也使得P4交換機能夠在為用戶提供數據轉發平面的可編程能力的同時,保證數據的線性轉發速率。
3. P4程序工作流程
至此,我們可以梳理出P4的完整工作流程。用戶首先需要自定義數據幀的解析器和流控制程序,其次P4程序經過編譯器編譯后輸出JSON格式的交換機配置文件和運行時的API,再次配置的文件載入到交換器中后更新解析起和匹配-動作表,最后交換機操作系統按照流控制程序進行包的查表操作。
圖5 P4工作流程
如圖5所示,以新增VLAN包解析為例,圖中解析器除VXLAN以外的包解析是交換機中已有的,載入VXLAN.p4文件所得的配置文件的過程就是交換機的重配置過程。配置文件載入交換機后,解析器中會新增對VXLAN包解析,同時更新匹配-動作表,匹配成功后執行的動作也是在用戶自定的程序中指定。執行動作需要交換機系統調用執行動作對應的指令來完成,這時交換機系統調用的是經過P4編譯器生成的統一的運行時API,這個API就是交換機系統調用芯片功能的驅動,流控制程序就是指定API對應的交換機指令。