P4学习(五)实验二:Basic Tunneling

news2024/11/18 21:48:32

目录

  • 一. 实验目的
  • 二. 实验过程
    • 1. Topo
    • 2. Parse
    • 3.Ingress
  • 三. 实验结果
    • 1. 测试dst_addr = 10.0.2.2的正常包
    • 2.测试走隧道的正常包
    • 3.发给h3但是带上隧道标签的包
    • 4.测试总结
  • 四. 拓展
    • 1.table-entries里的匹配规则
    • 2.myTunnel_header.py

一. 实验目的

In this exercise, we will add support for a basic tunneling protocol to the IP router that you completed in the previous assignment. The basic switch forwards based on the destination IP address. Your jobs is to define a new header type to encapsulate the IP packet and modify the switch code, so that it instead decides the destination port using a new tunnel header


需求提取;

  1. 设计隧道
  2. 解析隧道头部 和 修改入站处理逻辑

二. 实验过程

1. Topo

在这里插入图片描述

2. Parse

在这里插入图片描述
遇到隧道标签就先交给parse_tunnel处理,标识type是0x1212(MyTunnel);

3.Ingress

在这里插入图片描述

  1. 定义处理type=0x1212的数据包转发的action,为这类数据包设定转发端口
  2. 有隧道标签就优先隧道标签,没有再去考虑ipv4_table的匹配

三. 实验结果

1. 测试dst_addr = 10.0.2.2的正常包

在这里插入图片描述

2.测试走隧道的正常包

在这里插入图片描述

3.发给h3但是带上隧道标签的包

在这里插入图片描述

4.测试总结

我们可以看到只要带上了隧道标签的数据包的type字段都被处理成0x1212(我们自定义的一个值用于标签),同时最后dst_ip为h3的但带上了隧道标签也走了隧道,证明了我们在parse里的解析逻辑是正确的。

四. 拓展

1.table-entries里的匹配规则

在这里插入图片描述
我们打开s1runtime.json里可以看到面对dst_id=2的都是会发往s1的port2,即发往h2;

2.myTunnel_header.py

为Scapy添加了对我们新的自定义头的支持。

  1. 导入 Scapy 和其他必要的模块:

    from scapy.all import *
    import sys, os
    
  2. 定义自定义协议头的 EtherType 值:

    TYPE_MYTUNNEL = 0x1212
    TYPE_IPV4 = 0x0800
    

    这里 TYPE_MYTUNNEL 代表自定义隧道协议的 EtherType,而 TYPE_IPV4 是标准的 IPv4 协议的 EtherType。

  3. 定义自定义协议头 MyTunnel

    class MyTunnel(Packet):
        name = "MyTunnel"
        fields_desc = [
            ShortField("pid", 0),
            ShortField("dst_id", 0)
        ]
    

    这个类继承自 Scapy 的 Packet 类,并定义了两个字段:piddst_id。这些字段使用 ShortField 定义,意味着它们是 16 位的数值。

  4. 定义 mysummary 方法:

    def mysummary(self):
        return self.sprintf("pid=%pid%, dst_id=%dst_id%")
    

    mysummary 方法提供了一种格式化的方式来输出 MyTunnel 头部的简要信息。

  5. 绑定层:

    bind_layers(Ether, MyTunnel, type=TYPE_MYTUNNEL)
    bind_layers(MyTunnel, IP, pid=TYPE_IPV4)
    

    这里使用 bind_layers 函数将 MyTunnel 层绑定到 Ether 层,当 Ether 类型字段是 TYPE_MYTUNNEL 时。然后将 IP 层绑定到 MyTunnel 层,当 MyTunnelpid 字段是 TYPE_IPV4 时。这样,Scapy 在解析数据包时就能根据 EtherType 值识别自定义协议头,并在需要时能够正确地解析或构造 IP 数据包。

这段代码的作用是告诉 Scapy 如何解析和处理您定义的自定义协议 MyTunnel。当 Scapy 遇到 EtherType 为 0x1212 的帧时,它会知道这个帧包含了 MyTunnel 协议头,并且会使用您提供的字段定义来解析这个头。如果 MyTunnel 头中的 pid 字段指示了一个 IPv4 数据包(0x0800),Scapy 会继续解析接下来的内容作为 IPv4 数据包。这样一来,您就能够在 Scapy 中发送、接收并处理这种自定义封装的数据包了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1396275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“一键中日文件夹名转换 - 批量修改,轻松实现中文到日语的名称翻译“

在处理大量文件夹时,你是否曾为中日文件夹名称的转换而感到困扰?现在,有了我们的批量修改工具,这些烦恼全部消失!只需简单几步,就能将中文名的文件夹名称翻译成日语,让你的文件管理更加高效。 …

最新企业数据实时同步软件推荐

实时同步软件能够帮助企业快速、准确地共享和更新数据,提高工作效率和决策质量。本文将介绍企业数据实时同步的概念、意义和应用场景,并推荐几款非常优秀的企业数据实时同步软件。 一、数据实时同步的意义 企业数据实时同步是指在企业内部或跨部门之间&…

13 STM32-随机数发生器 (RNG)

13.1 随机数发生器 (RNG)简介 RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 32 位的随机数. RNG 提供由模拟量发生器产生的 32 位随机数,两个连续随机数的间隔为 40 个 PLL48CLK 时钟信号周期 13.2 RNG框图 随机数发生器采用模拟电路…

多目标优化(Python):多目标粒子群优化算法(MOPSO)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6(提供Python代码)

一、多目标粒子群优化算法 多目标粒子群优化算法(MOPSO)是一种用于解决多目标优化问题的进化算法。它基于粒子群优化算法(PSO),通过引入多个目标函数和非支配排序来处理多目标问题。 MOPSO的基本思想是将问题转化为在…

React配置src根目录@

文章目录 1.打开webpack配置文件2.配置webpack 1.打开webpack配置文件 yarn eject or npm run eject 如果报错了记得提前 git commit一下 2.配置webpack 找到 webpack.config.js 文件在 webpack.config.js 文件中找到 alias 配置在alias里添加: path.resolve(src) , 或者 : pa…

文本按照标点符号切分符号丢掉问题

问题:文本按照标点符号切分符号丢掉问题 项目场景:需要对一个文字段落按照标点符号切分成一个个句子,使用正则切分的过程中发现标点符号丢了, 问题描述 文本按照标点符号切分符号丢掉问题 原始代码: public static v…

在分类任务中准确率(accuracy)、精确率(precision)、召回率(recall)和 F1 分数是常用的性能指标,如何在python中使用呢?

在机器学习和数据科学中,准确率(accuracy)、精确率(precision)、召回率(recall)和 F1 分数是常用的性能指标,用于评估分类模型的性能。 1. 准确率(Accuracy)…

ChatGPT Plus续费充值,到账延迟,如何申诉?

ChatGPT Plus充值总是到账延迟比较严重,一般多是通过充值链接代充值遇到,如果是账号登陆充值,是即时到账。但是有的客户不愿意提供账号密码,遇到延迟到账的情况如何解决呢?客户可按下面操作申诉,可快速到账…

大创项目推荐 深度学习花卉识别 - python 机器视觉 opencv

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &a…

Ansys Zemax | 如何使用光学制造全息图修正像差

附件下载 联系工作人员获取附件 本文介绍了利用光学全息图降低单透镜像差的方法。在描述了表示全息图构造光束的两个 ZMX 文件之后,本文演示了如何在重现文件中设置 OFH。然后解释了如何轻松地从重现文件中访问任何结构造光束变量,以实现衍射受限单透镜…

Git一台电脑 配置多个账号

Git一台电脑 配置多个账号 Git一台电脑 配置多个账号 常用的Git版本管理有 gitee github gitlab codeup ,每个都有独立账号,经常需要在一个电脑上向多个代码仓提交后者更新代码,本文以ssh 方式为例配置 1 对应账号 公私钥生成 建议&#…

canvas绘制图形

目录 1、canvas绘制矩形 2、canvas绘制线 3、canvas绘制圆 4、canvas绘制多圈动画圆 HTML5<canvas>元素用于图形的绘制&#xff0c;Canvas API主要聚焦于2D图形。 1、canvas绘制矩形 canvas是一个二维网格&#xff0c;左上角坐标为(0,0)&#xff0c;横轴为x轴&…

【Git】实习使用记录

浏览器可以访问github仓库&#xff0c;但是使用git就用不了 https://blog.csdn.net/m0_63230155/article/details/132070860 可能是git http和https代理的问题 git config --global --unset http.proxy git config --global --unset https.proxy可能之前http和https之前是…

Python实现自动化办公(使用第三方库操作Excel)

1 使用 xlrd 读取Excel数据 1.1 获取具体单元格的数据 import xlrd# 1. 打开工作簿 workbook xlrd.open_workbook("D:/Python_study_projects/Python自动化办公/Excel/test1.xlsx") # 2. 打开工作表 sheet1 workbook.sheets()[0] # 选择所有工作表中的第一个 # …

mysql数据库:迁移数据目录至另一台服务器步骤

一、概述 最近由于项目需要&#xff0c;我们需要进行数据库服务器的更换和迁移工作。迁移计划和步骤如下&#xff1a; 1、首先&#xff0c;在新的数据库服务器上进行环境的搭建和配置&#xff0c;确保数据库版本、配置等一致。 2、然后&#xff0c;将备份的数据库数据导入到…

【docker-compose】【nginx】内网环境https配置

目录 1、openssl生成自签名证书和私钥2、nginx.conf配置ssl3、docker-compose挂载 1、openssl生成自签名证书和私钥 在部署服务器上&#xff0c;新建cert目录&#xff0c;执行以下指令&#xff0c;然后生成.crt和.key文件 openssl req -newkey rsa:2048 -nodes -keyout rsa_pri…

寒假刷题-递归与递推

寒假刷题 92. 递归实现指数型枚举 解法1递归 使用递归对每一个坑位进行选择&#xff0c;每个坑位有两种选择&#xff0c;填或者不填&#xff0c;使用st数组来记录每个坑位的状态&#xff0c;u来记录已经有多少坑位有了选择。 每个坑位有2钟选择&#xff0c;n个坑位的复杂度就…

Pytest插件pytest-django让Django测试更高效

在Django应用开发中&#xff0c;测试是确保应用质量的关键环节。然而&#xff0c;Django自带的测试框架并非总能满足开发者的需求&#xff0c;而Pytest插件 pytest-django 则为我们提供了更为灵活、强大的测试工具。本文将深入介绍 pytest-django 插件的基本用法和实际案例&…

【springboot】配置文件入门

配置文件入门 配置文件最重要的目的&#xff1a;解决硬编码问题(代码写死) 我们接下来主要介绍两个方面&#xff1a;常见的配置项和配置文件的使用 SpringBoot 的配置文件,有三种格式 propertiesyamlyml(yaml的简写) 用的较多的是yml和properties文件 如果项目中,同时存在…

常用中间件漏洞

IIS6 IIS7 安装 控制面板-----打开关闭windows功能 添加角色-----添加IIS 启动之后访问localhost 复现 服务器换成IIS7 访问报错 大概就是缺少CGI模块 问题解决 添加php-cgi的路径 添加脚本映射 修改php.ini文件 将 cgi.fix_pathinfo1 然后设置一个图片 访问 在后缀加上/.…