P4編程理論與實踐(2)—快速上手

2021-02-21 SDNLAB

作者簡介:鄭浩,東南大學本科生,研究方向:OpenFlow,P4。郵箱: zenhox@163.com

本文首先向大家簡單介紹在學習P4過程中需要用到的工具。本文的主要特色是讓對P4感興趣的大家不費吹灰之力的在工作,學習之餘,快速搭建完善的P4實驗環境並開始第一個P4實驗。本文的更新日期是2018年10月8日,使用相對於大多數教程來說較新的P4環境,本文提供兩種搭建環境的方法,它們的特點如下:

優點: 方便,快捷,對作業系統沒什麼要求。

缺點:運行較慢。

如果工作環境沒有Linux系統,建議使用VM。

優點:運行速率快,環境較新。

缺點:可能會遇到錯誤,需要一個ubuntu系統。

不用擔心費神的環境搭建,本文將提供一個一鍵搭建環境的腳本。這個腳本通過了我多次測試。

主要需要安裝5個組件:

bmv2

p4c

mininet

p4-tutorial

PI

首先要明白他們各自的作用【圖片來源於p4.org】:

如圖,我們寫好xxx.p4代碼,通過 p4c 這個 p4 compiler 將p4代碼編譯成為p4交換機可以理解的各種」機器代碼」。如果目標交換機是 bmv2 , 那麼p4c將生成 .json文件。

p4c是一款 p4編譯器。

BMv2是支持P4編程的軟體交換機。

PI是P4 runtime的實現,用於Control Plane對數據平面的控制。

mininet的功能是構建一個虛擬的網絡拓撲。 它通過linux內核的一些特性(net命名空間),在一個主機上劃分出多個虛擬網絡空間,各個網絡空間之間相互隔離,有自己的埠, ip等等。mininet讓一個或者多個vhost(虛擬主機), 軟體交換機(如ovs, bmv2)等 以進程的狀態分別綁定在這些網絡空間之中,共同構成一個進程級別的虛擬網絡拓撲。需要注意的是這些進程級別的主機和交換機他們只是網絡上的隔離,而文件系統則是共享主機的文件系統。

p4 tutorials 提供了用於學習的實例代碼,它提供了很多個帶有方向性的實際場景,例如負載均衡,簡單的隧道機制,源路由等。並且它事先寫好了控制面代碼,讓p4的初學者可以集中注意力在數據面編程的學習之上。

scapy是一個python庫,提供構建數據包,抓包,解析包等功能。它功能強大,但是效率很低。由於P4編程中經常會引入各種各樣的數據包,有些甚至是開發者自定義的數據包格式。所以我們可以利用scapy進行便捷的組包,發包。如果需要高速率的發包和解析包就不能使用scapy了。

搭建環境有兩條路可以走:

官方提供了用於學習的虛擬機,裡面有完整的環境。可以嘗試訪問官網連結。如果不能訪問外網,可以嘗試訪問我這個1Core, 1M帶寬的伺服器資源

官方的環境似乎比較陳舊,我利用方法二在虛擬機中搭建了一個環境,並且導出供大家使用,下面是下載連結:

1.FTP伺服器下載, 這個是一個雲主機,如果過期或者伺服器崩潰, 聯繫我去修復。

2.如果FTP伺服器崩潰,建議自己裝一個Ubuntu16.04的虛擬機,然後調用方法二,其實也很簡單。

3.這裡還有一個騰訊微雲的連結: https://share.weiyun.com/581m3WN

真機搭建需要獲得各個組件的源碼,然後編譯安裝,可能遇到各個組件之間的版本兼容性,依賴性等問題。

本來打算一步一步寫出手動搭建的步驟,但過程比較痛苦,為了防止讓大家陷入搭建環境這種苦澀且收益不大的環節,本文按照p4 tutorials中vagrant用於構建虛擬機環境的腳本,進行了適當修改後,最終改成一個搭建真機P4實驗環境的腳本。通過這個腳本,可以方便的讓大家搭建好P4學習環境,該腳本通過了本人多次測試。

建議在網絡環境較好的環境下執行腳本,如果能使用國外的代理就更好了,如果網速較慢,建議晚上睡覺前執行,然後天亮後再瞅瞅,畢竟國內訪問github有時真的太慢了。

相關腳本已經上傳至p4-quick 。

在搭建之前

為了不破壞原環境的整潔性,我們還是在home目錄下創建一個P4的工作目錄,並且加入環境變量:

在運行腳本之前,先核實一下必要的環境和依賴:

發行版: Ubuntu 16.04 Desktop LTS , 通過 lsb_release -a查看。

Python: 2.7.12, 通過 python --version查看。

內核: 4.15.0-29-generic , 通過 uanme -a查看,差不多即可。

開始搭建

先安裝一些依賴:

然後創建一個文件,用於存放搭建環境的腳本:

然後將以下內容,複製到 env_up.sh文件當中:

保存退出腳本,然後執行這個腳本:

腳本開始自動為你搭建環境,如果中途遇到錯誤,腳本會中斷,如果腳本順利執行,那麼腳本結束後,環境便搭建好了。

進行實驗之前

如果你下載的是本文提供的第二種虛擬機,或者通過腳本安裝了P4環境,現在P4目錄下面應該是這個樣子:

我們主要的工作目錄時tutorials,其餘的都是被使用的工具組件。細看tutorials:

其中utils裡面存放了一些用於調用各個組件(mininet, bmv2, PI, p4c)的腳本,有了這些腳本,我們可以專注於p4代碼的開發,控制面的編寫,以及拓撲的構建,而不需要費神去了解bmv2的啟動命令,p4c的調用選項等等。具體如何使用,也是非常的簡單,我們進入一個具體的例子查看:

可以看到,通過Makefile,我們可以調用utils下的腳本,讓我們的p4代碼跑起來:

調用make run,我們可以運行當前目錄下(以basic目錄為例)的代碼,它將執行以下幾個步驟:

編譯basic.p4 代碼,生成basic.json

解析topology.json, 並且構建相應的mininet仿真拓撲,按照該拓撲啟動一臺或者多臺BMv2交換機,以及一些host

啟動BMv2的同時會將p4代碼編譯產生的json文件導入

啟動BMv2後會解析 sN-runtime.json 文件,將其載入 交換機sN流表之中

進入mininet命令行,同時開始記錄log以及搜集pcap文件

在新版本的tutorials中,載入靜態流表項時採用了runtime方法,而非之前的CLI方法,我們查看一下s1-runtime.json的部分

這是一個json文件,可以看到,其作用是定義一個個具體的流表項,標明了流表項所處的位置,匹配域,匹配模式,動作名,以及動作參數。這些欄位都依賴於我們P4代碼中所自定義的流表,匹配域和動作。

查看要實現的功能

查看README,裡面這樣介紹這個實驗:

可以看到這是一個實現轉發功能的P4實例,文件剩餘部分是進行實驗具體的思路和指令,建議大家多多查閱README,以後就可以自己學習啦~

查看網絡拓撲結構 topology.json:

清晰明了:這個拓撲中有3個switch,3個host,構成一個三角形的拓撲,注意到定義switches的時候,會定義載入到交換機的流表項文件」sN-runtime.json」。

了解大概之後,我們開始編寫basic.p4代碼:

回憶代碼要實現的功能:ip_v4轉發。我們需要完成的是tutorials中的TODO部分。

在代碼的開頭, 我們得知該代碼是P4_16版本,使用的是我們之前談到的v1_model。

通過查看main回顧v1_model:

我們要需要完成以下幾個基本的步驟,其餘部分可以暫時省略。

定義數據結構:

Parser 解析數據包

parser是一個有限狀態機。從 start 狀態開始,每一個狀態便解析一種協議,然後根據低層協議的類型欄位,選擇解析高一層協議的狀態,然後transition到該狀態解析上層協議,最後transition到accept。具體如下:

Ingress

Checksum 和 Deparser

這兩個部分都有高度抽象的內置函數直接完成:

寫好控制面代碼

雖然說官方為了讓大家專注於數據面編程,已經給好了控制面指令,但是我們有必要查看一下他們,從而有了更深入的理解, 查看 s[1,2,3]-runtime.json, 裡面定義了很多流表項。以s1-runtime.json為例, 具體的一條流表項為:

回想,table name 就是我們在p4代碼中自定義的轉發表。匹配域也依照了我們自定義的代碼。而動作也按照我們編寫的動作代碼傳入了相應的參數。將所有的流表項匯總一下, 我繪製了下面的圖片:

看到這一步,我們便瞭然了。數據面定義了轉發表,而控制面下發了具體匹配轉發的流表項,使得這三個主機可以互通。而在控制面下發的流表項與我們p4代碼中定義的流表結構息息相關。

運行代碼

丟包率為0,說明轉發功能實現了。這樣我們完成了第一個實驗。

一點建議


本文提供給大家最快捷的方式去體驗,學習和使用P4。其中有方便的虛擬機直接使用,也有真機搭建的腳本。搭建好環境並且開始第一個實驗後,大家可以自己專注於P4的學習啦。

第一次寫文章,而且限於本人能力有限。難免有紕漏或者理解不當,還望各位諒解,如果能夠給予批評指點,不勝感激!聯繫郵箱: zenhox@163.com,鄭。

【培訓

長按識別下方二維碼,立即報名

【活動

長按識別下方二維碼,立即報名

相關焦點

  • 如何快速實現C語言上手編程,福利在這裡,C語言編程的入門教程
    C語言編程如何快速實現在我們初次學習C語言的時候,總想著快速的實現編譯過程。那麼C語言編程究竟是如何實現的呢,當然是要通過自己喜歡的編譯器來編譯完成,那麼今天就為大家介紹C語言編程是如何快速的實現。首先我們下載一款適合C語言的編譯器,今天為大家講解的C語言編譯器為CodeBlocks,該編譯器沒有太過複雜,很符合初學者,簡單上手快。2. 首先雙擊打開編譯器,進入登錄選擇界面,我們選擇添加一個新項目。3.
  • 日本迷你仿真機器人,幫助「小白」快速上手編程
    為新手和孩子熟悉編程和機器人製作。只要對機器人有好奇心,也許就有令人興奮的新工具來讓一個之前的「小白」用戶來快速上手機器人編程。無論能力如何,是初學者還是高手,任何人都可以自由輕鬆地編程micro:bit中的傳感器和LED來編程機器人的動作和反應。雖然只有13釐米高和8個可動關節,但是它可以在控制下散步、跳舞、揮手等等,甚至能夠踢足球。
  • 學編程需要什麼基礎?
    正是由於這個脫節,致使編程人員待遇良好,軟體開發程師是一個前景廣闊的職業。 0基礎能學編程嗎?沒有基礎應該怎麼學? 學編程需要一定的基礎,這樣講是說明,有基礎可以快速的上手掌握。但並不是代表沒有基礎就不可以學編程。
  • 0基礎學編程需要什麼基礎?
    學編程需要一定的基礎,這樣講是說明,有基礎可以快速的上手掌握。但並不是代表沒有基礎就不可以學編程。 對於0基礎的人來講,自學是有一定難度的,沒有人引導,容易卡在某一個問題上,長久得不到進展,或者進展緩慢,最可能的結果就是從入門到放棄。0基礎學編程還是需要老師的引導,才可以快速上道。
  • 好書推薦|走向TensorFlow 2.0:深度學習應用編程快速入門
    :深度學習應用編程快速入門》是TensorFlow 2.0編程實踐的入門類書籍,目的是在TensorFlow2.0正式版發布之際能夠幫助大家快速了解其核心特性及基本編程技巧。本書通過5個常用的人工智慧編程案例,幫助大家掌握如何在工作中使用TensorFlow 2.0進行應用開發。 《走向TensorFlow 2.0:深度學習應用編程快速入門》內容覆蓋了Python和TensorFlow基礎入門、自然語言處理和CV領域的實踐案例、模型的服務化部署,希望在基於TensorFlow 2.0的人工智慧編程上能夠助你一臂之力。
  • 北大青鳥建大IT學院:0基礎學編程需要什麼基礎?
    2、邏輯思維能力的培養 學程序設計要有一定的邏輯思維能力,邏輯思維能力的培養要長時間的實踐鍛鍊。 要想成為一名優秀的程式設計師,最重要的是掌握編程思想。要做到這一點必須在反覆的實踐、觀察、分析、比較、總結中逐漸地積累。
  • Python程式設計師的聖經:《Python編程快速上手:讓繁瑣工作自動化》
    圖源:unsplashPython可謂是當今世界上最受歡迎的程式語言之一了。它簡單易懂,但功能強大,可以處理多種問題。然而現實不會一帆風順,學程式語言必須要持之以恆!Python學習者需要持之以恆,並在學習中成長。與Python有關的書有上百本,然而沒有任何一本書可以與下面這本書相媲美:《Python編程快速上手:讓繁瑣工作自動化》。學習者僅需要深入閱讀這本書。
  • 精算改革:基於編程實踐、機器學習的思考
    本文作者對外經貿大學保險學院副院長謝遠濤教授,由淺入深,從北美精算師協會、英國精算師協會實施以編程實踐、機器學習為內容的新一輪改革談起,引出如何在統計精算與機器學習中取捨,如何在代碼編程與輕代碼、無代碼編程中取捨,如何實施基於編程實踐、機器學習的精算教學等方面的思考和探討。
  • 如何快速上手任意一門程式語言?
    在開始閱讀之前,本文假設你已經掌握了至少一門程式語言,別慌,這其中的概念能夠幫助你順利開始學習第一門程式語言。我上大學的時候,我的老師曾跟我們這群新手程式設計師說過一句話,讓我記憶猶新:最難學的程式語言,是你將要學習的第二門程式語言。
  • P4與SDN的關係 P4語言典型應用解析
    二、可編程數據平面programmable data-plane(PDP)的主要特點: 1、快速開發和驗證新協議 為了支持網絡的快速演進,標準化組織不斷推出新的封裝和傳輸協議,GENEVE,NSH,VXLAN,GEP等等都是最近推出的,與此同時,數據中心也已經開始推出自己的協議用來隔離各個租戶,使其業務互相不受影響。
  • Python成為全球第二大程式語言,小白如何入手學習
    近日TIOBE公布了最新一期的程式語言排行榜(11月),這是近20年來的首次,Java和C沒有分享前兩名,雖然C語言仍舊保持第一,但Java被Python超過。
  • Qt for MCUs 快速上手實踐
    內容概要寫在開始看完Qt官方演示demo之後,您是不是也想快速上手把玩把玩Qt for MCUs?沒問題,接下來的內容就是介紹如何構建試用評估或開發環境。在開始前我們要明確自己的目的,是評估試用還是要搭建實際的項目開發環境。
  • 如何快速提高自己的編程能力
    如何快速提升自己的編碼nneg li如何快速提高自己的編程能力大家在學習完C語言之後,可能會感覺自己還是處於一個懵懂的狀態。絕大多數人都會遇到這個情況,我將向大家分享下我覺得一些能快速提升能力的方法。什麼是編程的本質首先我們需要清楚我們編程的本質是什麼,了解了它的核心就容易找到方法。我認為編程的本質就是尋找解決問題的方法,編碼就是將想法轉化為實際。我們遇到一個問題,只有當我們知道這個問題怎麼去解決的時候我們才會有寫代碼的思路。
  • 小碼王:scratch少兒編程入門怎麼學習?2個方法要記住
    1.根據孩子的特點教學編程入門相信很多爸媽都不太理解scratch少兒編程,所以在沒有很好的教學經驗,不知道如何下手,作為一個過來人建議大家可以去找關於scratch少兒編程的書籍閱讀視頻,看看scratch少兒編程入門學習視頻課程,其中有一個方面就是說如何按照孩子的興趣教學。
  • Day2:攝影+寫作,理論到實踐
    宣傳培訓班開課啦今天的課程一定是大家喜聞樂見的不僅有理論基礎還有實踐課程拍攝理論和實操課程四川文化藝術學院老師劉夢通結合示例給大家講解了日常攝影的技巧,分別從相機參數、拍攝角度、取景構圖以及相機使用方法等著重進行了教學。課後,老師給同學們布置了攝影的任務,大家都積極參與到拍攝中來。
  • RFC頻道|Hello Kitty智能教育機器人快速上手指南
    它由康力優藍出品,主要具備內容點播、智能編程和親情聊天三大應用功能,並秉承了其家族機器人的一貫風格,身體各部位採用了可拆卸的模塊化設計(雙耳和蝴蝶結還是磁吸連接 )。對於這麼萌寵的一款智能教育機器人,各位寶媽寶爸玩轉了沒有?今天門羅公園的小編撰寫了這篇操作指南,希望能夠幫助家長及孩子快速上手。
  • 《ANSYS ACT寶典》帶你快速上手仿真嚮導開發全流程
    一、ANSYS ACT概述ANSYS Application Customization Toolkit簡稱ACT,是ANSYS系列產品的統一二次開發平臺,ACT使用易於學習但功能強大的XML標記語言和IronPython程式語言,即使不是專業的編程人員,也能為仿真工作流程創建定製化的應用插件。
  • 全程實踐 培養「上手快」的幼師 - 《中國教育報》電子版 - 中國...
    然而,學前本科教育中一直存在理論學習偏多、教育實踐不足的問題,這影響了學生班級管理、活動組織、師幼互動、家園溝通等實踐能力的形成,導致他們畢業後「上手慢」、適應困難。為解決這些問題,我們於2015年開始進行「全程實踐」本科培養新模式構建和實施,探索形成了學前教育本科育人新體系。
  • 浙理學子社會實踐:助少年編程,築少年夢想
    中浙網首發(主編/王志鵬)7月14日,浙江理工大學信息學院台州實踐小隊抵達浙江大學台州研究院進行暑期社會實踐活動。本次實踐活動旨在幫助引導青少年對於人工智慧的興趣培養,並開展調研椒江地區青少年對編程的接受程度,為促進人工智慧時代下編程教育的發展提供幫助。
  • 學數控宏程序編程?這個價值巨大的方法送給你
    視頻中的波浪線零件,就是正弦曲線形狀的零件很多人一聽到數學公式就暈,什麼勾股定理,三角函數,拋物線,二次方程,正餘弦曲線,卡門曲線等數學公式都沒聽說過。 我們不是搞數學的,沒聽說過不要緊,懂不懂方程式也不牛逼,能應用方程式解決工作中的問題才牛逼。就好比開車,不懂修車,照樣開車。那麼,我直接上正玄曲線簡圖: