P4学习-1:介绍与参考资料
实验前
P4的PISA(Protocol-Independent Switch Architecture)结构:
Programmable Parser—>Programmable Match-Action Pipeline—> Programmable Deparser;
Parser作用:程序员声明应该被识别的头和它们在包中的顺序
Match-Action作用:程序员定义表和精确的处理算法
Deparser作用:程序员声明输出的包怎样输出到总线上
整个结构都是流水线架构,一个来自外部的网络数据包经过层层流程首先被Parser解析出headers,然后进入Match-Action Table进行匹配和操作,这些headsers可以被添加/修改/删除;然后进入Deparser组装好流入外部网络,因为是流水线,所以Match-Action部分是不可以回头的 ;
实验部分——文件结构:(主要参考博客)
tutorials的文件结构:
1
2
3
4tutorials/
├── exercises # 存放各种练习
├── utils # 工具脚本目录
└── vm # 用于vagrant构建虚拟机的目录,可以无视例子的文件结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 我们切换进入 exercises/basic_tunnel 这个例子
basic
├── basic_tunnel.p4 # 要编写的p4代码
├── build # 生成文件的目录
├── logs # 日志文件, 在调试的时候真的非常重要!
├── Makefile ### 通过Makefile 来调用utils下的脚本!
├── pcaps # 生成的pcap包,可以使用wireshark等工具来分析
├── README.md # 详细的指导
├── receive.py ## 利用scapy写的抓取和分析数据包的工具
├── s1-runtime.json #
├── s2-runtime.json # 在运行同时加载入交换机的控制面代码,这里有争议,稍后再谈
├── s3-runtime.json #
├── send.py ## 利用scapy写的构建和发送数据包的工具
├── solution # 这里有这个例子的示例代码(答案)
└── topology.json # 描述拓扑的json文件这部分摘自参考资料的博客,实际情况有所不同
Makefile会调用前面提到的utils下面的Makefile脚本,运行P4代码;
使用make run 启动;
调用
make run
,我们可以运行当前目录下(以basic目录为例)的代码,它将执行以下几个步骤:- 编译basic.p4 代码,生成basic.json
- 解析topology.json, 并且构建相应的mininet仿真拓扑,按照该拓扑启动一台或者多台BMv2交换机,以及一些host
- 启动BMv2的同时会将p4代码编译产生的json文件导入
- 启动BMv2后会解析 sN-runtime.json 文件(s1,s2,s3……),将其载入 交换机sN流表之中
- 进入mininet命令行,同时开始记录log以及搜集pcap文件