网络虚拟化基本架构

news2024/11/19 22:37:16

文章目录

  • 架构概述
    • 架构图
    • 核心组件
  • OpenFlow Switch
    • Pipeline
    • Flow Table Entry
    • Instruction
  • OpenFlow Switch Protocol
  • 测试验证
    • Pipeline
      • 流表项间流程
      • 流表间流程
    • Flow Table Entry
    • Instructions
    • Switch Protocol
      • Faucet

架构概述

  • 我们知道网络虚拟化的主要目标就是让报文可以在虚拟机之间进行传输。要实现这个目标,个人总结,需要具备这三个要素:虚拟机、报文收发能力和报文转发能力。我们在网络虚拟化基本原理中提到了这个观点。
  • 以上三个要素可以在一个节点的ovs网络环境下实现虚机之间的报文传输,但怎么让各个节点独立的网络连接起来;屏蔽节点间物理网络;并虚拟机提供统一扁平的、与物理网络类似的L2层网络能力,还需要有大量的软件实体参与。具备了为虚机提供与物理网络类似的能力后,还需要支持工程化配置网络节点并支持各组件间松耦合保证可以独立升级演进。梳理以上种种产品化需求,ONF(Open Networking Foundation)提出了软件定义网络SDN(software defined networking)并设计发布了软件定义网络的架构SDN architecture,定义了SDN架构下各软件模块的核心功能、模块实现规范以及模块间的接口或协议,用于进一步指导各子模块的设计与开发。

架构图

  • SDN架构中把可以通过接口管理虚拟机间网络流量的软件实体称作网络元素(Network element),把专门管理NE的软件实体称作控制器(SDN controller),控制器之上则是应用软件(SDN application),整个架构如下:

在这里插入图片描述

  • SDN控制器和应用程序之间通过北向接口交互,为应用提供必要的管理接口,SDN控制器和各NE之间通过南向接口交互,通过南向接口实现对NE的配置与管理。我们知道在具体实现各组件时,openvswitch作为一种OpenFlow Switch规范的具体实现,可以看成一个NE,SDN controller和OpenFlow Switch之间的关系如下图所示:
    在这里插入图片描述

核心组件

  • 从上面的架构中可以看到SDN架构下的网络虚拟化核心组件有如下三个,我们分别简述其作用:
  1. SDN Controller,负责控制底层各NE,在OpenFlow Switch规范的实现里,负责下发switch的配置信息,流表信息等,从而控制switch处理报文的行为。
  2. OpenFlow Protocol,定义Controller和Switch之间配置信息、流表信息传递的规范,Controller按照此规范下发各种控制信息,Switch按照此规范接收并处理控制信息。
  3. OpenFlow Switch,定义可以通过流表控制包处理的交换机规范,openvswitch即该规范的一种软件实现,负责虚拟机之间报文的处理与转发。

OpenFlow Switch

  • OpenFlow定义了一种通过流表控制的交换机的实现规范,即OpenFlow Switch规范。相比传统物理交换机通过硬件控制交换机处理包的行为,通过流表控制包处理行为的交换机为软件实现,配置更加灵活并且能够提供更丰富的功能与接口,用于支持上层实现更高级的网络特性。
  • 这一节我们主要介绍规范中实现OpenFlow交换机需要遵守的工作流程(Pipeline)、流表项需要定义的核心字段(Flow Table Entry)以及报文处理的指令流程(Instruction)。

Pipeline

  • 从上一章中OpenFlow Switch的架构图中我们知道,Switch接收从入端口来的报文,处理后将其从出端口发送出去,整个过程可以看做是一个流水线,交换机规范中定义流水线的处理逻辑如下:
    在这里插入图片描述
  • 交换机中的流表可以有多张,每张流表由多条流表项组成,在最简单的流水线中,交换机至少有一张入向流表用于处理入向端口的报文。流水线包含一张或多张流表,定义了经过该流水线的报文如何被处理。简单描述:报文从交换机入口进入,从流表0开始按照OpenFlow Switch规范中描述的匹配逻辑,按照序号从低到高逐一匹配所有流表直到从交换机出口被转发出去,匹配流表时会逐一匹配每个表项,成功后按照表项要求将需要执行的操作添加到Action Set,在所有流表匹配完成后,取出Action Set中所有操作逐一执行。Action Set从一开始的空集,随每个包在流表项中被逐一匹配后,逐渐增多,最后在Ingress 处理流程的最后阶段统一执行。
  • 具体来说,报文的处理逻辑基于流表项的匹配机制,流程图如下:
    在这里插入图片描述
  1. 报文从入向端口进入后,总是从流表0开始,按照流表编号从低到高逐表进行匹配(不可逆),在匹配每张流表时会逐一查询表中每条表项。匹配结果只有两种,一是报文匹配流表项成功,则执行匹配流表项中定义的指令;二是报文匹配所有流表都失败,则检查交换机是否配置Table-miss这个特殊的流表项,如果有配置,则按照流表项中的指令执行,通常有几种行为,丢弃报文、转发报文到其它流表继续匹配、通过控制通道发送报文到controller;如果没有配置,则丢弃报文。
  2. 报文成功匹配流表项之后,交换机Pipeline就会更新表项中的统计信息,同时执行流表项中的指令,完成之后报文的行为可能有两种,根据流表项中的指令跳转到下一个流表继续进行匹配,或者不再跳转执行直接进入到最后阶段,执行流表匹配过程中累计添加到Action Set中的操作。
  3. Action Set中最后一个要执行的操作总是output转发操作,如果output操作不存在,但包含group操作,则进入另一个由group描述的Action Set,如此迭代执行。如果outputgroup都不存在,丢弃报文。
  4. Action Set中包含output操作的情况下,如果交换机不包含出向的流表,则直接从端口出去,如果包含出向流表,则需要重复1-3类似的流程,最终从端口转发出去或者执行其它操作。

Flow Table Entry

  • 流表项是OpenFlow Switch规范最核心的设计,其格式如下:
    在这里插入图片描述
  • 我们简要介绍流表项重要字段的含义:
  1. Match Fields,匹配域,用于匹配报文,匹配的信息主要有两类,一类是报文头部信息,比如以太网帧头部或IP报文头部等,另一类是Pipeline上下文相关的信息,比如入向端口、流表附加元数据信息等。在OpenFlow Switch的Pipeline中被处理的报文,与普通报文相比还会被交换机增加Pipeline特有的一些信息用来匹配流表项,比如报文的入向端口,元数据等,我们称之为Pipeline fields
  2. Priortiy,优先级,优先级和匹配域两个字段信息共同组成流表项的ID,当匹配域的信息相同时,优先选择优先级高的流表项。
  3. Counters,统计字段,用于存放统计信息,统计信息的类型有多种,基于整个流表的统计、基于流表项的统计、基于端口的统计、基于队列的统计等等。基于流表的统计信息包括如匹配成功次数、查询次数;基于流表项的统计信息包括接受的报文包个数、字节数等等。
  4. Instructions,指令集,报文与流表项匹配成功后需要执行指令集合,指令操作主要有三类,一类是立即执行集合中的操作(Apply-Actions action),比如修改报文头、更新Pipeline fields中的信息;第二类是针对Action Set的操作,包括对集合的增、删;另一类就是跳转到其它流表操作。

Instruction

  • 报文成功匹配流表项之后,会读取流表项中的指令信息并执行相应指令,流表的匹配和执行流程如下图所示:
    在这里插入图片描述
  • 报文的流表匹配步骤如下:
  1. 交换机提取报文的头部信息,同时为报文关联对应的Pipeline FieldsAction Set,整个流表匹配过程中,会用到这三类数据。
  2. 交换机提取头部信息后,将头部信息和Pipeline Fields一起,作为匹配流表项的信息,逐一匹配每个表项。
  3. 交换机匹配流表项成功后,提取并执行指令字段描述的指令。
  4. 指令执行主要分为三类,一类是操作执行类指令,指令类型为Apply-Actions,执行这类指令可能会修改报文头,更新匹配域或者报文关联的Pipeline Fields等等;第二类是对Action Set集合的增删操作;第三类是跳转到其它流表操作。
  5. 报文的最终流向受指令执行结果影响,当流表项的指令中没有流表跳转指令,即报文匹配到最后一张流表,则会执行报文关联的Action Set集合中的所有操作。流表项匹配成功后,指令的执行会不断增删Action Set集合,其最终结果受此影响。
  6. 报文匹配成功后会执行指令,如果执行的指令类型为Apply-Actions,则会执行具体操作Action,如果操作类型为output,则会将报文从端口转发出去,如果有出向流表,则报文会继续匹配。

OpenFlow Switch Protocol

  • TODO

测试验证

  • OpenFlow Switch支持的功能太多,我们选取最感兴趣的三个技术点进行设计验证,包括Pipeline流程验证、流表项匹配验证和指令执行验证。最后我们还想抓取OpenFlow Switch Protocol消息,验证消息格式是否满足OpenFlow Switch Protocol。

Pipeline

  • pipeline的验证环境只有一个桥接ovs的虚拟机,我们通过ping包验证ovs的流水线流程,分两个方面,一是验证同一流表,报文在流表项间的匹配流程,另一个是同一个Ingress pipeline,报文在流表间的匹配流程。虚拟机网卡为vnet0,它与ovs桥关系如下:
[root@Hyman_server1 ~]# virsh domiflist c81_node1
 Interface   Type      Source    Model    MAC
-------------------------------------------------------------
 vnet0       bridge    vs        virtio   24:42:53:21:52:4e
 vnet1       network   default   virtio   24:42:53:20:50:45

[root@Hyman_server1 ~]#  ovs-vsctl show
f1011f20-73a8-44f1-979e-bc4fd82a106f
    Bridge vs
        Port vs
            Interface vs
                type: internal
        Port "vnet0"
            Interface "vnet0"
    ovs_version: "2.11.0"

流表项间流程

  • ovs创建后,默认会在table 0创建一条流表项entry 0,这条流表匹配所有的报错并将其按照物理交换机的行为对报文进行处理,我们的验证流程非常简单,在table 0中增加一条优先级比流表entry 1,它匹配所有报文并将其丢弃,如下图所示:
    请添加图片描述
  • 查看ovs流表和流表项如下:
[root@Hyman_server1 ~]# ovs-ofctl  dump-tables vs
OFPST_TABLE reply (OF1.3) (xid=0x2):
  table 0:
    active=1, lookup=12675, matched=12609

  table 1:
    active=1, lookup=6666, matched=6580

  table 2:
    active=0, lookup=0, matched=0

  tables 3...253: ditto
[root@Hyman_server1 ~]# ovs-ofctl  dump-flows vs table=0
 cookie=0x0, duration=865.777s, table=0, n_packets=1790, n_bytes=169820, priority=0 actions=NORMAL
  • ovs桥vs和虚机内部网卡我们配置同一网段IP
[root@Hyman_server1 ~]# ip addr show dev vs
[root@Hyman_server1 ~]# ip addr show dev vs
4: vs: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 26:44:42:8c:47:4e brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.195/24 brd 10.10.10.255 scope global vs
       valid_lft forever preferred_lft forever

[root@s1_vm1 ~]# ip add show dev ens7
3: ens7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 24:42:53:21:52:4e brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.196/24 brd 10.10.10.255 scope global noprefixroute ens7
       valid_lft forever preferred_lft forever
  • 从虚机内部ping主机vs桥,可以正常通信,虚机内部发送2个icmp包,主机上vs交换机table 0的entry 0对对应匹配4个icmp包(request和reply),如下所示:
    在这里插入图片描述
    在这里插入图片描述
  • 现在我们在table 0上增加一条表项ovs-ofctl add-flow vs "priority=1,table=0,actions=DROP",则按照规范定义,表项0和表项1都可以匹配任何报文,这种情况下,优先级高的表项会被流水线选择并执行其对应的指令,因此可以判断该表项增加后ping包的变化有几点:
  1. 报文将会被丢弃
  2. entry 0将不会被匹配,因此其统计数据不会更新
  3. entry 1将会被匹配,其统计数据会更新,但由于表项匹配request报文后会执行指令将其丢弃,因此reply报文不会被匹配
  • 结果如下:
    在这里插入图片描述
    在这里插入图片描述

流表间流程

  • 流表间流程验证也非常简单,我们验证的两个场景如下图所示:
    请添加图片描述
  • 第一个场景我们在table 1中添加一条普通交换机流表项ovs-ofctl add-flow vs "priority=0,table=1,actions=NORMAL",然后修改table 0中的流表项 entry 1,将其drop的行为修改为goto_table,让其跳转到table 1继续处理,流表项操作如下:
[root@Hyman_server1 ~]# ovs-ofctl  dump-flows vs table=0
 cookie=0x0, duration=3735.372s, table=0, n_packets=2282, n_bytes=214992, priority=0 actions=NORMAL
 cookie=0x0, duration=1053.146s, table=0, n_packets=17, n_bytes=826, priority=1 actions=drop
[root@Hyman_server1 ~]# ovs-ofctl  del-flows vs table=0
[root@Hyman_server1 ~]# ovs-ofctl  dump-flows vs table=0
[root@Hyman_server1 ~]# ovs-ofctl add-flow vs "priority=0,table=0,actions=NORMAL"
[root@Hyman_server1 ~]# ovs-ofctl add-flow vs "priority=1,table=0,actions=goto_table:1"
[root@Hyman_server1 ~]# ovs-ofctl add-flow vs "priority=0,table=1,actions=NORMAL"
[root@Hyman_server1 ~]# ovs-ofctl  dump-flows vs table=0
 cookie=0x0, duration=29.879s, table=0, n_packets=0, n_bytes=0, priority=0 actions=NORMAL
 cookie=0x0, duration=12.290s, table=0, n_packets=0, n_bytes=0, priority=1 actions=goto_table:1
[root@Hyman_server1 ~]# ovs-ofctl  dump-flows vs table=1
 cookie=0x0, duration=8.473s, table=1, n_packets=6580, n_bytes=622160, priority=0 actions=NORMAL
  • 增加流表项之后我们现象如下:
    在这里插入图片描述
    在这里插入图片描述
  • 可以看到修改流表项之后虚机内部ping包正常,主机侧交换机上table 0的entry 1和table 1的entry 0统计数据有更新,匹配到了报文,和预期一样,table 0上entry 0虽然可以匹配任何报文,但优先级没有table 0的entry 1高,因此没有匹配到任何报文,统计数据未更新。
  • 第二个场景我们对流表项做两处修改,一是在table 2中新增一条NORMAL流表,二是让table 0中原来跳转到table 1的流表项entry 1跳转到table 2,可以预计,这样修改后,虚机内部通信仍然正常,但table 1中的流表项不会再匹配到报文,只有table0和table 2可以匹配,流表项的修改如下:
[root@Hyman_server1 ~]# ovs-ofctl  dump-flows vs table=0
 cookie=0x0, duration=752.154s, table=0, n_packets=0, n_bytes=0, priority=0 actions=NORMAL
 cookie=0x0, duration=734.565s, table=0, n_packets=24, n_bytes=1680, priority=1 actions=goto_table:1
[root@Hyman_server1 ~]# ovs-ofctl  dump-flows vs table=1
 cookie=0x0, duration=731.350s, table=1, n_packets=6604, n_bytes=623840, priority=0 actions=NORMAL
[root@Hyman_server1 ~]# ovs-ofctl  dump-flows vs table=2
[root@Hyman_server1 ~]# ovs-ofctl  del-flows vs table=0
[root@Hyman_server1 ~]# ovs-ofctl  dump-flows vs
 cookie=0x0, duration=748.760s, table=1, n_packets=6604, n_bytes=623840, priority=0 actions=NORMAL
[root@Hyman_server1 ~]# ovs-ofctl  del-flows vs table=1
[root@Hyman_server1 ~]# ovs-ofctl  dump-flows vs
[root@Hyman_server1 ~]# ovs-ofctl add-flow vs "priority=0,table=0,actions=NORMAL"
[root@Hyman_server1 ~]# ovs-ofctl add-flow vs "priority=1,table=0,actions=goto_table:2"
[root@Hyman_server1 ~]# ovs-ofctl add-flow vs "priority=0,table=1,actions=NORMAL"
[root@Hyman_server1 ~]# ovs-ofctl add-flow vs "priority=0,table=2,actions=NORMAL"
[root@Hyman_server1 ~]# ovs-ofctl  dump-flows vs
 cookie=0x0, duration=29.547s, table=0, n_packets=0, n_bytes=0, priority=0 actions=NORMAL
 cookie=0x0, duration=18.605s, table=0, n_packets=0, n_bytes=0, priority=1 actions=goto_table:2
 cookie=0x0, duration=10.962s, table=1, n_packets=0, n_bytes=0, priority=0 actions=NORMAL
 cookie=0x0, duration=5.784s, table=2, n_packets=0, n_bytes=0, priority=0 actions=NORMAL
  • 查看虚机通信与主机报文匹配情况:
    在这里插入图片描述
    在这里插入图片描述

Flow Table Entry

  • 测试环境我们启动两个虚机,桥接同一个ovs,我们主要验证流表项的报文匹配功能,流水线的流表项如下图所示:
    请添加图片描述
  • 我们分别解释每条流表项的意义:
  1. table 0, entry 0: 匹配任何报文,成功匹配后执行normal操作。
  2. table 0, entry 1: 匹配发往目的IP为10.10.10.197的icmp请求报文。其中dl_type=0x800,表示匹配IP报文,其中nw_proto=1表示IP报文的payload是icmp报文,icmp_code=0,icmp_type=8表示匹配icmp的request报文,nw_dst=10.10.10.197表示匹配目的端为10.10.10.197的icmp请求报文。成功匹配后执行drop操作。
  3. table 0, entry 2: 匹配从vnet4网卡发往目的IP为10.10.10.195的icmp请求报文,原理同上,成功匹配后执行drop操作。
  4. table 1, entry 0: 匹配从vnet4网卡发往目的IP为10.10.10.196的icmp请求报文,原理同上,成功匹配后执行normal操作。
  • 虚拟机网络和主机侧网络如下:
虚拟机1:
[root@s1_vm1 ~]# ip addr show ens7
3: ens7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 24:42:53:21:52:4e brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.196/24 brd 10.10.10.255 scope global noprefixroute ens7
       valid_lft forever preferred_lft forever

虚拟机2:
[root@s1_vm2 ~]# ip addr show ens7
3: ens7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 24:42:53:21:50:4e brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.197/24 brd 10.10.10.255 scope global noprefixroute ens7
       valid_lft forever preferred_lft forever

主机:
[root@Hyman_server1 qemu]# ovs-ofctl show vs
OFPT_FEATURES_REPLY (OF1.3) (xid=0x2): dpid:00002644428c474e
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS GROUP_STATS QUEUE_STATS
OFPST_PORT_DESC reply (OF1.3) (xid=0x3):
 2(vnet2): addr:fe:42:53:21:52:4e
     config:     0
     state:      LIVE
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max
 3(vnet4): addr:fe:42:53:21:50:4e
     config:     0
     state:      LIVE
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max
 LOCAL(vs): addr:26:44:42:8c:47:4e
     config:     0
     state:      LIVE
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (OF1.3) (xid=0x9): frags=normal miss_send_len=0
[root@Hyman_server1 qemu]# ovs-vsctl show
f1011f20-73a8-44f1-979e-bc4fd82a106f
    Bridge vs
        Port "vnet2"
            Interface "vnet2"
        Port "vnet4"
            Interface "vnet4"
        Port vs
            Interface vs
                type: internal
    ovs_version: "2.11.0"       
  • 流表操作步骤如下:
[root@Hyman_server1 qemu]# ovs-ofctl  del-flows vs
[root@Hyman_server1 qemu]# ovs-ofctl  dump-flows vs
[root@Hyman_server1 qemu]# ovs-ofctl add-flow vs "priority=0,table=0,actions=NORMAL"
[root@Hyman_server1 qemu]# ovs-ofctl add-flow vs "priority=1,table=0,dl_type=0x800,nw_proto=1,icmp_code=0,icmp_type=8,nw_dst=10.10.10.197,actions=drop"
[root@Hyman_server1 qemu]# ovs-ofctl add-flow vs "priority=1,table=0,in_port=3,dl_type=0x800,nw_proto=1,icmp_code=0,icmp_type=8,nw_dst=10.10.10.195,actions=drop"
[root@Hyman_server1 qemu]# ovs-ofctl add-flow vs "priority=0,table=1,in_port=3,dl_type=0x800,nw_proto=1,icmp_code=0,icmp_type=8,nw_dst=10.10.10.196,actions=normal"
[root@Hyman_server1 qemu]# ovs-ofctl  dump-flows vs 
 cookie=0x0, duration=1094.045s, table=0, n_packets=8, n_bytes=784, priority=1,icmp,nw_dst=10.10.10.197,icmp_type=8,icmp_code=0 actions=drop
 cookie=0x0, duration=325.604s, table=0, n_packets=3, n_bytes=294, priority=1,icmp,in_port=vnet4,nw_dst=10.10.10.195,icmp_type=8,icmp_code=0 actions=drop
 cookie=0x0, duration=1252.963s, table=0, n_packets=85, n_bytes=6454, priority=0 actions=NORMAL
 cookie=0x0, duration=369.321s, table=1, n_packets=0, n_bytes=0, priority=0,icmp,in_port=vnet4,nw_dst=10.10.10.196,icmp_type=8,icmp_code=0 actions=NORMAL
  • 根据流表配置,我们可以知道,vm1所有发往vm2(IP 为10.10.10.197)的icmp的报文会被丢弃,但发往主机(IP为10.10.10.195)的icmp报文可以正常接受。vm2发往主机的icmp报文会被丢弃,但发往vm2的icmp包围可以被正常处理。检查如下:
  • 首先查看主机侧流表的统计信息:
[root@Hyman_server1 qemu]# ovs-ofctl  dump-flows vs 
 cookie=0x0, duration=2058.484s, table=0, n_packets=8, n_bytes=784, priority=1,icmp,nw_dst=10.10.10.197,icmp_type=8,icmp_code=0 actions=drop
 cookie=0x0, duration=1290.043s, table=0, n_packets=3, n_bytes=294, priority=1,icmp,in_port=vnet4,nw_dst=10.10.10.195,icmp_type=8,icmp_code=0 actions=drop
 cookie=0x0, duration=2217.402s, table=0, n_packets=117, n_bytes=8862, priority=0 actions=NORMAL
 cookie=0x0, duration=1333.760s, table=1, n_packets=0, n_bytes=0, priority=0,icmp,in_port=vnet4,nw_dst=10.10.10.196,icmp_type=8,icmp_code=0 actions=NORMAL
  • 发往主机的4个icmp报文被接受,主机侧table 0, entry 0报文匹配数增加:
虚侧:
[root@s1_vm1 ~]# ping 10.10.10.195 -c 4
PING 10.10.10.195 (10.10.10.195) 56(84) bytes of data.
64 bytes from 10.10.10.195: icmp_seq=1 ttl=64 time=1.87 ms
64 bytes from 10.10.10.195: icmp_seq=2 ttl=64 time=0.250 ms
64 bytes from 10.10.10.195: icmp_seq=3 ttl=64 time=0.250 ms
64 bytes from 10.10.10.195: icmp_seq=4 ttl=64 time=0.468 ms

--- 10.10.10.195 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 67ms

主机侧:
[root@Hyman_server1 qemu]# ovs-ofctl  dump-flows vs 
 cookie=0x0, duration=2198.824s, table=0, n_packets=8, n_bytes=784, priority=1,icmp,nw_dst=10.10.10.197,icmp_type=8,icmp_code=0 actions=drop
 cookie=0x0, duration=1430.383s, table=0, n_packets=3, n_bytes=294, priority=1,icmp,in_port=vnet4,nw_dst=10.10.10.195,icmp_type=8,icmp_code=0 actions=drop
 cookie=0x0, duration=2357.742s, table=0, n_packets=129, n_bytes=9814, priority=0 actions=NORMAL
 cookie=0x0, duration=1474.100s, table=1, n_packets=0, n_bytes=0, priority=0,icmp,in_port=vnet4,nw_dst=10.10.10.196,icmp_type=8,icmp_code=0 actions=NORMAL
  • vm1发往vm2的4个icmp报文被丢弃,主机侧table 0, entry 0、table 0, entry 1报文匹配数增加:
虚机:
[root@s1_vm1 ~]# ping 10.10.10.197 -c 4
PING 10.10.10.197 (10.10.10.197) 56(84) bytes of data.

--- 10.10.10.197 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 65ms

主机侧:
[root@Hyman_server1 qemu]# ovs-ofctl  dump-flows vs 
 cookie=0x0, duration=2288.083s, table=0, n_packets=12, n_bytes=1176, priority=1,icmp,nw_dst=10.10.10.197,icmp_type=8,icmp_code=0 actions=drop
 cookie=0x0, duration=1519.642s, table=0, n_packets=3, n_bytes=294, priority=1,icmp,in_port=vnet4,nw_dst=10.10.10.195,icmp_type=8,icmp_code=0 actions=drop
 cookie=0x0, duration=2447.001s, table=0, n_packets=131, n_bytes=9898, priority=0 actions=NORMAL
 cookie=0x0, duration=1563.359s, table=1, n_packets=0, n_bytes=0, priority=0,icmp,in_port=vnet4,nw_dst=10.10.10.196,icmp_type=8,icmp_code=0 actions=NORMAL
  • vm2发往vm1的4个icmp报文被接受,主机侧table 0, entry 0报文匹配数增加:
虚机:
[root@s1_vm2 ~]# ping 10.10.10.196 -c 4
PING 10.10.10.196 (10.10.10.196) 56(84) bytes of data.
64 bytes from 10.10.10.196: icmp_seq=1 ttl=64 time=0.673 ms
64 bytes from 10.10.10.196: icmp_seq=2 ttl=64 time=0.572 ms
64 bytes from 10.10.10.196: icmp_seq=3 ttl=64 time=0.542 ms
64 bytes from 10.10.10.196: icmp_seq=4 ttl=64 time=0.593 ms

--- 10.10.10.196 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 8ms

主机侧:
[root@Hyman_server1 qemu]# ovs-ofctl  dump-flows vs
 cookie=0x0, duration=2410.358s, table=0, n_packets=12, n_bytes=1176, priority=1,icmp,nw_dst=10.10.10.197,icmp_type=8,icmp_code=0 actions=drop
 cookie=0x0, duration=1641.917s, table=0, n_packets=3, n_bytes=294, priority=1,icmp,in_port=vnet4,nw_dst=10.10.10.195,icmp_type=8,icmp_code=0 actions=drop
 cookie=0x0, duration=2569.276s, table=0, n_packets=143, n_bytes=10850, priority=0 actions=NORMAL
 cookie=0x0, duration=1685.634s, table=1, n_packets=0, n_bytes=0, priority=0,icmp,in_port=vnet4,nw_dst=10.10.10.196,icmp_type=8,icmp_code=0 actions=NORMAL
  • vm2发往主机的4个icmp报文被丢弃,主机侧table 0, entry 0、table 0, entry 2报文匹配数增加:
虚机侧:
[root@s1_vm2 ~]# ping 10.10.10.195 -c 4
PING 10.10.10.195 (10.10.10.195) 56(84) bytes of data.

--- 10.10.10.195 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 112ms

主机侧:
[root@Hyman_server1 qemu]# ovs-ofctl  dump-flows vs 
 cookie=0x0, duration=2605.175s, table=0, n_packets=12, n_bytes=1176, priority=1,icmp,nw_dst=10.10.10.197,icmp_type=8,icmp_code=0 actions=drop
 cookie=0x0, duration=1836.734s, table=0, n_packets=7, n_bytes=686, priority=1,icmp,in_port=vnet4,nw_dst=10.10.10.195,icmp_type=8,icmp_code=0 actions=drop
 cookie=0x0, duration=2764.093s, table=0, n_packets=145, n_bytes=10934, priority=0 actions=NORMAL
 cookie=0x0, duration=1880.451s, table=1, n_packets=0, n_bytes=0, priority=0,icmp,in_port=vnet4,nw_dst=10.10.10.196,icmp_type=8,icmp_code=0 actions=NORMAL

Instructions

  • TODO

Switch Protocol

  • 从前面的内容我们知道,网络虚拟化产品的核心组件有两个,一是SDN Controller,二是OpenFlow Switch,Controller负责网络配置,Switch负责具体报文转发,Switch Protocol则是controller和Switch之间的通信协议。对于上述两个组件,有相应的规范以及基于规范的各种开源实现。

Faucet

  • Faucet是一款遵守SDN架构规范的控制器开源软件。我们使用Faucet来配置ovs,通过分析两者之间的通信协议,验证Switch Protocol。
  • TODO:Faucet安装与配置

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

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

相关文章

Windows Anaconda YOLOv3环境部署--2023年1月8日

时效性&#xff1a; 2023年1月8日 目录摘要1 使用 Anaconda 创建虚拟环境2 安装官方要求的依赖库3 验证安装 | 执行 detect.py 示例代码Key already registered with the same priority摘要 网好的可以直接参考官方文档安装&#xff0c;遇到安装报错和网络问题可以参考本文 本地…

网络安全等级保护定级指南 范围

声明 本文是学习github5.com 网站的报告而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 网络安全等级保护 为了配合《中华人民共和国网络安全法》的实施&#xff0c;适应云计算、移动互联、物联网、工业控制和大数据等新技术、新应用情况下网络安全等…

Spring Cloud OpenFeign入门示例

简介 Feign Feign是一个声明性web服务客户端。让编写Web服务客户端变得非常容易&#xff0c;只需创建一个接口并在接口上添加注解即可。让http远程调用就像接口调用一样简单。&#xff08;远程http调用的工具有很多&#xff0c;HttpClient、OKHttp、Spring Boot中的RestTempl…

2023新年红包,兔年HTML红包页面代码【2023新年快乐_附源码】

文章目录一.新年红包&#xff0c;兔年HTML红包页面1.1 资源获取和效果预览二.代码讲解&#xff08;Html文件&#xff09;三.Html文件代码展示&#xff08;需要全部源码请到文章开头链接处下载&#xff09;一.新年红包&#xff0c;兔年HTML红包页面 1.1 资源获取和效果预览 1.…

【Nacos】- Mac-M1下Nacos安装及Nacos启动报错“have ‘x86_64’,need ‘arm64e‘”

Nacos安装及Nacos启动报错“have ‘x86_64’,need arm64e”nacos下载启动nacos问题描述解决方案1、下载安装x86架构的jdk2、更换nacos版本&#xff1a;我这是更换为1.4.2的nacos下载 下载地址&#xff1a;https://github.com/alibaba/nacos/releases 根据自己的工具及需要版本…

LINUX 动态库的版本控制

Linux库文件名的描述版本信息library filename lib <libaray name> .so <libarary version information>库版本信息通常使用以下格式&#xff1a;dynamic libarary version information <M>.<m>.<p>其中&#xff0c;M用一位或多位数字表示库…

(九)汇编语言——转义指令的原理

&#xff08;九&#xff09;汇编语言——转移指令的原理 文章目录&#xff08;九&#xff09;汇编语言——转移指令的原理转移指令作用分类转移行为转移距离转移指令操作符offsetjmp指令功能原理段间转移段内转移短转移原理长转移原理位移越界转移地址寄存器内存段内转移段间转…

【Linux基础】Linux中的时区和时间

基本概念 首先介绍Linux中会用到的时间概念&#xff1a; UTC&#xff1a;Universal Time Coordinated&#xff0c;协调世界时&#xff0c;又称世界统一时间&#xff0c;世界标准时间&#xff0c;国际协调时间。它是一个与时区相关的时间&#xff0c;目前将世界时区分为24个。…

【练习】Day04(未完成版)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. 数组中的第K个最大元素2. 组合总数III答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 下面代码运行结果是&#xff08; &#xff09; public class Test{public int add(int a…

传统图像特征描述及提取方法

图像特征描述 图像特征是一幅图像区别于另一幅图像的最基本特征&#xff0c;是其可以作为欸标志性的属性。 图像特征分为两大类: 自然特征&#xff1a;图像本身都具有内在的图像特征&#xff08;如图像的大小、颜色、轮廓、边缘、纹理等&#xff09; 人为特征&#xff1a;便于…

【Linux】基础 IO

文章目录一、文件相关基础知识二、文件操作1、语言层面的文件操作与操作系统层面的文件操作的关系2、C语言文件操作3、操作系统文件操作3.1 比特位传递选项3.2 文件相关系统调用3.3 文件操作接口的使用三、文件描述符1、什么是文件描述符2、文件描述符的分配规则四、重定向1、什…

Docker三剑客——Docker Compose

目录 一、概述 二、Docker Compose工作流程 三、安装Docker Compose 四、Docker Compose管理命令 &#xff08;1&#xff09;docker-compose build &#xff08;2&#xff09;docker-compose kill &#xff08;3&#xff09;docker-compose logs &#xff08;4&#xff…

unity 实现千人同屏

作为开发人员&#xff0c;我们总是关注性能&#xff0c;包括CPU和GPU。随着场景变得越来越大越来越复杂&#xff0c;保持良好的性能变得越来越有挑战性&#xff0c;尤其是当我们添加越来越多的角色时。我和我在上海的同事在帮助客户时经常遇到这个问题&#xff0c;所以我们决定…

springcloud-gateway

网关zuul&#xff1a; https://github.com/Netflix/zuul/wiki Spring Cloud 网关gateway&#xff1a;Spring Cloud Gateway Spring Cloud Gateway Cloud全家桶中有个很重要的组件就是网关&#xff0c;在1.x版本中都是采用的Zuul网关; 但在2.x版本中&#xff0c;zuul的升级—…

【韩顺平Linux】学习笔记4

【韩顺平Linux】学习笔记4一、Linux组的介绍1.1文件/目录所有者1.2 组的创建1.3 其它组1.4 权限的基本介绍1.5 权限说明案例1.6 修改权限-chmod1.7 修改文件/目录所有者-chown/-chgrp二、crond任务调度三、at定时任务一、Linux组的介绍 在Linux中&#xff0c;每个用户都属于一个…

AtCoder Beginner Contest 284.(A--E)

AtCoder Beginner Contest 284A - Sequence of Strings1、问题2、代码B - Multi Test Cases1、问题2、代码C - Count Connected Components1、问题&#xff1a;2、思路&#xff1a;——并查集、DFS3、代码方法1&#xff1a;并查集方法2&#xff1a;DFSD - Happy New Year 20231…

Linux内核学习笔记——内核页表隔离KPTI机制(源码分析)

KPTI(Kernel PageTable Isolation)全称内核页表隔离&#xff0c;它通过完全分离用户空间与内核空间页表来解决页表泄露。 KPTI中每个进程有两套页表——内核态页表与用户态页表(两个地址空间)。 内核态页表只能在内核态下访问&#xff0c;可以创建到内核和用户的映射&#xf…

单体的 TienChin 和微服务的 TienChin 有何异同?

有不少小伙伴希望松哥能整一个微服务的实战项目&#xff0c;微服务这块技术点其实松哥是讲过很多了&#xff0c;图文版的教程视频版的教程都有&#xff0c;不过确实缺乏一个项目&#xff0c;所以我在想等 TienChin 项目搞完之后&#xff0c;和小伙伴们也来一起搞一个微服务的项…

nacos2.0客户端注册流程分析

版本介绍 copy几个jar包出来康康把 spring-cloud-starter-alibaba-nacos-config-2021.0.4.0.jar spring-cloud-starter-alibaba-nacos-discovery-2021.0.4.0.jar nacos-client-2.0.4.jar 注册流程 读取Spring Boot装载配置文件 spring.factories&#xff0c;找到启动类 Nac…

一步一步学爬虫(4)数据存储之Elasticsearch搜索引擎存储

Elasticsearch搜索引擎存储1. Elasticsearch 介绍2. Elasticsearch 相关概念3. 准备工作3.1 下载程序3.2 解压缩&#xff0c;配置文件修改4. 创建索引5. 删除索引6. 插入数据7. 更新数据8. 删除数据9. 查询数据10. 总结想查数据&#xff0c;就免不了搜索&#xff0c;而搜索离不…