P4 tutorials MRI(INT)

实验说明

实验的目标是使用简化版的带内遥测(INT)扩展基本L3转发,我们称之为多跳路有检查(MRI)。
MRI可以追踪数据包转发路径和队列长度。为了支持这个功能,我们需要编写P4程序,将一个ID和队列长度添加到每个数据包的头堆栈。Switch ID的顺序相当于路径,每一个ID后面跟随着端口队列长度。
和之前的实验一样,我们已经定义好了控制平面,所以实验只需要关注P4数据平面的逻辑。
虚拟的安装使用参考:P4 Tutorial 安装

步骤一:运行(不完整)初始代码

mri.p4只是初步实现了L3转发功能,我们的任务是扩展代码,使其能够自定义支持MRI的报文头。

  1. 首先编译不完整的mri.p4,并在mininet中启动Switch。
    截图
    这一步包括:
  • 编译mri.p4,
  • 启动mininet实例的3个Switches,5个hosts,拓扑图如下:
  • 控制平面根据sx-runtime.json文件对每个Switch的tables编程。
    在这里插入图片描述
  1. 我们从h1到h2发送低速流,通过iperf从h11到h22发送高速流。在topology.json中我们设定了s1和s2之间的带宽为512kbps,这将成为转发上的瓶颈。

  2. 在mininet下打开h1,h11,h2,h22的终端:
    在这里插入图片描述

  3. h2作为server收包:
    在这里插入图片描述

  4. h22作为iperf UDP服务端:
    截图

  5. h1发送数据包到h2,每秒一个包,发送30秒:
    在这里插入图片描述

  6. h11 作为iperf UDP客户端发包15秒:
    截图

  7. 在h2,MRI header没有路径信息 (count=0)。
    在这里插入图片描述

  8. exit 退出xterm。
    我们能在h2收到消息,但是没有关于路径信息的消息。后面我们扩展mri.p4,实现MRI逻辑记录路径信息。

步骤二:实现MRI

mri.p4是一个框架,我们需要把代码中TODO部分替换。
MRI需要两个自定义header,第一:mri_t,包括count,它表示Switch ID的数目;第二:switch_t,包括Switch ID和每个途径Switch的队列长度。

实现MRI的做大挑战是处理两个headers的递归逻辑。我们将使用 parser_metadata字段,追踪需要解析的switch_t header。在parse_mri状态,这个字段设置为 hdr.mri.count。在parse_swtrace 状态,这个字段应该递减。 parse_swtrace 状态将循环直到remaining 0。
MRI自定义的header将携带在IP Option报头内。IP Option包含一个字段option,该字段指示选项类型,我们用特殊类型31表示MRI头存在。

除了parser逻辑,我们在出口添加一个table,swtrace存储Switch ID和队列长度以及增加计数的action,并追加到switch_t header。

完成mri.p4, 包括以下部分:

  1. 定义header类型 Ethernet (ethernet_t), IPv4 (ipv4_t), IP Options (ipv4_option_t), MRI (mri_t), Switch (switch_t)。
  2. 解析Ethernet, IPv4, IP Options, MRI, and Switch,parser将填充ethernet_t, ipv4_t, ipv4_option_t, mri_t, and switch_t。
  3. 使用mark_to_drop()丢弃数据包。
  4. action ipv4_forward包括:为下一跳设置出口端口,用下一跳的地址更新以太网目标地址,用交换机的地址更新以太网源地址,减少TTL。
  5. ingress control包括:定义一个table,读取IPv4目的地址,调用drop或ipv4_forward,应用table。
  6. 在egress,action add_swtrace添加Switch ID和队列长度。
  7. egress control应用swtrace table存储Switch ID和队列长度,调用add_swtrace。
  8. 逆解析器:选择字段插入到传出数据包中的顺序。
  9. package:与parser,control,checksum verification,recomputation,deparser一起提供包的实例化。

步骤三:执行解决方案

我们可以先复制出solution目录里的mri.p4,这是提前准备好的准确答案。
按照步骤一的操作,这次我们可以看到h1到h2的数据包Switch序列和丢列长度。
可以和步骤一时h2的截图做下对比。
至此实现了实时监控数据流途径节点以及节点的拥塞情况。

在这里插入图片描述
因为s1到s2的带宽瓶颈,所以s1出向会占用队列缓存。
如果有兴趣,还可以登录到s1上去调整队列缓存的最大值,再做发包测试一下。
Switch 操作命令:
登录s1:simple_switch_CLI --thrift-port 9090
设置端口3队列缓存40pkts:set_queue_depth 40 3

### 关于P4编程教程 对于希望深入了解P4编程并寻找相关教程的学习者来说,存在多种资源可以利用。当前已有的中文资料主要集中在对P4开源代码库中的tutorial部分进行流程上的描述,而较少涉及详细的网络协议及程序原理分析[^1]。 #### P4 Tutorial 库简介 有一个专门为初学者准备的快速上手系列,旨在帮助新手更高效地掌握如何使用P4编写自定义的数据平面应用程序。此系列假设读者已经熟悉了《P4: Programming Protocol-Independent Packet Processors》这篇论文的内容,因为这被认为是理解P4的基础。 #### 实验环境搭建与工具链介绍 在具体的实践中,比如`Basic Forwarding`实验案例中,所使用的组件包括但不限于: - **P4 Program**: `basic.p4` - **Compiler**: `p4c` - **Architecture Model**: V1Model - **Target Device**: BMv2 Software Switch - **Control Plane API**: P4Runtime 在这个过程中,`basic.p4`会被编译成JSON格式(`basic.json`)并通过BMv2加载至目标设备;与此同时,还会创建一个`.p4info.txt`文件来记录表项、键值和动作等信息供后续配置控制面时调用[^2]。 #### 获取更多官方文档和支持材料 除了上述提到的具体实例外,还可以访问[tutorials](https://gitcode.com/gh_mirrors/tutorials/tutorials)[^3]获取更多的练习项目和技术支持文档。这些资源不仅有助于加深对概念的理解,还能提供实际操作的机会以便更好地巩固所学知识。 此外,在完成某些特定任务之后(如编译运行P4程序),可以通过SSH连接到远程服务器来进行进一步的操作测试,并借助SFTP下载日志文件以备审查之需[^4]。 最后值得注意的是,《Makefile符号表示》这篇文章提供了有关构建过程中的自动化脚本解析,这对于想要深入研究背后机制的人来说是非常有价值的参考资料[^5]。 ```bash ssh user@remote_host cd /path/to/p4_project ./run_exercise.py --target bmv2 -- exercise basic_tutorial ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值