【P4lang】P4数据平面编程实验basic_tunnel

实验环境

P4官方虚拟机

实验过程

参考实验

官方实验的basic_tunnel

1. cd进入实验中

在这里插入图片描述

2. 补充basic_tunnel.p4

PARSE部分

 state parse_myTunnel {
        packet.extract(hdr.myTunnel);
        transition select(hdr.myTunnel.proto_id) {
            TYPE_IPV4: parse_ipv4;
            default: accept;
        }
 }

在这里插入图片描述

INGRESS PROCESSING部分

action myTunnel_forward(egressSpec_t port) {
        standard_metadata.egress_spec = port;
    }

    table myTunnel_exact {
        key = {
            hdr.myTunnel.dst_id: exact;
        }
        actions = {
            myTunnel_forward;
            drop;
        }
        size = 1024;
        default_action = drop();
    }

    apply {
        if (hdr.ipv4.isValid() && !hdr.myTunnel.isValid()) {
            // Process only non-tunneled IPv4 packets
            ipv4_lpm.apply();
        }

        if (hdr.myTunnel.isValid()) {
            // process tunneled packets
            myTunnel_exact.apply();
        }
    }

在这里插入图片描述

DEPARSER部分

packet.emit(hdr.myTunnel);

在这里插入图片描述

3. make run

成功运行截图
在这里插入图片描述

❎Error:缺少第二步直接make run失败报错

make run报错截图
在这里插入图片描述

原因:查看basic_tunnel.p4内的MyIngress部分函数为补充完整(第二步),或者直接选择solution内的p4文件进行替换,重新make run

4. mininet进入成功, 连通性测试

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

5. 实现IPV4隧道转发

输入xterm h1 h2 h3 打开多个结点进行连通测试
在这里插入图片描述

测试1:无隧道的转发测试

在h1终端输入 ./send.py 10.0.2.2 “p4”
在h2终端输入 ./receive.py
在这里插入图片描述
测试结果:h1 send h2成功

测试2:隧道转发测试

在h1终端输入 ./send.py 10.0.2.2 “p4is here” --dst_id 2
在h2终端输入 ./receive.py

在这里插入图片描述
测试结果:h1 send h2成功

6. 退出

mininet> exit

make可能会留下在后台运行的Mininet实例。使用这些命令清除以下实例。

make stop
make clean

知识点

在这里插入图片描述

1. mininet是什么?

参考资料:Mininet介绍 - 简书 (jianshu.com)

Mininet是由一些虚拟的终端节点(end-hosts)、交换机、路由器连接而成的一个网络仿真器,它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美。
Mininet可以很方便地创建一个支持SDN的网络:host就像真实的电脑一样工作,可以使用ssh登录,启动应用程序,程序可以向以太网端口发送数 据包,数据包会被交换机、路由器接收并处理。有了这个网络,就可以灵活地为网络添加新的功能并进行相关测试,然后轻松部署到真实的硬件环境中。

2. xterm是什么?

XTerm是一个X Window System上的终端模拟器,用来提供多个独立的SHELL输入输出。

3. 官方的实验教程翻译

前言

在本练习中,我们将为您在上一次任务中完成的IP路由器添加对基本隧道协议的支持。基本交换机根据目标IP地址进行转发。您的工作是定义一个新的报头类型来封装IP数据包并修改交换机代码,以便它使用新的隧道报头来决定目标端口。
新的报头类型将包含一个协议ID,它表示被封装的报文的类型,以及用于路由的目的地ID。

剧透警告:solution子目录中有一个参考解决方案。请随意将您的实现与引用进行比较。

此任务的初始代码位于一个名为 basic_tunnel.p4 的文件中,是前面的练习中 IP 路由器的简单解决方案。

关于控制平面的说明

P4程序定义了数据包处理流水线,但每个表中的规则由控制平面插入。当规则与数据包匹配时,它的操作被控制平面提供的参数作为规则的一部分调用。

对于本练习,我们已经添加了必要的静态控制平面表项。作为启动Mininet实例的一部分,make run命令将在每个交换机的表中安装数据包处理规则,这些规则是在sX-runtime.json文件中定义,其中X对应于交换机编号。

由于控制平面尝试访问myTunnel_exact表,并且该表尚不存在,因此make run命令不适用于初始代码。

重要:我们使用 P4Runtime 来安装控制平面规则。sX-runtime.json 文件的内容引用由编译器生成的 P4Info 文件中定义的表、键和操作的特定名称(在执行 make run 之后查找文件 build/basic.p4pnfo)。P4程序中添加或重命名表、键或操作的任何更改都需要反映在这些 sX-runtime.json文件中。

Step 1: 实现基本隧道

basic_tunnel.p4文件包含一个基本IP路由器的实现。它还包含用TODO标记的注释,这些注释指出了您需要实现的功能。一个basic_tunnel.p4的完整实现能使交换机可以根据自定义封装头的内容进行转发,如果报文中不存在封装头,也可以进行正常的IP转发。

你的工作如下:

  1. NOTE: 添加了一个名为myTunnel_t的新报头类型,它包含两个16位字段:proto_id和dst_id。
  2. NOTE: myTunnel _ t 报头已添加到报头结构中。
  3. TODO: 更新解析器(parser)以根据以太网报头中的etherType字段提取myTunnel报头或ipv4报头。myTunnel报头对应的etherType为0x1212。如果proto_id == TYPE_IPV4(即0x0800),解析器还应该提取myTunnel头之后的ipv4头。
  4. TODO: 定义一个名为myTunnel_forward的新动作,它简单地将出口端口(即standard_metadata总线的egress_spec字段)设置为控制平面提供的端口号。
  5. TODO: 如果myTunnel报头是有效的,更新MyIngress控制块中的apply语句来应用你新定义的myTunnel_exact表。否则,如果ipv4报头有效,则调用ipv4_lpm表。
  6. TODO: 更新分离器(deparser)以发出以太网,然后是myTunnel,然后是ipv4头。请记住,分离器只会发出有效的头文件。报头的隐式有效性位在提取时由解析器设置。所以这里不需要检查报头的有效性。
  7. TODO: 为新定义的表添加静态规则,以便交换机将正确地转发dst_id的每个可能值。查看下面的图,了解拓扑的端口配置以及我们将如何为主机分配id。对于这一步,您需要将转发规则添加到sx-runtime.json文件。

在这里插入图片描述

Step 2: 运行你的代码

  1. 在你的shell运行
    make run
    

这一步运行包括:

  • 编译basic_tunnel.p4
  • 启动Mininet实例,其中三个交换机(s1、s2、s3)配置成三角形,每个交换机连接到一个主机(h1、h2和h3)。
  • 主机的ip地址分别为10.0.1.1、10.0.2.2和10.0.3.3。
  1. 你现在应该看到一个Mininet命令提示符。分别打开h1和h2两个终端:

    mininet> xterm h1 h2
    
  2. 每个主机都包括一个小型的基于Python的消息传递客户端和服务器。在h2的xterm中,启动服务器:

    ./receive.py
    
  3. 首先,我们将在没有隧道的情况下进行测试。在h1的xterm中,发送一个消息给h2:

    ./send.py 10.0.2.2 "P4 is cool"
    
  4. 数据包应该在h2收到。如果您检查收到的数据包,您应该看到它由一个以太网报头、一个IP报头、一个TCP报头和消息组成。如果你改变了目的IP地址(例如尝试发送到10.0.3.3),那么h2不会接收到该消息,而是会接收到h3。5.现在我们用隧道法进行测试。在h1的xterm中,发送一个消息给h2:

    ./send.py 10.0.2.2 "P4 is cool" --dst_id 2
    
  5. 数据包应该在h2收到。如果您检查收到的数据包,您应该看到它由一个以太网报头、一个隧道报头、一个IP报头、一个TCP报头和消息组成。

  6. 在h1的xterm中,发送一个消息:

    ./send.py 10.0.3.3 "P4 is cool" --dst_id 2
    
  7. 数据包应该在h2接收,即使该IP地址是h3的地址。这是因为当报文中有MyTunnel报头时,交换机不再使用IP报头进行路由。

  8. 键入exit或Ctrl-D以离开每个xterm和Mininet命令行。

PythonScapy本身不支持myTunnel头类型,所以我们提供了一个名为myTunnel_header.py的文件,它为我们的新自定义头添加了对Scapy的支持。如果您有兴趣了解如何这样做,请随意检查这个文件。

4. 隧道是什么?

参考资料:https://blog.csdn.net/Fly_hps/article/details/80626636

隧道技术(Tunneling)是一类网络协议,它是一种数据包封装技术,它将原始IP包(其报头包含原始发送者和最终目的地)封装在另外一个数据包(称为封装的IP包)的数据净荷中进行传输。使用隧道的原因是在不兼容的网络上传输数据,或在不安全网络上提供一个安全路径。


参考资料

实验8:数据平面可编程实践——P4 - bae-z - 博客园 (cnblogs.com)
p4-env: 在Ubuntu上快速搭建P4实验环境 (gitee.com)

好库,可以细看一下。从实验环境配置到该实验手把手教学

p4学习笔记-1 - 简书 (jianshu.com)
p4学习笔记-2 - 简书 (jianshu.com)

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zoetu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值