当前位置: 首页 > article >正文

用P4和BMv2在Ubuntu上快速搭建一个可编程三层交换机(附完整代码和避坑指南)

用P4和BMv2在Ubuntu上构建可编程交换机的实战指南当传统网络设备无法满足灵活的业务需求时P4语言正在重新定义网络数据平面的可能性。想象一下你可以在30分钟内将一台普通Ubuntu机器变成支持自定义转发逻辑的三层交换机——这正是P4带来的变革力量。本文将手把手带您完成从环境搭建到流量转发的全流程特别针对SDN初学者和网络开发者设计避开官方文档中那些晦涩难懂的陷阱。1. 环境准备构建P4开发基石在开始编写任何P4代码前我们需要搭建一个可靠的开发环境。不同于普通网络工具P4生态对系统依赖有着严格的要求。1.1 系统要求与依赖安装推荐使用Ubuntu 20.04 LTS及以上版本确保内核版本不低于5.4。以下是必须安装的基础组件sudo apt update sudo apt install -y \ git cmake make g python3-pip \ libboost-dev libboost-system-dev \ libboost-thread-dev libtool pkg-config特别注意如果之前尝试过安装P4相关工具失败请先执行sudo apt --purge remove p4c bmv2彻底清理旧版本。提示国内用户建议配置阿里云或清华的apt镜像源可显著提升安装速度1.2 安装P4工具链我们将通过源码编译安装P4参考编译器p4c和行为模型BMv2# 安装protobuf依赖 pip3 install protobuf3.20.1 # 克隆并编译p4c git clone --recursive https://github.com/p4lang/p4c.git mkdir p4c/build cd p4c/build cmake .. -DCMAKE_BUILD_TYPERelease make -j$(nproc) sudo make install验证安装是否成功p4c --version # 应输出类似p4c 1.2.3的版本信息BMv2的安装过程类似但需要额外注意Thrift库的版本兼容性sudo apt install -y libthrift-dev libnanomsg-dev git clone https://github.com/p4lang/behavioral-model.git cd behavioral-model ./autogen.sh ./configure --with-pi make -j$(nproc) sudo make install2. 构建三层交换机的P4程序现在进入最核心的部分——用P4语言定义交换机的转发行为。我们将实现一个支持IPv4最长前缀匹配(LPM)的三层交换机。2.1 基础头结构定义创建l3_switch.p4文件首先定义以太网和IPv4报文头结构/* -*- P4_16 -*- */ #include core.p4 #include v1model.p4 const bit16 TYPE_IPV4 0x800; header ethernet_t { macAddr_t dstAddr; macAddr_t srcAddr; bit16 etherType; } header ipv4_t { bit4 version; bit4 ihl; bit8 diffserv; bit16 totalLen; bit16 identification; bit3 flags; bit13 fragOffset; bit8 ttl; bit8 protocol; bit16 hdrChecksum; ip4Addr_t srcAddr; ip4Addr_t dstAddr; }2.2 解析器与转发逻辑实现解析器需要处理以太网帧并识别IPv4报文parser ParserImpl( packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { state start { transition parse_ethernet; } state parse_ethernet { packet.extract(hdr.ethernet); transition select(hdr.ethernet.etherType) { TYPE_IPV4: parse_ipv4; default: accept; } } state parse_ipv4 { packet.extract(hdr.ipv4); transition accept; } }转发平面使用LPM匹配目标IP地址control IngressImpl( inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { action drop() { mark_to_drop(standard_metadata); } action ipv4_forward(egressSpec_t port) { standard_metadata.egress_spec port; hdr.ipv4.ttl hdr.ipv4.ttl - 1; } table ipv4_lpm { key { hdr.ipv4.dstAddr: lpm; } actions { ipv4_forward; drop; NoAction; } size 512; default_action NoAction(); } apply { if (hdr.ipv4.isValid()) { ipv4_lpm.apply(); } } }3. 实验环境部署与测试有了P4程序后我们需要构建一个虚拟网络环境来验证转发逻辑。3.1 创建虚拟网络接口使用veth pair模拟物理端口#!/bin/bash for i in {0..2}; do sudo ip link add name veth$((i*2)) type veth peer name veth$((i*21)) sudo ip link set dev veth$((i*2)) up sudo ip link set dev veth$((i*21)) up sudo sysctl -w net.ipv6.conf.veth$((i*2)).disable_ipv61 sudo sysctl -w net.ipv6.conf.veth$((i*21)).disable_ipv61 done关键点禁用IPv6可以避免测试时的干扰这是实际部署中经常忽略的细节。3.2 启动BMv2交换机编译P4程序并启动simple_switchp4c -b bmv2 --p4runtime-files l3_switch.p4info.txt -o build l3_switch.p4 sudo simple_switch \ --interface 0veth0 \ --interface 1veth2 \ --interface 2veth4 \ build/l3_switch.json注意如果遇到端口绑定失败尝试先执行sudo rm -f /tmp/bmv2-*-notifications.ipc3.3 配置转发规则通过CLI添加三条测试路由simple_switch_CLI EOF table_add ipv4_lpm ipv4_forward 10.0.0.0/8 0 table_add ipv4_lpm ipv4_forward 20.0.0.0/8 1 table_add ipv4_lpm ipv4_forward 30.0.0.0/8 2 EOF验证规则是否生效simple_switch_CLI EOF table_dump ipv4_lpm EOF4. 高级调试与性能优化当基础功能正常工作后我们需要关注如何提升开发效率和转发性能。4.1 使用P4Runtime进行动态控制静态配置适合测试但生产环境需要动态控制平面。安装P4Runtime Python库pip3 install p4runtime1.3.0示例代码片段展示如何通过编程方式添加路由import p4runtime_sh.shell as sh conn sh.P4RuntimeClient(localhost:9559) conn.set_fwd_pipe_config(build/l3_switch.p4info.txt, build/l3_switch.json) te conn.TableEntry(IngressImpl.ipv4_lpm)(actionIngressImpl.ipv4_forward) te.match[hdr.ipv4.dstAddr] (10.0.0.0, 8) te.action[port] 0 te.insert()4.2 性能调优技巧BMv2作为参考模型性能有限但以下方法可以提升实验效率启用JIT加速sudo simple_switch --jit --interface 0veth0 ...调整日志级别减少开销sudo simple_switch --log-console --log-level warn ...使用性能分析工具sudo perf stat -d simple_switch ...5. 真实场景问题排查在实际部署中开发者常会遇到以下几类问题问题1编译时报undefined symbol错误解决方案这通常是版本不匹配导致尝试sudo ldconfig export LD_LIBRARY_PATH/usr/local/lib:$LD_LIBRARY_PATH问题2报文被意外丢弃检查顺序确认P4程序中的isValid()判断条件检查控制平面是否正确添加规则使用--log-level debug查看处理过程问题3TTL递减导致校验和错误需要在egress阶段重新计算校验和control ComputeChecksumImpl(inout headers hdr) { apply { update_checksum( hdr.ipv4.isValid(), { hdr.ipv4.version, ..., hdr.ipv4.dstAddr }, hdr.ipv4.hdrChecksum, HashAlgorithm.csum16); } }在完成所有测试后建议将工作环境容器化以便复用。这里提供一个Dockerfile片段FROM ubuntu:20.04 RUN apt update apt install -y git cmake python3-pip RUN pip3 install protobuf3.20.1 WORKDIR /p4 RUN git clone https://github.com/p4lang/p4c \ cd p4c mkdir build cd build \ cmake .. make -j4 make install

相关文章:

用P4和BMv2在Ubuntu上快速搭建一个可编程三层交换机(附完整代码和避坑指南)

用P4和BMv2在Ubuntu上构建可编程交换机的实战指南 当传统网络设备无法满足灵活的业务需求时,P4语言正在重新定义网络数据平面的可能性。想象一下,你可以在30分钟内将一台普通Ubuntu机器变成支持自定义转发逻辑的三层交换机——这正是P4带来的变革力量。本…...

Python-json-logger集成指南:Django、Flask等框架中的终极使用教程

Python-json-logger集成指南:Django、Flask等框架中的终极使用教程 【免费下载链接】python-json-logger Json Formatter for the standard python logger 项目地址: https://gitcode.com/gh_mirrors/py/python-json-logger Python-json-logger是一个强大的J…...

项目实战 (10)---后台搜索Cache优化

目录 背景 技术实现策略 视频预处理阶段的cache技术 视频搜索阶段的cache技术 技术实现 预处理阶段cache策略实现 逻辑 代码 运行结果 问题及注意点 搜索阶段cache策略实现 系统配置层面 逻辑 低版本 GPU CPU 本项目的配置 高版本 描述 go ahead 策略 cac…...

颠覆性AI 3D建模:Zoo Text-to-CAD技术将设计效率提升10倍

颠覆性AI 3D建模:Zoo Text-to-CAD技术将设计效率提升10倍 【免费下载链接】text-to-cad-ui A lightweight UI for interacting with the Zoo Text-to-CAD API. 项目地址: https://gitcode.com/gh_mirrors/te/text-to-cad-ui 在机械设计与工程制造领域&#x…...

终极指南:如何用Mousecape轻松定制macOS鼠标指针,打造个性化桌面体验

终极指南:如何用Mousecape轻松定制macOS鼠标指针,打造个性化桌面体验 【免费下载链接】Mousecape Cursor Manager for OSX 项目地址: https://gitcode.com/gh_mirrors/mo/Mousecape 厌倦了macOS系统千篇一律的白色鼠标指针?想要为你的…...

深度解析Clarity AI超分辨率架构:从算法原理到实战优化指南

深度解析Clarity AI超分辨率架构:从算法原理到实战优化指南 【免费下载链接】clarity-upscaler Clarity AI | AI Image Upscaler & Enhancer - free and open-source Magnific Alternative 项目地址: https://gitcode.com/GitHub_Trending/cl/clarity-upscale…...

AI嵌入式系统测试:融合经典方法与数据驱动验证的工程实践

1. 项目概述:当嵌入式遇见AI,测试的“变”与“不变”干了十几年嵌入式,从8位单片机玩到多核异构处理器,从裸机编程干到复杂的RTOS,我原以为测试这件事,左不过就是单元测试、集成测试、系统测试那几板斧&…...

实战揭秘:Obsidian加州海岸主题如何将macOS美学融入笔记生产力革命

实战揭秘:Obsidian加州海岸主题如何将macOS美学融入笔记生产力革命 【免费下载链接】obsidian-california-coast-theme A minimalist obsidian theme inspired by macOS Big Sur 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-california-coast-theme …...

如何高效获得GitHub社区认可:开发者的3个实用徽章获取策略

如何高效获得GitHub社区认可:开发者的3个实用徽章获取策略 【免费下载链接】community Public feedback discussions for: GitHub Mobile, GitHub Discussions, GitHub Codespaces, GitHub Sponsors, GitHub Issues and more! 项目地址: https://gitcode.com/gh_m…...

3步解锁iOS应用自由:AltStore免越狱安装终极指南

3步解锁iOS应用自由:AltStore免越狱安装终极指南 【免费下载链接】AltStore AltStore is an alternative app store for non-jailbroken iOS devices. 项目地址: https://gitcode.com/gh_mirrors/al/AltStore 还在为iOS设备上无法自由安装应用而烦恼吗&#…...

告别枯燥例程:用STM32F4的CAN总线做个简易‘聊天室’(附代码)

用STM32F4的CAN总线打造趣味聊天室:从零实现双向文本通信 当两块STM32开发板通过CAN总线互相发送"Hello World"时,LED灯闪烁的瞬间往往比教科书上的协议框图更让人记忆深刻。这个项目将带您用两片价值不到百元的STM32F4开发板(或一…...

别再死记硬背了!用‘榨汁机’和‘张三的饭量’搞定高数函数定义域(附3类题型解法)

用生活化思维破解高数函数定义域:从榨汁机到张三的饭量 第一次翻开高等数学教材时,那些密密麻麻的函数符号让我头晕目眩。直到有一天,我在厨房榨果汁时突然顿悟——原来函数就像一台榨汁机,而定义域不过是张三在不同状态下的饭量。…...

别再死记硬背了!用一张图帮你彻底搞懂FC协议栈(从FC-0到FC-4)

用视觉化思维拆解FC协议栈:从物理层到应用层的全景指南 当你第一次接触光纤通道(FC)协议时,那些从FC-0到FC-4的层级、各种端口类型和封装结构是否让你感到头晕目眩?别担心,这篇文章将用全新的视觉化方法&am…...

Zabbix监控华为防火墙丢包?可能是你的SNMP v2c配置没做对(附Python巡检脚本)

Zabbix监控华为防火墙丢包问题的深度排查与自动化解决方案 当Zabbix监控华为防火墙时出现丢包或数据异常,很多工程师的第一反应是检查网络连通性或Zabbix服务器配置,却忽略了防火墙自身SNMP v2c与安全策略的联动机制。本文将揭示这一常见误区的技术根源&…...

不止是部署:深入webrtc-streamer容器,聊聊WebRTC网关的配置、监控与生产环境实践

不止是部署:深入webrtc-streamer容器,聊聊WebRTC网关的配置、监控与生产环境实践 当你已经成功运行了基础版的webrtc-streamer容器,看着浏览器里跳动的视频流,那种成就感不言而喻。但很快你会发现,这仅仅是WebRTC世界的…...

AI Agent Harness Engineering 的安全与伦理挑战:我们如何控制所创造之物?

AI Agent Harness Engineering 的安全与伦理挑战:我们如何控制所创造之物? 关键词:AI Agent 治理、Harness Engineering、对齐问题、灾难性遗忘、人类反馈强化学习、鲁棒性、责任归属 摘要:当我们把AI从“只会做一件事的工具人”升…...

VBO协议

VBO...

用GEE和Landsat 8数据,5步搞定城市生态健康“体检报告”(附完整代码)

城市生态健康体检实战:用GEE和Landsat 8生成可视化评估报告 城市规划师和环保工作者常常需要快速评估城市生态状况,但传统方法耗时费力。Google Earth Engine(GEE)平台结合Landsat 8数据,为我们提供了一种高效解决方案…...

文渊智阁:教育智能化的技术革新与实践

在人工智能技术飞速发展的今天,教育智能化已成为推动科研与教学变革的重要力量。湖北文渊智阁互联网科技有限公司(以下简称“文渊智阁”)凭借其深厚的技术积累和创新能力,在教育智能化领域取得了显著成果。本文将深入探讨文渊智阁…...

CANN/asc-devkit SIMT数学函数erfinvf

erfinvf 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/ca…...

cimgui生成器完全解析:从Lua脚本到C接口的魔法转换 [特殊字符]

cimgui生成器完全解析:从Lua脚本到C接口的魔法转换 🎯 【免费下载链接】cimgui c-api for imgui (https://github.com/ocornut/imgui) Look at: https://github.com/cimgui for other widgets 项目地址: https://gitcode.com/gh_mirrors/ci/cimgui …...

如何快速实现swagger-jsdoc与TypeScript的完美集成:完整指南

如何快速实现swagger-jsdoc与TypeScript的完美集成:完整指南 【免费下载链接】swagger-jsdoc Generates swagger/openapi specification based on jsDoc comments and YAML files. 项目地址: https://gitcode.com/gh_mirrors/sw/swagger-jsdoc 在现代化的API…...

Hertz.dev未来展望:音频AI技术的演进路线与发展趋势

Hertz.dev未来展望:音频AI技术的演进路线与发展趋势 【免费下载链接】hertz-dev first base model for full-duplex conversational audio 项目地址: https://gitcode.com/gh_mirrors/he/hertz-dev Hertz-dev作为开源的全双工对话音频基础模型,正…...

curtains.js数学工具详解:Vec2、Vec3、Mat4和Quat的使用方法

curtains.js数学工具详解:Vec2、Vec3、Mat4和Quat的使用方法 【免费下载链接】curtainsjs curtains.js is a lightweight vanilla WebGL javascript library that turns HTML DOM elements into interactive textured planes. 项目地址: https://gitcode.com/gh_m…...

Vue-clipboard2 错误处理指南:如何优雅处理复制失败情况

Vue-clipboard2 错误处理指南:如何优雅处理复制失败情况 【免费下载链接】vue-clipboard2 A simple vue2 binding to clipboard.js 项目地址: https://gitcode.com/gh_mirrors/vu/vue-clipboard2 Vue-clipboard2 是一款简单的 Vue2 绑定 clipboard.js 的插件…...

NovelReader插件化扩展指南:如何添加新的翻页效果

NovelReader插件化扩展指南:如何添加新的翻页效果 【免费下载链接】NovelReader 仿照"任阅"的追书、看书的小说阅读器。重写"任阅"的代码,优化代码逻辑和代码结构,降低内存使用率。重写小说阅读器,支持网络阅…...

用STM32F103C8T6给小车装上‘眼睛’:HC-SR04超声波+SG90舵机云台避障保姆级教程

用STM32F103C8T6打造智能小车感知系统:超声波与舵机云台的深度整合实战 在嵌入式系统开发领域,赋予机器"感知-决策-执行"的能力是一个令人着迷的课题。当我们把目光投向智能小车这个经典平台时,如何让它像生物一样具备环境感知能力…...

Hertz.dev多模态应用探索:结合WebRTC的浏览器端音频处理

Hertz.dev多模态应用探索:结合WebRTC的浏览器端音频处理 【免费下载链接】hertz-dev first base model for full-duplex conversational audio 项目地址: https://gitcode.com/gh_mirrors/he/hertz-dev Hertz-dev是一款开源的全双工对话音频基础模型&#xf…...

玩具可以多,父母的专心陪伴也千万别少

现在的孩子不缺玩具。很多家庭的客厅里,积木、遥控车、电动狗堆得满满当当。孩子坐在地上,周围一圈都是玩具,但他玩不了多久就扔下这个拿起那个,嘴里还喊着“妈妈你看我”。这个时候他需要的可能不是新玩具,而是你放下…...

PHP Intelephense与Composer依赖管理:提升PHP开发效率的终极指南

PHP Intelephense与Composer依赖管理:提升PHP开发效率的终极指南 【免费下载链接】vscode-intelephense PHP intellisense for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-intelephense 在PHP开发中,PHP Intelephen…...