INT规格详解:2016年P4示例与网络监控功能

需积分: 9 1 下载量 88 浏览量 更新于2024-07-18 收藏 544KB PDF 举报
INT(In-Band Network Telemetry)是一种创新的网络监控框架,它允许数据平面在无需控制平面干预的情况下收集并报告网络状态。P4示例展示了如何在现代网络设备,如P4架构的交换机上实现INT,以支持基本的网络测量功能,这在软件定义网络(SDN)环境中显得尤为重要。 INT的核心理念在于将网络监控功能内置到数据包转发过程中,通过特定的元数据字段(INT headers)来传递和执行监控指令。这些字段由INT兼容的设备解析,指示应收集哪些信息,如开关级状态、入站流量、出站流量、缓冲区信息等,并将其写入数据包以便于实时监控。 在INT架构中,关注的监控点包括但不限于: 1. **Switch-level Information**:收集关于交换机硬件、软件状态、配置以及运行状况的基础信息,有助于维护和优化网络性能。 2. **Ingress Information**:记录进入网络的数据包的源地址、协议类型、负载等,有助于检测网络流量模式和安全威胁。 3. **Egress Information**:监控数据包的出站方向,包括目标地址、处理路径、延迟等,帮助调整路由策略和性能优化。 4. **Buffer Information**:检测和分析数据包在转发过程中的临时存储情况,这对于网络拥塞管理和流量调度至关重要。 5. **Processing INT Headers**:INT头包含了执行特定任务的指令,例如统计、计费或故障诊断,这些功能可以通过定制的P4程序实现。 6. **INT Header Types**:不同的INT头格式用于承载不同类型的监控数据,如标准元数据、事件触发器等,灵活性使得INT能够适应各种场景的需求。 7. **Handling INT Packets**:INT兼容设备需解析这些头信息,根据指示进行相应的数据收集和操作,然后将包含监测结果的包发送给控制面或直接转发。 8. **Header Format and Location**:INT头的位置和格式因封装方式(如Geneve、VXLAN)而异。INT可以嵌套在多种网络封装协议内,如通过Geneve或VXLAN隧道传输时,需要适配相应头部的插入位置。 9. **On-the-fly Header Creation**:在数据包的生命周期中动态生成INT头,确保监控信息的实时性和准确性。 10. **Examples with Encapsulation**:示例展示如何在实际场景中使用INT,如 Geneve封装和 VXLAN封装下的INT头部格式和位置设计,以便于理解和实现。 INT的引入极大地简化了网络监控的过程,提高了网络运维效率,并且与SDN的控制器交互,有助于实现自动化故障排查和智能决策。然而,它也对网络设备的硬件和软件设计提出了新的挑战,需要在保持性能的同时确保数据的安全性和隐私性。随着网络技术的发展,INT将持续演进,成为未来网络监控不可或缺的一部分。
2023-06-07 上传

void QueryWindow::dijkstra_heap(Lgraph Graph,int s,int stime,pre *prenum,int flag) { /*堆优化Dijikstra*/ //int day = 0; int top = 0; heap node; node.dis = stime;//将起始点即编号为s的点的到达时间设为stime node.ver = s;//起始点编号为s //初始化状态数组和最小距离数组和(前驱节点和航班/列次)数组 for(int i = 0; i < Graph->Nv; i ++ ) { st[i] = false; dist[i] = INF; prenum[i].name = QString(); prenum[i].prepoint = -1; if(flag == 1 && !Graph->f_G[i].canFly) st[i] = true; } dist[s] = stime;//初始化起点的时间 push(h,top,node);//将起点入堆 while(top){ auto x = pop(h,top);//取出堆顶元素 int ver = x.ver; if(st[ver]) continue;//如果已经被选中就不再选了 st[ver] = true;//不然就选它 AdjVNode i = new adjVNode; int distance = 0; if(flag == 1){//飞机还是火车 //添加等待时间 distance = x.dis + wait_time; if(ver == s) distance -= wait_time; i = Graph->f_G[ver].First;//确定初边 }else{ distance = x.dis + wait_time2; if(ver == s) distance -= wait_time2; i = Graph->t_G[ver].First; } for( ; i ; i = i->next) { int j = i->adjv; int current_time = distance % 24;//现在的时间对应几点 int wait = (i->weight.go - current_time + 24) % 24;//如果选择这个航班/火车,需要等待的时间 if(dist[j] > distance + wait + i->weight.time) { dist[j] = distance + wait + i->weight.time; node.dis = dist[j]; node.ver = j; prenum[j].prepoint = ver; prenum[j].name = i->weight.name; push(h,top,node);//会重复入堆,还可以优化 } } } }转化成伪代码

2023-06-02 上传