【sdn】openflow1.3学习笔记(一)

在这里插入图片描述

OpenFlow 系列文章链接归类:

【sdn】openflow1.3学习笔记(一)



前言

   在这篇文章里我们了解一下openflow1.3的全部特性

一、什么是openflow

   SDN的一个核心思想就是“转发、控制分离”,要实现转、控分离,就需要在控制器与转发器之间建立一个通信接口标准,允许控制器直接访问和控制转发器的转发平面。OpenFlow引入了“流表”的概念,转发器通过流表来指导数据包的转发。控制器正是通过OpenFlow提供的接口在转发器上部署相应的流表,从而实现对转发平面的控制。
在这里插入图片描述

二、名词解释

  • Packet: 一种因特网框架,包含包头负载
  • Port: packet 进入和流出的地方,可以为物理口、switch定义的逻辑口 或者 openflow协议规定的保留端口
  • Pipeline: openflow 交换机内的整个流表中的一段,用于进行包的匹配转发修改
  • Flow Table: 容纳多段的一张总表
  • Flow Entry: 流表中用于匹配和处理数据包的元素。它包含一组用于匹配数据包的匹配字段,一个用于匹配优先级的优先级,一组用于跟踪数据包的计数器,以及一组用于应用的指令
  • Match Field: 数据包匹配的字段,包括数据包头入站端口、以及元数据值。匹配字段可以是通配符(匹配任何值) 在某些情况下是位掩码
  • Metadata: 一组可以带掩码的数据,用于在不同的表之间传递数据。
  • Instruction: 当包命中flow entry时,instruction可以修改pipeline的处理流程
       例如:将信息包定向到另一个流表,或者包含要添加到操作集的一组操作,或者包含   要立即应用到信息包的一组操作。
  • Action: 可以操作包发往某个port,或者修改包,action可以作用于instruction中 也可以作用于group的bucket中。
       例如:递减包中的TTL值
  • Action Set: 关联包的一组动作,可以在每个flow table处理完包时进行一个累积,当instruction组操作包退出pipeline时执行
  • Group``: 包含一个或多个action bucket` 的组。
  • Action Bucket: 内含多个action的聚合,action bucket 作用于group内。
  • Tag: 可以通过push和pop操作向header中添加或清除的一个标记
  • Outermost Tag: 最靠近packet进入时候的标签
  • Controller: 使用OpenFlow协议与OpenFlow交换机交互的一个控制器
  • Meter: 负责控制交换机上面包的流速,如果包的流速超过meter预设的阈值,则会触发meter band去进行丢包处理,也被称为Rate Limiter。

三、openflow消息类型

   通道中传输的OpenFlow消息类型包括以下三种:

  • Controller-to-Switch消息:由控制器发出、OpenFlow交换机接收并处理的消息,主要用来管理或获取OpenFlow交换机状态
  • Asynchronous消息:由OpenFlow交换机发给控制器,用来将网络事件或者交换机状态变化更新到控制器。
  • Symmetric消息:可由OpenFlow交换机发出也可由控制器发出,也不必通过请求建立,主要用来建立连接检测对方是否在线等。

四、openflow组件

OpenFlow port

OpenFlow port可以连接:

  • 物理口
  • 由switch定义的逻辑口
  • 保留端口

物理口就相当于实际存在的网口,逻辑口是switch定义出来的一个虚拟的口,
其中 物理口 和 逻辑口的区别在于, 逻辑口的packet会多出一个tunnel ID 的元数据,当逻辑的packet 进行 packet-in 传给控制器时,会把逻辑口的physical_port和logic_port一并上报。
保留端口用于和控制器、泛洪、或者发往非OpenFlow交换机

openflow pipeline

在这里插入图片描述
pipeline 流程:

  1. 在当前table根据匹配域和优先级选择一条flow;
  2. 执行该flow内的动作(包括:修改包,更新field、执行action、更新元数据);
  3. 发往下一张table。

flow 结构

   flow 结构

在这里插入图片描述

  • match fields: 匹配数据包,匹配的字段包含inport,header,以及前面table写入的元数据;
  • priority: 优先级,数字越大,优先级越高;
  • counters: 计数器,记录经过这条flow的包数量;
  • instructions 执行动作或者管道处理;
  • timeouts: 一条flow的存活时间;
  • cookie: 由控制器创建的一个不透明的数据,用于过滤flow的一个标记。

   flow 过期

  • idle_timeout: 当一段时间(idle_timeout)内不再收到packet,则删除该flow;
  • hard_timeout: 从下发此条flow开始的一段时间(hard_timeout)后,强制删除该flow。

match

在这里插入图片描述

当packet未匹配上流的行为有:

  • 通过通道上报到controller
  • 直接drop
  • 进入到下一个table进行匹配

group

   group 结构

在这里插入图片描述

  • group identifier: group 的一个uint32唯一标识
  • group type: 用于辨别该group的模式(all、select、indirect、fast failover)
  • counters: 计数器,记录过这个group的包的数量
  • action buckets: 一组bucket的有序列表,每个bucket又有一系列的动作以及对应参数

   group 模式

  • all: 包会被克隆,发往group内所有的bucket里被执行;
  • select: 包只会选择group内一个bucket进行执行,选择方式根据switch上的选择算法,通过这种方式进行负载均衡;
  • indirect: group内只有一个bucket,这样做的好处是能够让多条flow,都来执行相同的bucket,能够更好的进行收敛;
  • fast failover: 执行第一个有效的bucket,每一个bucket都和控制其存活状态的特定的端口或者group相关联,这种模式的好处在于,可以不通过controller来让switch自己进行流量转发的重新定向,这种group模式必须实现一个存活机制。

Meter

   meter 结构

在这里插入图片描述

  • meter identifier: meter的uint32唯一标识符
  • meter bands: 每个meter band 标记了band 的带宽,以及包的处理方式
  • counters: 计数器,统计通过的包数量

   meter bands 结构

在这里插入图片描述

  • band type: 标记包要如何处理;
  • rate: 标记着meter band能够选择的最低速率,用于指导meter如何选择去meter band;
  • counters: 标记 meter band 处理过的包数量;
  • type specific arguments: 一些 band 的可选参数:
    - drop: 可以用来定义一个速率限制 band;
    - dscp remark 降低报文的IP头中DSCP字段的丢弃优先级,可以被用作定义一个DiffServ策略器;

Instructions

   每一个Flow Entry里都包含有一系列的Instructions,这些Instructions会在与该Flow Entry成功匹配的数据包上执行,进而导致数据包头信息的修改、Action Set的更新或者改变Pipeline Processing的处理行为。

  • Meter meter_id:将数据包直接转发给指定的Meter处理。
  • Apply-Actions action(s):立即对数据包执行指定的action(s),而不是将这些action(s)更新到Actions Set中。这些action(s)可能会修改数据包的信息,它们以Action List的形式组织。
  • Clear-Actions:立即清除Actions Set中的所有action(s)。
  • Write-Actions action(s):将指定的action(s)合并到当前的Actions Set中;如果给定类型的action当前已经存在于Actions Set中,那么会覆写,否则直接加入。
  • Write-Metadata metadata/mask:将指定的metadata值写到当前的Metadata值域中。
  • Goto-Table next-table-id:指定了在Pipeline Processing中的下一张Flow Table。这里的table-id必须大于当前的Flow Table id,并且Pipeline的最后一张Flow Table中不能含有这个指令;如果仅有一张Flow Table的OpenFlow Switch也不能支持该指令。

   每一个Flow Entry里每种类型(如上列表)的Instruction最多只能有一个,并且这些Instructins必须得按照上述列表的顺序来依次执行。往往在实际上,唯一的限制就是 Meter 指令必须在 Apply-Actions 指令前执行,Clear-Actions 指令必须在 Write-Actions 指令前执行,Goto-Table 必须放在最后执行。
   一个OpenFlow Swtich必须拒绝它不能支持的Instructions的Flow Entry,并且发出一个unsupported flow error给Remote Controller。Flow Tables可能会不支持每一个match,每一个instruction或者每一个action。

Action Set

   Action Set是与每个数据包相关联的,初始时是一个空集合;一个Flow Entry可以通过Write-Actions或者Clear-Actions指令来修改Action Set,这个Action Set会在不同的Flow Table之间进行传递,当一个Flow Entry的Instructions里不包含Goto-Table指令时,那么整个Pipeline Processing就会在此Flow Entry停止,然后开始执行与该数据包关联的Action Set里所有的action(s)。

   同样地,一个Action Set里每种类型的action最多只有一个,action类型大致如下所示:

  • copy TTL inwards:在数据包上执行copy TTL inwards操作。
  • pop:pop出数据包里所有的tag。
  • push-MPLS:push MPLS tag到数据包里。
  • push-PBB:push PBB tag到数据包里。
  • push-VLAN:push VLAN tag到数据包里。
  • copy TTL outwards:在数据包上执行copy TTL outwards操作。
  • decrement TTL:降低数据包的TTL。
  • set:在数据包上执行set-fields操作。
  • qos:执行与qos相关的操作,比如set_queue。
  • group:转到指定的Group Table里继续执行其Action Bucket里的action(s)。
  • output:如果没有group action指定,那么将数据包转发到指定的port里。

   Apply-Actions指令会触发立即执行Action Set里的action(s),并且这些action(s)必须按照上述列表的顺序来依次执行,而不管这些action(s)加入到Action Set的顺序,另外output action一定要是最后执行的;如果一个Action Set里同时存在output action和group action,那么此时group action将优先被执行,而output action将会被忽略,反之,如果一个Action Set里都不存在output action和group action,那么该数据包将会被丢弃。如果OpenFlow Switch支持的情况下,Group Action Bucket是可以递归执行的,即Action Bucket是可以继续指定另一个Group。

Action List

   Apply-Actions指令和packet-out消息都包含有一个Action List,这些Action List里的action(s)会依照上文列表的顺序依次执行,并且执行的结果会立即累积地反映到数据包信息里,比如Action List里有两个push-VLAN的action,那么这两个VLAN tag都会被加入到数据包头里。如果Action List里包含有output action,那么基于当前状态的数据包会被克隆一份,进而该克隆体被转发到指定的port里;如果Action List里包含有group action,那么同样地基于当前状态的数据包会被克隆一份,进而该克隆体被转发到指定的Group里。
   当数据包的Apply-Actions指令执行完成后,Pipeline会继续在修改过的数据包上继续执行后续的处理,而Action Set不会因为Action List的执行被修改。

Actions

  OpenFlow Switch并不需要支持所有的Action类型,但是下面加黑的类型必须得支持:

  • Output:该action指将一个数据包转发到指定的OpenFlow Ports。
  • Set-Queue:该action指为一个数据包设置一个queue id。当一个数据包通过output action转发到某个port时,该queue id 决定了该数据包被放在哪个queue用来调度转发,此方式可以用来实现QoS支持。
  • Drop:没有显示的action来表示丢弃数据包,作为替代方案,如果一个数据包的Action Set里没有output action,那么将此数据包将会被丢弃。
  • Group:将数据包转发到指定的Group继续处理。
  • Push-Tag / Pop-Tag:Switch应该有能力支持 ( VLAN MPLS PBB ) 的push-tag/pop-tag的操作:
  • Set-Fields:不同的set-fields action以其不同的field type来唯一标识,通过它可以修改数据包头的某些值域信息,比如VLAN tag的修改等。
  • Change-TTL:该action可以修改数据包头的IPv4 TTL,IPv6 Hop Limit 或者 MPLS TTL等信息

参考

https://opennetworking.org/wp-content/uploads/2014/10/openflow-spec-v1.3.0.pdf
https://info.support.huawei.com/info-finder/encyclopedia/zh/OpenFlow.html
https://www.cnblogs.com/CasonChan/p/4626099.html

<think>好的,用户之前已经询问了如何搭建SDN环境,现在他们的问题是:“主机环境还可以是其他的吗”。我需要确定用户的具体需求。他们可能在使用其他操作系统或者硬件配置时遇到了问题,或者只是想了解是否有更多选择。 首先,我应该回顾之前的回答,在之前的部分我提到推荐Ubuntu 20.04/22.04,因为兼容性好。现在用户想知道是否有其他选项,可能他们不想用Ubuntu,或者有特定的环境需求,比如Windows或macOS。 接下来,我需要考虑不同操作系统的可行性。Ubuntu确实是最佳选择,但用户可能有其他偏好。比如,有些用户可能习惯用Windows,或者公司环境限制使用特定系统。这时候,虚拟机或Docker可能是解决方案。另外,macOS用户可能想用Homebrew安装相关工具,但兼容性问题可能更多。 硬件配置方面,用户可能想知道最低要求是否还能更低,或者是否有更高性能的需求。例如,如果用户只是想进行小规模实验,可能4GB内存也够用,但需要指出可能会有性能瓶颈。而对于大规模模拟,更高的配置是必要的。 容器化部署也是个重要点,特别是云环境或快速实验。Docker和Kubernetes的使用越来越普遍,用户可能希望了解如何在这些环境中部署SDN组件,这样可以更灵活地管理资源。 另外,用户可能对物理设备的扩展感兴趣,比如如何将物理交换机整合到SDN环境中。这里需要提到支持OpenFlow的硬件,并给出配置示例。 最后,用户可能遇到兼容性问题,比如不同控制器或交换机的版本冲突。需要提供常见问题的解决方法,比如使用虚拟环境或检查依赖项。 总结下来,用户需要的是更灵活的环境选择,无论是操作系统、硬件还是部署方式。我需要详细列出各种可能性,同时指出优缺点,帮助用户根据自己的实际情况做出选择。此外,要强调验证步骤的重要性,确保环境配置正确,避免后续问题。</think>--- ### **主机环境扩展选择** SDN实验环境的搭建并非严格依赖特定系统或硬件,以下是更灵活的环境配置方案: --- ### **、操作系统扩展** 1. **非Ubuntu Linux发行版** - **Debian/CentOS**:需手动编译安装组件(如Mininet、OVS) ```bash # CentOS安装示例 sudo yum install git python3 gcc make git clone https://github.com/mininet/mininet ./mininet/util/install.sh -n3v ``` - **Arch Linux**:通过AUR仓库快速安装 ```bash yay -S mininet openvswitch ryu ``` 2. **Windows/macOS系统** - **虚拟机方案**: - 使用VirtualBox/VMware创建Ubuntu虚拟机(分配至少2核4GB资源) - 启用嵌套虚拟化提升性能 - **容器化方案**: ```bash # Windows PowerShell中使用Docker docker run -it --privileged ubuntu:22.04 apt update && apt install mininet openvswitch-switch ``` - **macOS原生支持**: ```bash brew install mininet/openvswitch/openvswitch ryu-manager需通过Python虚拟环境运行 ``` --- ### **二、硬件配置弹性调整** | **场景** | **推荐配置** | **典型用途** | |----------------|----------------------------|-------------------------| | 基础实验 | 2核CPU/4GB RAM/15GB存储 | 学习OpenFlow协议、小型拓扑 | | 进阶开发 | 8核CPU/16GB RAM/SSD硬盘 | 多控制器测试、SDN应用开发 | | 生产级模拟 | 16核CPU/64GB RAM/NVMe存储 | 大规模网络仿真(100+节点) | --- ### **三、容器化与云环境** 1. **Docker快速部署** - 预构建镜像加速搭建: ```bash docker pull iwaseyusuke/mininet docker run -it --rm --privileged iwaseyusuke/mininet ``` - 自定义Dockerfile集成Ryu: ```dockerfile FROM ubuntu:22.04 RUN apt update && apt install -y mininet openvswitch-switch python3-ryu ``` 2. **云平台部署** - AWS/GCP/Azure中: - 选择计算优化型实例(如AWS c5.xlarge) - 开启SR-IOV提升虚拟交换机性能 - 关键网络配置: ```bash # 允许OpenFlow协议穿透云防火墙 iptables -A INPUT -p tcp --dport 6653 -j ACCEPT ``` --- ### **四、混合物理/虚拟环境** 1. **树莓派集群** - 使用4台树莓派4B(4GB版)构建低成本实验平台: ```bash # 在主节点部署Ryu控制器 scp ryu.tar.gz pi@node1:~/ ssh pi@node1 "tar xzf ryu.tar.gz && cd ryu && python3 setup.py install" ``` - 性能指标:可承载约20个OVS实例 2. **连接物理交换机** - 配置华为CE6851交换机支持OpenFlow 1.3: ```bash openflow enable controller ip 192.168.1.100 port 6633 ``` - 验证命令:`display openflow controller` --- ### **五、环境验证关键步骤** 1. **基础连通性测试** ```bash # 在Mininet中创建测试拓扑 sudo mn --test pingall --controller=remote,ip=127.0.0.1 ``` $$ \text{丢包率} = \frac{\text{未响应ICMP报文数}}{\text{总发送数}} \times 100\% $$ 要求:丢包率 < 0.5% 2. **下发延迟测量** ```bash # 使用Ryu的ofproto_parser抓取事件 ryu-manager ryu.app.ofctl_rest --observe-links ``` 合格标准:首包处理延迟 < 50ms --- ### **六、特殊环境注意事项** 1. **Windows子系统(WSL)限制**: - WSL 1不支持完整的Linux网络栈,需升级到WSL 2 - 需手动加载Open vSwitch内核模块: ```bash sudo modprobe openvswitch sudo ovsdb-server --remote=punix:/var/run/openvswitch/db.sock & ``` 2. **低配设备优化技巧**: - 关闭图形界面:`sudo systemctl set-default multi-user.target` - 限制Mininet资源: ```bash sudo mn --topo tree,2,2 --mac --switch ovsk \ --controller remote --cpu 0.5 --mem 10% ``` --- ### **七、环境选择建议** | **需求场景** | **推荐方案** | **优势** | |----------------------|--------------------------|-------------------------| | 教学演示/快速验证 | Ubuntu虚拟机+Docker | 快速重置、隔离性强 | | 协议开发/长期研究 | 物理服务器+原生Ubuntu | 性能稳定、调试方便 | | 跨平台测试 | 云环境+Kubernetes集群 | 弹性扩展、多节点管理 | 通过灵活组合上述方案,可在从笔记本电脑到数据中心的各类环境中构建适用的SDN实验平台。建议初次接触SDN的用户优先使用**Ubuntu 22.04虚拟机方案**,待熟悉基础操作后再尝试混合环境部署。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值