P4设计实现链路监控
实验要求
- 在本次实验中,目的是编写一个P4程序,使主机能够监控网络中所有链路的使用情况
- 本练习基于基本的IPv4转发练习,因此请确保在尝试此练习之前完成此练习(basic.p4)
- 具体来说,我们将修改基本P4程序以处理源路由探测包,以便它能够在每个跳处获取出口链路利用率,并将其传递给主机以进行监控。
实验内容
Step1:设计包头
1.为了获取包经过了多少跳,定义了一个包头 probe_t
header probe_t {bit<8> hop_cnt; }
2.在每一跳的过程中,收集我们想要的信息,比如交换机的端口号,进出时间等
header probe_data_t {bit<1> bos;bit<7> swid;bit<8> port;bit<32> byte_cnt;time_t last_time;time_t cur_time; }
3.指定交换机应该将这个探测包发往哪里,保证了探测包的确定性转发路径
header probe_fwd_t {bit<8> egress_spec; }
包头的总体结构如下,但是实际的包头结构要么是ipv4包要么是探测包
struct headers {ethernet_t ethernet;ipv4_t ipv4;probe_t probe;probe_data_t[MAX_HOPS] probe_data;probe_fwd_t[MAX_HOPS] probe_fwd; }
Step2: 设计两个寄存器
`byte_cnt_reg` :统计自最后一个探测数据包从端口发送出去以来从每个端口发送出去的字节数。
`last_time_reg`:存储上一个探测包从端口出去的最后时间
Step3: 对照实验
先把没有完善的p4代码编译并载入交换机创建mininet运行一下,我打开同一个主机的两个终端,一个发送数据包,一个接收数据包,至于数据包的发送原理,就是简单的python网络编程提及的东西,我在以后放在java网络编程一块讲。
可以看到,接收端收到的域都是0,并没有提现任何信息,这是因为我的监测模块还没实现
Step4: 控制面逻辑
控制面逻辑的json主要包含4个元素,分别是p4目标,也就是底层实现,以及p4info,这是p4文件编译后生成的信息文件,还有bmv2_json指的是p4文件编译后的json,最后一个是table_entires,描述了table里面每一个键值对,注意到,和以往不同的是,这里有Egress控制流的表了(swid)
{"target": "bmv2","p4info": "build/link_monitor.p4.p4info.txt","bmv2_json": "build/link_monitor.json","table_entries": [{"table": "MyEgress.swid","default_action": true,"action_name": "MyEgress.set_swid","action_params": {"swid": 2}},{"table": "MyIngress.ipv4_lpm","default_action": true,"action_name": "MyIngress.drop","action_params": { }},{"table": "MyIngress.ipv4_lpm","match": {"hdr.ipv4.dstAddr": ["10.0.1.1", 32]},"action_name": "MyIngress.ipv4_forward","action_params": {"dstAddr": "08:00:00:00:03:00","port": 4}},{"table": "MyIngress.ipv4_lpm","match": {"hdr.ipv4.dstAddr": ["10.0.2.2", 32]},"action_name": "MyIngress.ipv4_forward","action_params": {"dstAddr": "08:00:00:00:04:00","port": 3}},{"table": "MyIngress.ipv4_lpm","match": {"hdr.ipv4.dstAddr": ["10.0.3.3", 32]},"action_name": "MyIngress.ipv4_forward","action_params": {"dstAddr": "08:00:00:00:03:33","port": 1}},{"table": "MyIngress.ipv4_lpm","match": {"hdr.ipv4.dstAddr": ["10.0.4.4", 32]},"action_name": "MyIngress.ipv4_forward","action_params": {"dstAddr": "08:00:00:00:04:44","port": 2}}] }
Step5:数据平面逻辑设计(解析器)
解析器设计,我们先要解析这些包,在设计解析器逻辑的时候,可以看出:
- 我们的包要么是普通的ipv4包,要么是探测包
- 探测包经历的跳数被赋值给了 meta.parser_metadata.remaining也就是元数据中的解析器剩余要解析的探测信息
- 如果已经剥开到第0条的数据了,那就解析它的转发包头,这里注意,next指针指向当前的包的转发包头的数组的当前位置,每次调用完都会指向下一个,last指的是上一次提取出来的包头信息,指的就是上一次next指示的东西。如果解析到remaining=0就accept
- 如果剥开还不是第0条,就去循环剥开它的探测包的data,知道bos=1也就是剥到了最后一个probe_data的包头了,就去剥fwd包头,这个时候就不用去设置什么bos了,因为fwd每次循环剥开就倒扣remaining就可以了,(那为啥不在data包头就扣掉呢?因为这个remaining要在fwd用,先用了话就是0了,根本不会解析fwd包头,那如果再设置一个remaing来剥开这个data包头不就好了。。。这样还可以节省一个bos位
P4设计实现链路监控相关推荐
- cat全链路监控_谛听全链路监控平台实践与思考
一.项目背景 近几年,信也科技的研发技术伴随着业务的快速增长逐步演化为微服务化的分布式体系架构,但随之带来的系统间的上下游依赖关系的复杂度也呈指数级上升,已有的烟囱式的监控产品(CAT.ELK等)存在 ...
- [Stardust]星尘分布式全链路监控
随着业务的发展,微服务系统会变得越来越大,各个服务之间的调用关系也会日趋复杂.一个WebApi请求,后方可能经历多个微服务以及数据库和MQ操作,在这个调用过程中,可能因为某一个服务节点出现延迟或者失败 ...
- 云网络的守护神:主动链路监控
摘要:华为云Stack主动链路监控技术,构建整个网络服务监控系统,故障发现时间从不确定走向确定,故障定界定位时间从小时级变成分钟级. 本文分享自华为云社区<[华为云Stack][大架光临]第3期 ...
- 全链路监控Jaeger
全链路监控Jaeger 目录 全链路监控Jaeger Jaeger为何物? 分布式追踪系统核心步骤 Jaeger系统 Jagger优点 Jaeger架构 Jaeger组件介绍 Span Jaeger特 ...
- cat全链路监控_CAT分布式监控系统(一):CAT功能介绍 CAT监控系统是什么、能做什么?...
CAT分布式监控系统(一):CAT监控系统功能介绍 本文概要: 1.CAT监控系统是什么. 2.CAT监控系统能做什么,能监控些什么. 下面有些截图是CAT 2.0版本的,但和3.0版本没什么区别的. ...
- spring cloud gateway网关和链路监控
文章目录 目录 文章目录 前言 一.网关 1.1 gateway介绍 1.2 如何使用gateway 1.3 网关优化 1.4自定义断言和过滤器 1.4.1 自定义断言 二.Sleuth--链路追踪 ...
- ELK 系列八、全链路监控
一.简介 写这篇文章的出发点是总结这一段时间工作之全链路监控实施过程的重点配置,整体架构和具体细节都由本人完成,以下的配置的是研究时候搭建的,本篇侧重数据采集和入库和查询展现.全链路有很多方式,我这边 ...
- 全链路监控分析实战(一)
面试问题: 1.你们的监控方案怎么设计的?如何分析定位响应时间慢的问题? 2.线程阻塞.压力上不去.内存泄漏的问题你是怎么定位的? 这个最常见的问题,很少有回答让面试官满意的,来吧,这里给你答案. 这 ...
- 专为云原生、微服务架构而设计的链路追踪工具 【SkyWalking介绍及搭建】
文章目录 前言. 当前企业级分布式微服务集群架构图 一. skywalking是什么 二. 为什么需要服务追踪 三 链路追踪框架对比 3.1 性能对比 四. 链路追踪的实际应用预览 4.1 捋清业务 ...
最新文章
- 公司各个阶段 CTO 需要做什么?(下篇)
- 21天的你长这样?剑桥博士小姐姐研究「人造胚胎」,2篇Nature到手
- SpringBoot+Redis环境搭建
- windows SOCKET编程
- php操作mysql的封装类_PHP封装的mysqli数据库操作类示例
- 自监督学习新思路!基于蒸馏(distillation loss)的自监督学习算法
- python mysql library popular_python之mysql入门详解(四)
- JavaFX 2 GameTutorial第1部分
- day8-异常处理与网络编程
- python为什么不会溢出_深入分析python中整型不会溢出问题
- 华为读取版本exe_关于esrv_svc.exe和SurSvc.exe疑似泄露用户信息的猜测
- 表单内如何直接贴图而不用上传图片_重磅更新|偷偷告诉你,表单大师官网改版啦啦啦啦...
- PostgreSql Lock锁
- 当他不再爱你的时候(男女生一定要看)
- 初识SaltStack
- 小米 samba linux,U-BOOT移植准备之(一)Samba服务器
- quarkus-contexts和DI介绍(原理)
- springboot配置文件为yml格式详解
- IO前哨站之##File##
- 使用企业微信做微信消息通知
热门文章