P4 tutorials----Basic Forwarding

学习内容:

通过实验了解P4的基本转发原理。Basic Forwarding是P4 tutorials中最基础的部分。实验只是涉及到IPv4的转发,暂时不考虑checksum verification recomputation这些内容。
虚拟安装参考:P4 Tutorial 安装
在IPv4转发中,网络设备对数据包的处理逻辑分为:

  1. 更新源Mac地址、目的Mac地址;
  2. 转发每一跳时减少TTL值;
  3. 把数据包从正确的接口送出去。

关于控制平面
P4程序定义了一个包处理pipeline,控制平面给每一个table插出rules。当rule匹配数据包,就会调用action。
实验已经提前加上了必要的控制平面条目。我们只需要运行make run命令其它操作会自动完成。比如:启动mininet实例,为按照sX-runtime.json文件每个交换机table加载包处理rules。
重要提示:我们使用P4Runtime安装控制平面规则。 sX-runtime.json文件中有table、keys、actions的名称,如编译器生成的P4Info文件中定义的(执行make run后查找build/basic.P4Info文件)。P4程序中添加或重命名表、键或操作的任何更改都需要反映在这些sX-runtime.json文件中。

P4程序将针对在P4org’s bmv2软件交换机上实现的V1Model架构编写。
架构文件中关于V1Model的部分可以在/usr/local/share/p4c/p4include/v1model.p4找到。

拓扑图
在这里插入图片描述


实验步骤:

运行不完整的代码

目录里提供的是一段不完整的代码,程序启动后host之间的ping测试会失败。我们的任务就是补充代码,使host之间可以ping通。
执行sudo make run,
在这里插入图片描述
执行成功过后会进入mininet提示
在这里插入图片描述

make run 包含了编译basic.p4,启动mininet创建上面的拓扑图,给所有的switch添加table,
在这里可以看到sX-runtime.json,X代表switch编号。在执行make run后,每个switch会按照相应的sX-runtime.json添加table。
在这里插入图片描述
配置host,可以在pod-topo/topology.json里找到这些配置信息。host包含了ip、mac、arp的设置。
在这里插入图片描述
先ping 测试一下,不通就是正常的。正如上述所说此时的代码还有你的待完善。
在这里插入图片描述


L3转发

这也是实验中最核心的部分,通过把P4程序中TODO的部分替换成自己的逻辑,最终完成L3转发。
把basic.p4这个文件耐下心来一点一点看完。
首先headers部分,这里面主要是:Ethernet(ethernet_t)和IPv4(ipv4_t)包头类型定义。格式已经为我们提前定义好了,不用做修改。
在这里插入图片描述
然后是解析器paser部分,这里需要我们自己来填写逻辑。例如:首先解析以太网帧头,如etherType是0x800的再继续做ipv4解析。

在这里插入图片描述
然后是ingress processing,有两个action:action drop,action ipv4_forward。
action ipv4_forward是需要我们添加逻辑规则的,按照IPv4的转发逻辑:

  1. 有一个下一跳出接口
  2. 把以太网帧头的目的mac替换为下一跳mac
  3. 把以太网帧头的源mac替换为交换机的mac
  4. 同时还要TTL值减1
    table ipv4_lpm也需要我们留意,这是控制平面table,它的内容:1. 基于目的ip掩码最长匹配规则做action,匹配就ipv4_forward,否则就drop;2. ipv4_lpm.apply()应用 table。
    在这里插入图片描述
    最后看一下逆解析器deparser,顾名思义,就是把之前拆的包再组装回去。这里面的逻辑就是按照原先包的格式顺序就可以了
    在这里插入图片描述

代码的其它部分这次实验暂时不关注。


解决方案实施

根据上面的思路开始修改代码。
又到了一看就会一做就废的时刻了。不过对于初学者来说也不用担心在solution目录下已经有修改好的代码了,只需要照着敲就可以了。
当然也可以整个文件直接拿来替换,不过不建议这个偷懒的方法。
看一下正确答案吧!逻辑思路之前已经说过了,具体语法不太懂没关系,有些网络基础的话关键点大致应该可以看得懂。
语法改天学习一下再写篇总结!
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

修改好以后,重新执行sudo make up。
启动时其实也有很多信息值得我们一看,例如switch s1的table载入。一共载入了5条rule,1条rule是drop和4条rule分别是去往h1-h4从port1-port4出 。
在这里插入图片描述
那么s1是依据什么装载这些rule呢?可以在s1-runtime.json里一看究竟。这里只截取了部分内容,可以看见h1和h2的规则,h3和h4也是同理。
在这里插入图片描述
最后ping 测试一下,pingall 全部可以通过。
在这里插入图片描述
命令simple_switch_CLI --thrift-port 9090可以进入switch s1的CLI,9090是s1的端口号。
敲命令 table_dump MyIngress.ipv4_lpm,也能看见当前交换机的table。
在这里插入图片描述本着不破不立的思想,我们删除一条rule测试一下。
table_delete ipv4_lpm 01 后再查看table,果然编号1的rule没了。
在这里插入图片描述此时对应的h2应该是不通了,测试下,只有h2 ping不通了
在这里插入图片描述

再把删除的rule加回来,table_add ipv4_lpm ipv4_forward 10.0.2.2/32 => 08:00:00:00:02:22 2
在这里插入图片描述
ping 一下都恢复了
在这里插入图片描述


深入思考:

  • 如何提成你的程序以响应ARP请求?
  • 如何提成你的程序以支持traceroute?
  • 如何提成你的程序以支持下一跳?
  • 你的程序足以取代路由器吗?还缺少什么?

补充

sudo make stop 停止后台运行
sudo make clean 清理上次程序残留的build,log文件
每次开始运行sudo make run前,建议先执行以上两个命令把环境清理干净。

相关参考文档
P4Runtime: https://p4.org/specs/
BMv2 Simple Switch: https://github.com/p4lang/behavioral-model/blob/master/docs/simple_switch.md
v1model.p4:https://github.com/p4lang/p4c/blob/master/p4include/v1model.p4


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值