p4學習筆記-1

準備工作

在官網下載p4的虛擬機之后在virtualbox上運行

虛擬機是在https://p4.org/events/2018-06-06-p4-developer-day/里找到的

下載鏈接如下(需要翻墻)

https://drive.google.com/uc?id=1f22-DYlUV33DsR88_MeMb4s7-1NX_ams&export=download

打開虛擬機之后就可以按GitHub里的tutorials進行學習

第一個是驗證實施基本轉發(Implementing Basic Forwarding)

但是basic這個文件夾里的basic.p4文件是不完整的,運行這個原本的basic.p4沒有收到消息,因為每個交換機都是按照編程的basic.p4,它會在到達時丟棄所有數據包。需要填充以下內容(您的交換機將具有單個表,控制平面將使用靜態規則填充該表。每個規則都會將IP地址映射到下一跳的MAC地址和輸出端口。我們已經定義了控制平面規則,因此您只需要實現P4程序的數據平面邏輯。)

在solution文件夾里有一個官方提供的完整的可以參考一下的basic.p4文件。


## 官網教程

### 第1步:運行(不完整的)入門代碼

在擴展basic.p4文件之前,讓我們編譯不完整的basic.p4并在Mininet中調出一個開關來測試它的行為。

在你的shell中,運行:

```

make run

```

這會:

- 編譯basic.p4,和

- 啟動一個Mininet實例與三個開關(s1,s2,s3)以三角形構造中,每個連接到一個主機(h1,h2,和h3)。

- 該主機被分配的IP地址10.0.1.1,10.0.2.2和10.0.3.3。

您現在應該看到Mininet命令提示符。打開兩個端子h1和h2,分別為:

```

mininet > xterm h1 h2

```

每個主機都包含一個基于Python的小型消息傳遞客戶端和服務器?在h2的xterm中,啟動服務器:

```

./receive.py

```

在h1的xterm中,發送消息給h2:

```

./send.py 10.0.2.2?"P4 is cool"

```

將不會收到該消息。

鍵入exit以保留每個xterm和Mininet命令行。然后,停止mininet:

```

make stop

```

并刪除所有pcaps,構建文件和日志:

```

make clean

```

沒有收到消息,因為每個交換機都是按照編程的basic.p4,它會在到達時丟棄所有數據包。您的工作是擴展此文件,以便轉發數據包。

#### 關于控制平面的說明

P4程序定義了數據包處理流水線,但每個表中的規則都由控制平面插入。當規則與數據包匹配時,將使用控制平面提供的參數作為規則的一部分來調用其操作。

在本練習中,我們已經為您實現了控制平面邏輯。作為啟動Mininet實例的一部分,該?make run命令將在每個交換機的表中安裝數據包處理規則。這些在sX-runtime.json文件中定義,其中?X對應于交換機編號。

重要提示:我們使用P4Runtime來安裝控制平面規則。文件內容是sX-runtime.json指表,鍵和操作的特定名稱,如編譯器生成的P4Info文件中所定義(build/basic.p4info執行后查找文件make run)。添加或重命名表,鍵或操作的P4程序中的任何更改都需要反映在這些sX-runtime.json文件中。

### 第2步:實施L3轉發

該basic.p4文件包含一個骨架P4程序,其中關鍵的邏輯部分被TODO注釋替換。您的實現應遵循此文件中給出的結構---將每個TODO實現替換為實現缺失部分的邏輯。

完整basic.p4包含以下組件:

以太網(ethernet_t)和IPv4(ipv4_t)的標頭類型定義。

TODO:

- 用于填充ethernet_t和填充以太網和IPv4的解析器ipv4_t。

- 使用丟棄數據包的操作mark_to_drop()。

TODO:

- 一種行動(稱為ipv4_forward):

- 設置下一跳的出口端口。

- 使用下一跳的地址更新以太網目標地址。

- 使用交換機的地址更新以太網源地址。

- 減少TTL。

TODO:

- 一個control:定義一個表,該表將讀取IPv4目標地址,并調用其中一個drop或ipv4_forward。

- apply應用表的塊。

TODO:

- 一個deparser,用于選擇字段插入傳出數據包的順序。

- package解析器,控件和解析器提供的實例化。

通常,包還需要校驗和驗證和重新計算控制的實例。這些不是本教程所必需的,而是替換為空控件的實例化。

### 第3步:運行您的解決方案

按照步驟1中的說明進行操作。這次,您的消息?h1應該發送到h2。

**值得深思**

“測試套件”為您的解決方案---從發送消息h1到?h2---不是很強勁。您應該測試什么才能對您的實施充滿信心?

雖然Python?scapy庫超出了本教程的范圍,但它可用于生成用于測試的數據包。該send.py文件顯示了如何使用它。

其他需要考慮的問題:

您如何增強您的計劃以支持下一跳?

這個程序足以取代路由器嗎?少了什么東西?

故障排除

在開發程序時可能會出現幾個問題:

basic.p4可能無法編譯。在這種情況下,make run將報告編譯器發出的錯誤并暫停。

basic.p4可能編譯但無法支持嘗試使用P4Runtime安裝的s1-runtime.json直通s3-runtime.json文件中?的控制平面規則make run。在這種情況下,make run如果無法安裝控制平面規則,將報告錯誤。使用這些錯誤消息來修復您的basic.p4實現。

basic.p4可能會編譯,并且可能會安裝控制平面規則,但交換機可能無法以所需方式處理數據包。這些/tmp/p4s..log文件包含描述每個交換機如何處理每個數據包的詳細日志。輸出詳細,可以幫助查明實現中的邏輯錯誤。

```

clean mininet

```

在上面的后兩種情況中,make run可能會在后臺運行Mininet實例。使用以下命令清除這些實例:

```

make stop

```

## 下一步

恭喜,您的實施工作正常!在下一個練習中,我們將在此基礎上構建并添加對基本隧道協議的支持:basic_tunnel

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。