---
# System prepended metadata

title: P4 10
tags: [P4]

---

# P4 10 
## 龍帆軒 楊逸婷 20201130

### ECN
ECN 全名 Explicit Congestion Notification 顯式擁塞通知，是一個對IP和TCP的擴充
TCP/IP 在傳輸封包時，會在通道阻塞時丟棄封包。
如果這時候有開啟ECN功能，ECN 的 router 會在IP的 header 中設定一個標記來代替丟棄封包，以告知阻塞即將發生。
封包的接收端回應傳送端的表示，降低其傳輸速率，以避免封包遺失

#### IP 中的 ECN 操作
ECN 使用 IPv4 header或 IPv6 header 中 ToS (Type of Service) 欄位的兩個最低有效位（最右側的位編碼）來表示四個狀態：

00 – 不支援 ECN 的傳輸，非 ECT(Non ECN-Capable Transport)
10 – 支援 ECN 的傳輸，ECT(0)
01 – 支援 ECN 的傳輸，ECT(1)
11 – 發生擁塞，CE(Congestion Encountered)。

![](https://i.imgur.com/Lcl7EGw.gif)

當兩端支援 ECN 時，它將封包標為 ECT(0) 或 ECT(1)。
如果封包穿過一個遇到阻塞並且 router 支援 ECN 的 AQM 佇列，它可以將代碼更改為CE而非丟包。    
> AQM : Active queue management
> AQM常在 routers 跟 switches 使用到，為了要保持通道暢通跟降低 latency ，會將封包丟進一個 buffer 暫存

這種行為就是「標記」，其目的是通知接收端即將發生擁塞。在接收端，該擁塞指示由上層協定（傳輸層協定）處理，並且需要將訊號回傳給傳送端，以通知其降低傳輸速率。

因為 CE 指示只能由支援它的上層協定有效處理，ECN 只能配合上層協定使用。例如 TCP 協定，它支援阻塞控制並且有方法將 CE 指示回傳給傳送端。

#### TCP中的ECN

TCP header 中的三個 flag 來支援ECN。第一個 flag 是隨機和（NS），另外兩個用於回傳擁塞指示（即指示傳送者應減少資訊傳送量）和確認接收到了擁塞指示回應(ECE跟CWR)。    
> 隨機和 (Nonce Sum) : 用於防止TCP傳送者的封包標記被意外或惡意改動
> ECN-Echo（ECE） : 在 TCP 三方信號交換程序期間，TCP 對等體具備 ECN 功能
> Congestion Window Reduced（CWR） : 由傳送主機設定，指出已接到設定 ECE 旗標的 TCP 區段

當在一個 TCP 連接上 ECN 後，傳送方指示連接上的TCP packet 攜帶 IP 分組傳輸流量，將支援ECN的傳輸用ECT碼做標記。可以使支援ECN的中間 router 可以標記具有 CE 碼的 IP 分組而不是丟棄它們，以指示即將發生的阻塞。

當接收到具有遇到阻塞碼的封包時，TCP接收者使用TCP頭中的ECE標記回傳這個阻塞指示。當一個端點收到TCP帶有ECE位的 header 時，它減少其擁塞窗口來代替丟包。

![](https://i.imgur.com/gQST0QO.png)

### Firewall 

Topology : 
![](https://i.imgur.com/6iRSV0v.png)


firewall.p4需要有以下的components
1. Ethernet (ethernet_t), IPv4 (ipv4_t) and TCP (tcp_t) 的header
2. Ethernet (ethernet_t), IPv4 (ipv4_t) and TCP (tcp_t) 的parser
3. 一個action來丟丟棄封包
4. 一個action來運算bloom filter的兩個hash
5. 基本的ipv4 forwarding
6. 一個action來設置一個變數來存action的參數
7. 一個table來讀封包的ingress和egress並且使用到 6. 的action
8. 一個control用來
9. 一個deparser用來emit Ethernet (ethernet_t), IPv4 (ipv4_t) and TCP (tcp_t) 封包
10. 一個 package instantiation





要實作 Firewall 會到 bloom filter      
>Bloom filter 就是用來尋找資料有沒有存在的hash function。
>![](https://i.imgur.com/lUsQD30.png)

P4 有自己的封包傳送定義，儅封包規格符合定義，啓動action。
Make指令把Packet-processing rules 載入switch中（定義在sX-runtime）
Iperf : 一種開源網路工具用來測量網路的throughput 和performance 
![](https://i.imgur.com/xndSOlM.png)


S1 是當作firewall，所以在需要添加一個firewall.json
![](https://i.imgur.com/ti7ADXw.png)



Mark_to_drop() 用來丟棄封包

High-level approach : 此bloom filter擁有2個hash function，檢查送到internal network的封包是否建立TCP連接。在bloom filter用2個各爲32bits的reg array 更新每次hash 的結果。
![](https://i.imgur.com/06mrXWd.png)


Set_direction會建立一個1 bit的方向。如果封包來自internal network, 方向是1； 來自external 方向為0

Table check_port判斷direction，方向為1就丟入compute_hash計算
![](https://i.imgur.com/ntp2V6B.png)

//還沒看><

![](https://i.imgur.com/MPE6XfM.png)


###### tags: `P4`



