学习笔记之SDN网络控制系统
SDN网络控制系统,主要功能是基于SDN,mininet,onos,sanic,系统会自动检测交换机是否要进行通信,如果有交换机请求通信,通过迪杰斯特拉算法基于时延自动计算最短路径,下发流表给交换机,实现通信,恶补了很多通信知识
1.Packet Tracer
1.1. 工作区(Workspace)
-
中间的大区域,用来搭建拓扑图。
-
可以拖拽设备、连接线、观察数据包传输情况。
1.2. 设备选择栏(Device-Type Selection)
在下方,可以看到不同类别的设备:
-
Routers(路由器):用来连接不同网络。
-
Switches(交换机):用来连接 PC、路由器,形成局域网。
-
End Devices(终端设备):PC、Laptop、Server、Printer 等。
-
Hubs(集线器):老旧的共享设备。
-
Connections(连接线):直通线、交叉线、光纤、控制台线等。
1.3. 连接线(Connections)
-
Copper Straight-Through(直通线):不同设备之间(PC ↔ Switch)。
-
Copper Cross-Over(交叉线):相同设备之间(PC ↔ PC)。
-
Fiber(光纤):高速连接。
-
Console Cable(控制台线):PC ↔ 路由器/交换机,用来配置设备。
1.4. 逻辑视图(Logical)和物理视图(Physical)
-
Logical View:默认界面,用来画拓扑和配置。
-
Physical View:展示机房、机架的物理布局,更加直观。
1.5. 配置设备
-
双击设备 → 打开窗口,可以进行:
-
Physical:查看设备模块(比如加网卡、加串口模块)。
-
Config:基础配置(主机名、接口 IP、网关)。
-
CLI(Command Line Interface):命令行配置(比如路由器要用
no shutdown、ip address)。 -
Desktop(PC 专用):里面有 IP 配置、Web 浏览器、Command Prompt(ping)、Terminal(Console 线登录)。
-
1.6. 模拟模式(Simulation Mode)
-
默认是 实时模式(Real-time):数据立刻传输。
-
切换到 Simulation Mode:
-
可以“抓包”查看 数据包的流向。
-
观察 ARP、ICMP、TCP 等协议的工作过程。
-
对学习网络分层(OSI 七层)特别有帮助。
-
1.7. 常用工具
-
Add Simple PDU(信封图标):选择两个设备,就会自动发一个 ping 包。
-
Time Controls:可以快进/暂停/逐步执行,方便观察数据流动。
-
Inspection Tools:点击数据包,能看到每一层协议头信息。
2.IP地址和子网掩码



网络地址就是一个网段最小的IP,根据掩码最后是0或者0.0等,广播地址则是最大的IP

网关(Gateway)是一个 网络节点,用来 连接两个不同网络(子网),并负责 转发不同网络之间的数据包**。
-
默认网关(Default Gateway):当主机需要发送数据到 不在本地子网的 IP 地址 时,会把数据发送到默认网关,由网关进行转发。
3.路由器与交换机
3.1. 工作层次不同
-
交换机(Switch):主要工作在 数据链路层(第二层,Layer 2),通过 MAC 地址表 转发数据帧。
-
路由器(Router):主要工作在 网络层(第三层,Layer 3),通过 IP 地址表/路由表 转发数据包。
3.2. 功能不同
-
交换机:
-
在局域网内连接多台设备(比如 PC、打印机、服务器)。
-
根据 MAC 地址学习和转发数据,能减少广播风暴。
-
主要用于局域网内部的数据转发。
-
-
路由器:
-
负责连接 不同网络(例如家庭网络和互联网,或者不同子网之间)。
-
根据 IP 地址和路由表来决定数据包的路径。
-
可以实现 NAT(网络地址转换)、防火墙、安全策略等。
-
3.3. 地址依据不同
-
交换机:根据 MAC 地址 转发。
-
路由器:根据 IP 地址 转发。
3.4. 广播域与冲突域
-
交换机:
-
每个端口是一个独立的冲突域(避免数据冲突)。
-
但整个交换机默认是一个广播域(除非划分 VLAN)。
-
-
路由器:
-
每个接口都是一个独立的广播域,能隔离广播。
-
3.5. 常见应用场景
-
交换机:
-
办公室内,把多台电脑连到一个局域网。
-
数据中心内服务器互联。
-
-
路由器:
-
家用路由器:连接家里的 Wi-Fi 和外部网络(ISP)。
-
企业路由器:连接不同分公司网络、访问互联网。
-
4.IOS设备的连接方式

5.IOS执行模式

5.1检查命令
//显示设备ARP表• show arp• //显示交换机的MAC表(只用于交换机)• show mac-address-table• //显示路由器上所有接口的统计信息。• show ip interfaces• //查看某个接口的信息可以使用• show ip interfaces <interfaces name> • //获得接口及其运行状态的摘要信息• show ip interface brief• //显示设备上所有接口的统计信息• show interfaces• //查看某个具体接口的统计信息• show interfaces <interfaces name>• //显示当前加载的软件版本以及硬件和设备相关的信息• show version
5.2命名
//修改设备名为 myrouter• Router(config)# hostname myrouter • myrouter(config)#• //删除设备名称(还原为默认名字)• myrouter(config)# no hostname• Router(config)#
设置密码略
5.3创建用户
Device(config)# username <name> [secret <password> | privilege <level>]
5.4DNS
// 开启域名查找功能 Device(config)# ip domain-lookup // 关闭域名查找功能 Device(config)# no ip domain-lookup
6.网络接口配置
6.1启动
交换机的网络接口默认是开启的,而路由器接口默认被禁用。对于路由器要启用接口,需要在接口配置模式下输入no shutdown命令。如果因维护或故障排除而需要禁用接口,需使用shutdown命令。
Router(config)# interface GigabitEthernet0/0/0• Router(config-if)# no shutdown
路由器以太网接口用作局域网中直接连接到路由器的网络中的终端设备的网关。每个以太网接口必须拥有一个IP地址和一个子网掩码才能路由 IP 数据包。
//在全局配置模式进入接口配置模式,假设配置的网络接口为 GigabitEthernet0/0/0• Router(config)# interface GigabitEthernet0/0/0• //指定接口 IPv4 地址和子网掩码• Router(config-if)# ip address <ip_address> <netmask>• //启动接口• Router(config-if)# no shutdown
6.2SVI
想要通过 SSH 连接到某一路由器,只需要提供用户名和有权限的端口 IP 地址。但二层交换机连接设备的网络接口是不支持设置三层的 IP 地址的(也没必要支持),但交换机可以使用 SVI 技术实现 IP 地址的设置并提供远程连接。一台交换机可以有多个 SVI。 交换机的管理地址被分配给称为虚拟局域网接口(VLAN)的虚拟接口。默认情况下,该接口为 VLAN 1(交换机远程管理接口)。下例为 VLAN 1 接口分配了一个 IP 地址。此接口与路由器物理接口相似,也需通过no shutdown命令启用接口。交换机与其他主机一样,也需要一个网关地址才能与本地网络之外的设备通信,ip default-gateway命令可以为交换机设置默认网关。
Switch# configure terminal• Switch(config)# interface vlan 1• Switch(config-if)# ip address <ip_address> <netmask>• Switch(config-if)# no shutdown• Switch(config-if)# exit• Switch(config)# ip default-gateway <ip_address>• Switch(config)# exit
在二层交换机配置 SVI 的目的就一个,支持远程访问该二层交换机;而在三层交换机配置 SVI 的目的则主要是为交换机所辖 VLAN 提供默认网关,允许流量在 VLAN 之间路由(主要用在三层交换机);
7.vlan
7.1三层交换机原理
三层交换机是 结合了二层交换机和路由器功能的设备,它既能 基于 MAC 地址转发(像二层交换机一样),又能 基于 IP 地址进行路由(像路由器一样)。
7.1.1. 二层转发(Layer 2 Switching)
-
与普通二层交换机一样,三层交换机在每个端口建立 MAC 地址表。
-
当收到数据帧时:
-
检查 目标 MAC 地址
-
如果在表中,直接从对应端口转发
-
如果不在表中,执行 泛洪(发送到所有端口)
-
这是标准的二层学习和转发机制,保证同一 VLAN 内设备高速通信。
7.1.2. 三层转发(Layer 3 Routing)
-
当三层交换机收到跨 VLAN 或跨网段的数据包时:
-
检查 目标 IP 地址
-
查找 路由表(Routing Table)
-
根据路由表把数据包从正确接口转发出去
-
-
三层交换机内部通常有 硬件加速(ASIC),可以高速实现 IP 路由,比传统路由器快很多。
7.1.3. VLAN 间路由(Inter-VLAN Routing)
-
二层交换机无法让不同 VLAN 的 PC 直接通信
-
三层交换机可以在交换机内部做路由:
-
每个 VLAN 配置一个 SVI(Switched Virtual Interface)
-
给每个 SVI 配置 IP 地址
-
通过三层交换机,VLAN 之间的数据包直接在交换机内部路由,不需要外接路由器
-
示例:
VLAN 10: 192.168.10.0/24 → SVI 10: 192.168.10.1 VLAN 20: 192.168.20.0/24 → SVI 20: 192.168.20.1
PC1(VLAN10) ↔ PC2(VLAN20) → 数据包在三层交换机内部直接路由
7.2三层交换机和路由器区别
-
三层交换机 = 二层交换机 + 路由器的基本路由功能
-
它适合局域网内部高速交换和子网间路由
-
-
路由器 = 专业路由设备
-
它适合不同 LAN 或 WAN之间通信,支持更多协议和灵活策略
-
可以理解为:三层交换机在 LAN 内的“加速版路由器”,但跨广域网或复杂策略时,还是要用路由器
7.3trunk,802.1Q 协议和 Native VLAN
Access 口:只属于一个 VLAN,连到终端设备(PC、打印机等)
Trunk 口:承载多个 VLAN 流量,连接交换机或三层交换机的 VLAN 接口
VLAN Trunk 是在 交换机与交换机、交换机与路由器等设备间传递多个 VLAN 流量的链路。
也就是说,一条物理链路上可以传输 多个 VLAN 的帧,而不是每条链路只承载一个 VLAN(Access 口只对应一个 VLAN)。
IEEE 802.1Q 是 VLAN 标签标准,用于在 Trunk 链路上标识 VLAN。
每个 Ethernet 帧在发送时,会在 原始以太网帧和 CRC 校验之间插入 4 字节 VLAN Tag。
Native VLAN 是指在 Trunk 口上 不打标签的 VLAN。
默认情况下,交换机的 VLAN 1 是 Native VLAN。
7.4DTP
是 Cisco 专有协议,用于 交换机端口自动协商 Trunk 链路。
可以让两个交换机在物理连接上 自动决定端口是 Access 口还是 Trunk 口,以及使用哪种封装(802.1Q 或 ISL)。
8.EtherChannel
8.1基本概念
EtherChannel 是 把多条物理链路捆绑成一条逻辑链路的技术。
对外表现为 单个逻辑接口,可以承载 多倍带宽。
链路聚合
-
将多条物理端口(如 G0/1、G0/2、G0/3)捆绑成 一个 EtherChannel
-
外部设备看到的是 一条逻辑接口(如 Port-channel 1)
负载分配
-
数据包不会简单轮流发送,而是 基于 MAC、IP 或端口号等哈希算法分配到各条物理链路
-
保证同一会话的数据包顺序不乱
协议支持
-
PAgP(Port Aggregation Protocol):Cisco 私有协议
-
LACP(Link Aggregation Control Protocol):IEEE 802.3ad 标准
-
也可以配置为 静态 EtherChannel(no negotiation)
8.2LACP配置模式
On:强制要求接口不使用 LACP,它不会对收到的 LACP 数据包进行任何操作。基于这个模式,我们可以建立静态 EtherChannel,这也是默认的模式。 Active:开启 LACP 并将接口置于活跃协商状态,此时该接口将发送 LACP 数据包以与其他接口协商。 Passive:开启 LACP 并将接口置于被动协商状态,此时接口将会在收到 LACP 数据包时进行响应以建立 EtherChannel,但不会主动发送数据包。
9.交换机端口安全
9.1启用端口安全功能
端口安全功能只能在显式配置了 VLAN 模式(Access/Trunk)的端口上启用。在接口配置模式下,使用 switchport port-security 命令可以启用这一功能:
启用端口安全性功能后,这一端口默认只允许一个 MAC 地址访问。使用命令 switchport port-security maximum value 可以修改这一限制。
9.2学习安全端口
-
动态学习 (Dynamic)
-
交换机会自动学习端口上出现的 MAC 地址。
-
MAC 地址保存在 MAC 地址表 中,但 重启交换机后会丢失。
-
特点:临时性,适合临时接入设备。
-
静态配置 (Static)
-
手动将某个 MAC 地址绑定到指定端口。
-
这种绑定关系会保存在配置文件中,重启也不会丢失。
-
特点:最安全、最可控,但管理工作量大。
-
黏性学习 (Sticky)
-
介于动态和静态之间。
-
首先自动学习 MAC 地址,然后将这些地址 自动写入到运行配置中。
-
如果保存配置并重启,仍然有效。
-
特点:常用、管理方便。
10.路由器串行接口
串行接口是一种 WAN(广域网)接口,常用于连接不同地点的路由器。这样不同局域网(LAN)通过路由器的串行接口,就能 跨区域通信,实现“跨域交流”。
LAN—Router—Serial—Router—LAN
点对点链路:一般只连接两台设备。
需要时钟(Clock Rate):在实验或模拟环境下,一端需要提供时钟信号(通常是 DCE 端)。
支持多种封装协议:
-
HDLC(默认)
-
PPP(点对点协议,支持认证 CHAP/PAP)
带宽可配置(逻辑带宽,而不是实际速率)。
其中,DCE 端必须使用 clock rate 命令配置时钟信号
11.静态(默认)路由
11.1静态路由
从一个网络路由到短截网络(只能通过单条路由访问的网络),一般使用静态路由。
R1(config)# ip route <dest_address> <mask> <ip-address | exit_interface> [administrative_distance] # dest_address:要加入路由表的远程网络的目的网络地址; # mask:要加入路由表的远程网络的子网掩码; # ip-address:指定可用于到达该网络的下一跳路由器的IP地址; # exit_interface:将数据包转发到目的网络时使用的送出接口; # administrative_distance:路由优先级,有效范围是1–255,默认值为1
11.2默认路由
路由器转发数据时会查 路由表,按照“最长匹配原则”选择路由。
如果路由表中有更具体的路由,就用那条路由。
如果 没有任何更具体的匹配项,才会使用默认路由
默认路由是静态路由的一种,作用是在没有匹配到任何更具体的路由时,作为“兜底”来使用。
R1(config)# ip route 0.0.0.0 0.0.0.0 <ip-address | exit_interface> [metric-value]
11.3浮动静态路由
前面提到的静态路由可配置参数 administrative_distance(简称 AD,所谓管理距离),用于标识路由的优先级。静态路由的 AD 默认值为 1(本地直连路由 AD 为0),动态路由 AD 依据协议其默认值不同,但值都大于 1。 到达同一目的地有多条路由时,路由器会选择优先级最高的路由( AD值最低)。通过手动指定 AD 值,可以设置浮动静态路由,即作为当前优先级最高的路由的备份(比如将该静态路由的 AD 设置为高于某动态路由的 AD),默认不使用(路由表中只会插入优先级最高的路由)。只有当优先级最高的路由失效时,该静态路由才会被插入路由表加以应用。
12.动态路由RIPv2
启动RIPv2需要执行下面两条命令(没有第二条命令则启动RIPv1):
R1(config)#router rip R1(config-router)#version 2
自动汇总
路由汇总(Route Summarization / Aggregation):把多条连续的路由条目合并为一条更大的路由。
目的:减少路由表规模、减少更新信息、提高查找效率。
但是不支持不连续网络
在 RIPv2 中禁用自动汇总的命令为 no auto-summary。
在 RIP 路由协议配置模式下,使用 redistribute staic 指令,可将本地路由器配置的静态路由信息经由 RIP 发布出去。
13.DHCP
13.1基本概念
DHCP = 动态主机配置协议 • 作用:自动为网络中的主机分配 IP 地址、子网掩码、网关、DNS 等网络信息,免去手动配置
DHCP有三种机制分配IP地址: 自动分配:DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。 动态分配:DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。 手工分配:客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。
13.2配置应用
13.2.1配置 DHCP 池
Router(config)# ip dhcp pool LAN_POOL Router(dhcp-config)# network 192.168.1.0 255.255.255.0 Router(dhcp-config)# default-router 192.168.1.1 Router(dhcp-config)# dns-server 8.8.8.8 R1(config-config)# network <network_number> [<mask>]:定义可用地址范围 R1(config-config)# default-router <address> [<address2>...<address8>]:定义默认网关(路由器),至少指定一个,最多可指定8个 R1(config-config)# dns_server <address> [<address2>...<address8>]:指定DNS服务器,最多可指定8个 R1(config-config)# domain-name <domain>:指定域名
13.2.2排除不分配的 IP
Router(config)# ip dhcp excluded-address 192.168.1.1 192.168.1.10 R1(config)# ip dhcp excluded-address <low_address> [<high_address>]
避免 DHCP 分配给路由器、服务器等关键设备的 IP。
13.2.3使用
show ip dhcp binding该命令会显示DHCP服务器提供的所有IP地址到MAC地址的绑定
show ip dhcp pool <pool_name>则可查看当前IP池状态:
Router(config)# interface g0/0/1 Router(config-if)# ip address dhcp
14.NAT
14.1基本概念
NAT 即 Network Address Translation,网络地址转换,是一种将私有(保留)地址转化为合法IP地址的转换技术,这种技术被普遍使用在有多台主机但只通过一个公有IP地址访问互联网的私有网络中; NAT的主要用途是让网络能够使用私有IP地址以节省IP地址,因为NAT将不可路由的私有内部地址转换为可路由的公有地址; NAT在一定程度上改善了网络的私密性和安全性,因为它对外部网络隐藏了内部IP地址;
14.2转换类型
| 类型 | 说明 |
|---|---|
| 静态 NAT | 一对一映射:内部固定 IP ↔ 公网固定 IP |
| 动态 NAT | 内部 IP → 公网 IP 池,按需分配 |
| PAT / NAPT(端口地址转换) | 多对一映射(也叫“端口映射”),内部多台主机共享一个公网 IP,不同端口区分流量 |
| 双向 NAT | 内外网都可以使用 NAT 映射访问对方(不常用) |
14.3原理
内网主机向外网发送数据包:
-
源 IP = 内网私有 IP(如 192.168.1.10)
-
NAT 将源 IP 替换为路由器的公网 IP(如 1.2.3.4)
-
并记录转换关系(端口号映射)
外网返回数据包:
-
目的 IP = 路由器公网 IP
-
NAT 查找映射表,把目的 IP 转回内网主机 IP
14.4配置方式
-
静态 NAT(1:1)
Router(config)# ip nat inside source static 192.168.1.10 1.2.3.4
-
动态 NAT(内网 IP → 公网 IP 池)
Router(config)# ip nat pool MY_POOL 1.2.3.4 1.2.3.10 netmask 255.255.255.0 Router(config)# access-list 1 permit 192.168.1.0 0.0.0.255 Router(config)# ip nat inside source list 1 pool MY_POOL
-
PAT(端口映射 / 多对一)
Router(config)# access-list 1 permit 192.168.1.0 0.0.0.255 Router(config)# ip nat inside source list 1 interface serial 0/0 overload
overload表示启用端口复用,实现多台内网主机共享一个公网 IP
15.SDN
15.1实现方式
在 SDN 架构里,通常分为三层:
-
应用层(Application Plane)
-
各种网络应用(流量工程、负载均衡、防火墙、QoS 等)。
-
-
控制层(Control Plane)
-
集中式控制器(如 ONOS、OpenDaylight),负责计算路由、制定策略。
-
-
数据层(Data Plane / Forwarding Plane)
-
真正转发数据包的部分(交换机/路由器的硬件转发引擎)。
-
利用 OpenFlow,控制器通过 OpenFlow 协议下放规则(例如流表、组表等)到 OpenFlow 交换机上,交换机就根据这些定义好的规则控制数据包的行为
openflow和p4的最大区别在于交换机行为是由交换机自己控制,还是由 SDN 控制器远程控制。这两种技术可以共同使用。
15.2ovs
15.2.1概念
OVS 中部分重要概念与传统网络以及 OpenFlow 协议都是对应的: Bridge:网桥,一个 Bridge 代表一个以太网交换机(Switch),Bridge可以根据一定的规则,把某一个端口接收到的数据报文转发到另一个或多个端口上,也可以修改或者丢弃数据报文。 Port:端口,雷神物理交换机上的插口。Port 隶属于 Bridge,必须先添加了 Bridge 才能在 Bridge 上添加 Port。 Interface:接口是OVS与操作系统交换数据报文的组件,一个接口即是操作系统上的一块网卡,这个网卡可能是 OVS 生成的虚拟网卡,也有可能是挂载在 OVS 上的物理网卡 Controller:OpenFlow控制器,OVS可以接收一个或者多个OpenFlow控制器的管理,功能主要是下发流表,控制转发规则。 Flow:流表是OVS进行数据转发的核心功能,定义了端口之间转发数据报文的规则,一条流表规则主要分为匹配和动作两部分,匹配部分决定哪些数据报文需要被处理,动作决定了匹配到的数据报文该如何处理。
15.2.2命令
添加网桥:ovs-vsctl add-br 交换机名 删除网桥:ovs-vsctl del-br 交换机名 添加端口:ovs-vsctl add-port 交换机名 端口名(网卡名) 删除端口:ovs-vsctl del-port 交换机名 端口名(网卡名) 连接控制器:ovs-vsctl set-controller 交换机名 tcp:IP 地址:端口号 断开控制器:ovs-vsctl del-controller 交换机名 列出所有网桥:ovs-vsctl list-br 列出网桥中的所有端口:ovs-vsctl list-ports 交换机名 列出所有挂接到网卡的网桥:ovs-vsctl port-to-br 端口名(网卡名) 查看 open vswitch 的网络状态:ovs-vsctl show 查看 Open vSwitch 中的端口信息(交换机对应的 dpid,以及每个端口的OpenFlow 端口编号,端口名称,当前状态等等):ovs-ofctl show 交换机名 修改 dpid:ovs-vsctl set bridge 交换机名 other_config:datapath-id=新 DPID 修改端口号:ovs-vsctl set Interface 端口名 ofport_request=新端口号
15.3网络命名空间
网络命名空间(Network Namespace, 简称 netns) 是 Linux 内核提供的一种 虚拟化隔离机制,用于隔离网络资源。
在同一台 Linux 主机上,你可以创建多个网络命名空间,每个命名空间都有独立的:
-
网络接口(eth0、lo 等)
-
路由表
-
防火墙规则(iptables/nftables)
-
套接字(sockets)
简单理解:每个网络命名空间就像一台虚拟独立的主机,它们之间的网络互不干扰。
15.4mininet
15.4.1方法:
启动:sudo mn
addHost():添加主机 addSwitch():添加交换机 addLink():添加链路

15.4.2创建数据平面
mn --custom topo1.py --topo mytopo
或使用python脚本创建
from mininet.topo import Topo
class MyTopo(Topo):
def __init__(self):
Topo.__init__(self)
host1 = self.addHost("h1")
host2 = self.addHost("h2")
switch1 = self.addSwitch("s1")
switch2 = self.addSwitch("s2")
switch3 = self.addSwitch("s3")
switch4 = self.addSwitch("s4")
self.addLink(host1, switch1)
self.addLink(switch1, switch2)
self.addLink(switch2, switch3)
self.addLink(switch3, switch4)
self.addLink(switch4, host2)
topos = {"mytopo": (lambda: MyTopo())}
mn --custom topo1.py --topo mytopo
16.openflow
16.1openflow交换机
OpenFlow 交换机可以分成流表/组表和安全通道两部分。在 OpenFlow 规范中,控制器可以给交换机下发流表项来指导交换机处理匹配流表项的数据包。安全通道是用于和控制器通信的安全连接。安全通道可以直接建立在 TCP 上,也可以使用 TLS 加密通信。
16.2openflow端口
端口(port)是数据包进入或离开 OpenFlow 流水线的位置,是交换机接收和转发数据包的位置。交换机通过端口和其他网络设备或主机建立逻辑连接。
端口类型包括: 物理端口:是交换机定义的端口,它与普通的物理交换机类似,就像以太网交换机上的物理端口与以太网接口(interface)一一对应。 逻辑端口: 是对物理端口的更高层次的抽象,例如实现链路聚合、隧道等,提高可复用性。逻辑端口与物理接口唯一的区别是逻辑接口的数据包可能会由有额外的 tunnel_id 字段; 保留端口 :指定一些特定而通用的转发动作,包括: ALL:将数据包转发给所有出端口,但不包括入端口,仅可用作输出端口 CONTROLLER:作为出端口时封装数据包并转发给控制器,作为入端口时会匹配控制器发来的数据包 TABLE:对 packet_out 数据包执行流表操作 LOCAL:转发给本地的网络栈 IN_PORT:转发回入端口,仅可用作输出端口 NORMAL:利用传统交换机的转发机制处理数据包,仅可用作输出端口 FLOOD:将数据包复制并转发至所有的标准端口,仅可用作输出端口 其中标准端口包括物理端口、逻辑端口和 LOCAL 端口。许多 OpenFlow-only 的交换机不支持 NORMAL 与 FLOOD 端口,尤其是物理交换机。但是 OVS 支持以上所有端口
16.3openflow流表
OpenFlow流表主要的作用通过匹配动作(Match-Action)模型,来对报文进行一些指令化的操作
-
本质:每条流表条目对应 一种流量匹配 + 处理方式。
-
作用:匹配特定流量,然后执行指定动作(输出、修改头部、跳转到下一张表、写计量器等)。
-
特点:单条条目处理单条流,精细到五元组(src/dst IP、端口、协议等)。
16.3.1openflow流表字段
match fields: 用来匹配网络报文的字段,比如报文进入的端口、报文头部信息以及其它的元信息。 priority: 表项的匹配优先级 counters: 匹配流表的报文的数量 instructions: 流水线处理中用来修改动作集(action set)的指令集 timeouts: 流表的有效时间,超过时间会过期 cookie: 控制器用来过滤流的统计数据,流表修改以及流表的删除
16.3.2openflow流表行为
必备动作:需要所有 OpenFlow 交换机必须提供支持 转发(Forward):转发至物理端口或虚拟端口(ALL、CONTROLLER、TABLE、LOCAL、IN_PORT) 丢弃(Drop):交换机对没有明确动作指示的流表项,将会对与其匹配的数据包默认执行丢弃操作 可选动作:需要交换机告知控制器它所能支持的动作种类 转发(Forward):转发至物理端口或虚拟端口、保留端口(NORMAL、FLOOD等) 排队(Enqueue):交换机将数据包转发到某个出端口对应的转发序列中,便于提供QOS支持 修改域(Modify-Field):交换机修改包头的具体字段包括: 设置VLAN ID、VLAN优先级、剥离VLAN头 修改源MAC地址、目的MAC地址 修改源IPv4地址、目的IPv4地址、IP ToS位
16.4openflow组表
16.4.1概念
本质:是一组流表动作的集合,流表可以引用组表来执行动作。
作用:支持 一条流对应多个动作组合,如:
-
ALL → 广播/多播
-
SELECT → 负载均衡
-
FF → 快速故障恢复
理解:流表 = 单条流的处理方式;组表 = 多条动作的组合(可以让一条流实现复杂操作)。
16.4.2组表字段
group identifier: 唯一标识一个组的 32 位无符号整型数据 group type: 组的类型,定义组该怎么处理动作桶(action bucket) counters: 该组表项处理过的报文数量 action buckets: 一个有序的动作桶(action buckets)列表, 每一个动作桶(action bucket)都包含有可以执行的动作集合(action set)以及相关的参数。
16.4.3类型
OpenFlow 1.3主要支持的组的类型有:all、select、indirect、fast failover,其中all是在标准里面指定必须实现的 all: 执行组里面的所有action buckets. 这种组表项用于多播和广播转发。报文会被复制到每一个动作桶,并且被每个动作桶处理。 select: 执行组里面的一个动作桶,组会选择一个动作桶来处理,由选择算法来选择具体的策略(可以基于hash来选择或者简单的round robin算法),这个类型可以用来实现交换机端口的负载均衡 indirect: 只有一个动作桶的组 fast failover: 执行第一个“存活”的动作桶。在这种类型下,每一个动作桶都会与指定的端口或组联系,以此来控制它的存活性。这种类型可以让交换机在链路中断的情况下,实现动态路由。
16.5计量表
16.5.1概念
-
本质:对流量做 限速、统计或标记 的表。
-
作用:
-
限速(Rate limiting):当流量超过 Band 阈值,执行 Drop 或 Remark。
-
统计(Counters):记录流量大小,用于流量监控或策略判断。
-
-
特点:流表条目可以写计量器,但计量器本身不处理转发,只控制速率或统计。
16.5.2字段
meter identifier: 一个32位无符号整数,唯一标识计量器 meter bands: meter band 的无序列表,其中每个meter band指定频带的速率和处理数据包的方式 counters: 由计量器处理数据包时更新
16.5.3Meter Bands 字段
计量表中,最重要的设计是meter band,meter band 的结构如下: rate: 计量表使用它来选择仪表频段,定义频段可以应用的最低速率 type specific arguments: 一些特定的参数 OpenFlow 1.3 定义了两种可选的 band types,分别是 drop 和 dscp remark。 drop: 丢弃(丢弃)数据包。 可用于定义基于流表的速率限制器,实现简单的QoS功能。 dscp remark: 降低数据包 IP 报头中 DSCP 字段的丢弃优先级。 可用于定义一个简单的 DiffServ 策略程序。
16.6pipeline
OpenFlow 交换机里面有多张流表,它们通过流水线(Pipeline)机制进行匹配转发。多张OpenFlow表从0开始编号。流水线处理过程从第一张表开始匹配报文,一张表里面有多个匹配的流表项就选择优先级最高的,报文匹配流表项后,OpenFlow就会执行匹配到的流表项指定的指令集(instruction set),指令集往往包含修改报文,更改报文匹配属性,更改动作集(action set)等操作。如果指令集有Goto指令,那么就会跳转到该指令指定的下一个流表进行匹配,同时用来进行下一次匹配的属性是执行指令集后修改过后的匹配数据(match data)。如果指令集不存在 Goto,那么流表匹配结束,执行报文的动作集(action set)。此外,如果报文没有匹配任何一个流表项(flow entry),那么会触发(table miss) 事件,这时会根据配置,选择将报文丢弃、发送给控制器或者传递给其它的流表匹配。

17.SDN控制平面
17.1概述
SDN 控制平面通常由一个或多个 SDN 控制器(Controller) 组成,是整个 SDN 网络的“大脑”。
┌────────────────────────────┐ │ 应用平面(Application Plane)│ ← 提供网络策略与业务逻辑(如负载均衡、QoS等) ├────────────────────────────┤ │ 控制平面(Control Plane) │ ← 由一个或多个 SDN 控制器组成,负责集中控制与决策 ├────────────────────────────┤ │ 数据平面(Data Plane) │ ← 由交换机、路由器等设备组成,负责具体数据转发 └────────────────────────────┘
SDN 控制平面不在交换机上,而是独立部署在控制器中;交换机只负责执行控制器下发的转发规则。
(1)南向接口(Southbound Interface)
-
用于控制平面与数据平面的通信。
-
上行通道:数据平面向控制平面上报状态信息,如拓扑、链路、流量统计等。
-
下行通道:控制平面向数据平面下发控制指令,实现流表下发、策略执行等功能。
-
常用协议:OpenFlow、NetConf、gRPC 等。
(2)北向接口(Northbound Interface)
-
用于控制平面与应用平面的交互。
-
控制器通过该接口向上层提供 网络资源抽象和可编程接口。
-
上层应用可以基于这些抽象信息进行策略决策,再由控制器将决策落实到底层网络中
17.2ONOS
17.2.1概念
ONOS 是开放网络操作系统的简称,它是一个开源 SDN 控制器,可以管理多种网络设备(如 SDN 交换机),以向终端主机和相邻网络提供通信服务。
核心功能
分布式核心平台,提供高可扩展性、高可用性以及高性能,实现运营商级SDN控制平面特征。ONOS以集群方式运行的能力使得SDN控制平台和服务提供商网络具有类似Web风格的灵活性。 北向接口抽象层/APIs,将网络和应用与控制、管理和配置服务的发展解耦。这个抽象层也是SDN控制平台和服务提供商网络具有类似Web风格灵活性的因素之一。 南向接口抽象层/APIs,通过插件式南向接口协议可以控制OpenFlow设备和传统设备。南向接口抽象层隔离ONOS的核心功能和底层设备,屏蔽底层设备和协议的差异性。南向接口是从传统设备向OpenFlow白牌设备迁移的关键。 软件模块化,让ONOS像软件系统一样,便于社区开发者和提供者进行开发、调试、维护和升级。
17.2.2部署
使用如下命令可以实现基于 Docker 容器引擎的 ONOS 控制器部署,该命令成功执行后,Docker 容器引擎会检查系统中是否存在 onosproject/onos:2.7.0 镜像,若不存在则从 DockerHub 中获取。获取成功后按指令实现控制器的部署: $ sudo docker run -d \ -p 6653:6653 -p 8101:8101 -p 8181:8181 \ --restart=always \ --name onos \ onosproject/onos:2.7.0 下面是命令参数的解释: -d:使控制器后台运行 -p:实现端口映射到本地。ONOS 常用端口包括: 8181:ONOS 的 REST API 与 Web 页面 8101:ONOS 的 CLI 6653:用于 OpenFlow 通信 --restart=always:实现 ONOS 容器的开机自启动 --name onos:为该容器命名为 onos
17.2.3Application
ONOS 提供丰富的插件系统,插件在 ONOS 中被称为 Application。ONOS 提供了许多插件以提供各种 SDN 支持,例如支持 OpenFlow 相关操作、支持 P4 相关、支持集群化等。这些插件默认是关闭状态,如果需要用到某些插件的功能需要手动进行激活。
使用 ssh 工具可以连接到服务器并对其进行配置,ONOS 开放端口 8101 用于 SSH 通信,默认用户名与密码均为 karaf。ONOS 提供的 SSH 协议只支持 ssh-rsa 加密,因此需要指定加密套件。进入 CLI 界面后,通过 app activate 命令可以激活插件:
ssh -p 8101 karaf@<onos-host> -o HostKeyAlgorithms=+ssh-rsa
17.2.4mininet连接
在已启动 ONOS 的情况下,使用如下命令创建的数据平面中的 OpenFlow 交换机将会连接到这一 ONOS 控制器上,注意要保证 Mininet 所在主机与 ONOS 之间网络联通
mn --custom topo1.py --topo mytopo
$ sudo mn --controller=remote,ip=127.0.0.1,port=6653 \ --mac --switch=ovs,protocols=OpenFlow13
$ sudo mn --custom topo1.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6653 \ --mac --switch=ovs,protocols=OpenFlow13
p4代码是每个交换机定时自动发带上时间戳的探测包,然后收到包的交换机用现在的时间想减得到时延,通过先后顺序记录方向上传onos app,onos app只需要调用接口上传得到的时延,在python对应的地方用mysql保存,
17.2.5常用命令
<onos-host>:8181/onos/ui/login.html访问
help 命令可以列出 ONOS CLI 所有可用指令,help <command> 命令可以输出对应命令的帮助,例如获取命令 onos:devices 的帮助信息:
onos:devices:获取网络设备信息
onos:hosts:获取数据平面主机信息
onos:links [device-id]:获取数据平面链路信息,或指定网络设备有关的链路信息
onos:flows [state] [device-id] [table-id]:获取流表信息,或基于流表状态、设备 ID、流表 ID 过滤流表,其中的数据与 sudo ovs-ofctl dump-flows <device-name> 应当是一致的。
18.SDN南向协议OpenFlow通信分析
18.1openflow消息类型
OpenFlow 协议支持三种信息类型:Controller-to-Switch,Asynchronous 和 Symmetric,每一个类型都有多个子类型。Controller-to-Switch 信息由控制器发起并且直接用于检测交换机的状态。Asynchronous 信息由交换机发起并通常用于更新控制器的网络事件和改变交换机的状态。Symmetric 信息可以在没有请求的情况下由控制器或交换机发起。
18.2Controller-to-Switch
Controller-to-Switch 消息是指从控制器发往交换机的消息,主要包括以下几类: Features:在建立传输层安全会话(Transport Layer Security Session)的时候,控制器 发送 feature 请求消息给交换机,交换机需要应答自身支持的功能; Configuration:控制器设置或查询交换机上的配置信息。交换机仅需要应答查询消息; Modify-state:控制器管理交换机流表项和端口状态等; Read-state:控制器向交换机请求一些诸如流、网包等统计信息; Packet-out:控制器通过交换机指定端口发出网包; Barrier:控制器确保消息依赖满足,或接收完成操作的通知。
18.3Asychronous
Asychronous(异步消息):交换机向控制器发送的消息,主要包括以下几类: Packet-in:交换机收到一个数据包,若有发往控制器的流表或在流表中没有匹配项,则发送 Packet-in 消息给控制器; Flow-removed:交换机中的流表项因为超时或修改等原因被删除掉,会触发Flow-removed 消息; Port-status:交换机端口状态发生变化时(例如 down 掉),触发 Port-status消息;
18.4Symmetric
Symmetric(对称消息):对称消息可以由任意一方发起,包括如下几类: Hello:交换机和控制器用来建立连接; Echo:交换机和控制器均可以向对方发出 Echo request 消息,接收者则需要回复 Echo reply 消息。该消息用来测量延迟、是否连接保持等; Error:交换机发生问题时触发消息。
18.5主要通信流程
Open Flow的主要通信流程为:当交换机和控制器建立完 Socket 通信之后,会相互发送 Hello 报文,用于协商协议版本。完成协议版本协商之后,控制器会向交换机下发Features Request报文,交换机则需回复 Feature Reply 报文。控制器根据交换机支持的特性,可以完成交换机的相关配置。配置完成之后,进入正常通信状态。如果 Open Flow 版本支持多级流表,控制器还需要下发 Table-Miss 流表项到交换机。当数据包匹配流表失败或者匹配到 Table-Miss时,交换机将其packet-in到控制器,控制器根据控制逻辑可选择回复packet-out或者下发 Flow-mod指导交换机处理数据流。如果配置了Flow-Removed 标志位,则当流表项过期时,交换机将向控制器回复Flow-Removed报文。其他异步报文的发生则可以发生在任意时刻。为保持 OpenFlow 连接的活性,控制器应周期性地向交换机发送Echo报文。

18.6wireshare
sudo tshark -i [接口] -f "过滤器" -w onos_openflow.pcap(保存)-Y openflow
-f 捕获过滤器(Capture Filter) 决定 tshark 抓哪些包 -f "tcp port 6653"
-Y 显示过滤器(Display Filter) 决定 tshark 显示哪些包(在已捕获的包中筛选) -Y "openflow"
19北向接口
19.1接口文档
http://<onos-host>:8181/onos/v1/docs/
19.2常用接口
19.2.1device
GET /devices 获取所有设备信息 GET /devices/ports 所有设备端口信息 GET /devices/{id} 获取指定设备信息 GET /devices/{id}/ports 获取指定设备及设备的端口信息 DELETE /devices/{id} 删除某一设备 POST /devices/{id}/portstate/{port_id} 配置某一设备某一端口的状态
19.2.2host
DELETE /hosts/{mac}/{vlan} 根据 MAC 地址和 VLAN 移除主机。请注意,这并不是在数据平面(例如 Mininet 中)移除,只是暂时在数据库中移除。 GET /hosts/{mac}/{vlan} 获取指定 MAC 地址和 VLAN 的主机的信息 GET /hosts/{id} 根据主机 ID 获取主机的信息 GET /hosts 获取所有主机的信息
19.2.3link
GET /links 获取(所有)链路信息(可以指定查询参数)
19.2.4flows
流表的操作一般有三种:获取当前流表信息、下发流表、删除流表,这三者分别使用GET、POST、DELETE三种语义明确的动词来处理。
20常见问题
20.1onos app
docker访问地址与宿主机地址不同,映射关系http://127.0.0.1:8000
docker内访问onos cli
docker exec -it onos bash
命令行./apache-karaf-*/bin/client
重启docker restart onos
跟踪日志
log:set INFO org.example.packet2py
log:tail
编译p4文件
p4c --target bmv2 --arch v1model --out my_program.json my_program.p4
加载到 BMv2 交换机
sudo simple_switch --device-id 0 --log-file simple_switch_log --cpu-port 255 my_program.json
21.p4
1. 基本结构
P4 程序通常由以下几个部分组成:
-
Header 类型(header types):定义数据包头的结构。
-
Parser(解析器):将网络数据包解析成结构化的格式。
-
Control Block(控制块):定义数据包处理的行为(例如匹配-动作表)。
-
Deparser(反解析器):将处理后的数据包重新打包成网络格式。
2. 数据包头(Header)
数据包头(Header)定义了每个数据包的各个字段。通过定义头结构,P4 能够解析和处理这些数据。可以使用 header 和 struct 关键字来定义。
例子:
// 定义以太网头
header ethernet_t {
bit<48> dst_addr; // 目标 MAC 地址
bit<48> src_addr; // 源 MAC 地址
bit<16> ether_type; // 协议类型(例如,IPv4, ARP)
}
-
bit<48>表示一个 48 位宽度的字段,通常用于 MAC 地址。 -
bit<16>表示一个 16 位宽度的字段,通常用于协议类型(EtherType)。
3. 解析器(Parser)
解析器的任务是从原始数据包中提取不同协议的字段并将其解析为结构化数据。P4 使用 parser 来定义如何提取数据包头。
例子:
parser start {
extract(eth); // 从数据包中提取以太网头
return select(eth.ether_type) {
0x0800: parse_ip; // 如果 EtherType 是 0x0800(IPv4),继续解析 IP 头
0x0806: parse_arp; // 如果 EtherType 是 0x0806(ARP),解析 ARP 头
default: drop;
}
}
-
extract(eth)表示从数据包中提取eth(以太网头)。 -
select(eth.ether_type)根据ether_type字段的值来选择下一个解析步骤(例如,IPv4 或 ARP)。 -
drop表示丢弃当前数据包。
4. 控制块(Control Block)
控制块是 P4 中的核心部分,定义了如何处理数据包。处理通常通过 匹配-动作表(match-action table)来完成。匹配-动作表会根据数据包的字段来执行相应的动作。
例子:
control ingress {
apply {
if (eth.dst_addr == 0x123456789abc) {
// 如果目标地址是特定的 MAC 地址,进行某个动作
output_port = 1; // 将数据包发送到端口 1
} else {
// 默认行为,转发到端口 2
output_port = 2;
}
}
}
-
ingress是一个控制块的名称,表示数据包进入交换机时的处理过程。 -
apply语句用于应用数据包处理规则。
5. 匹配-动作表(Match-Action Table)
匹配-动作表(MAT)是 P4 中用于匹配数据包并执行特定动作的表。P4 程序通过 MAT 来处理数据包的不同特征。
例子:
// 定义一个匹配-动作表
table my_table {
keys = {
eth.dst_addr: exact; // 精确匹配目标 MAC 地址
}
actions = {
drop; // 丢弃数据包
forward; // 转发数据包
}
}
-
keys定义了用于匹配的数据包字段(例如目标 MAC 地址)。 -
actions定义了可以对匹配的数据包执行的动作(例如丢弃或转发)。
6. 动作(Actions)
动作是在匹配-动作表中匹配到某个数据包时执行的具体操作。例如,可以定义一个简单的动作将数据包转发到特定端口。
例子:
action forward(bit<9> port) {
standard_metadata.egress_spec = port;
}
action drop() {
mark_to_drop();
}
-
forward动作将数据包转发到指定的端口。 -
drop动作将数据包丢弃。
7. 反解析器(Deparser)
反解析器用于将经过处理的数据包重新格式化,并准备发送到下游设备。反解析器通常包括将各个协议头按顺序重新组合。
例子:
deparser end {
emit(eth); // 重新将以太网头输出到数据包中
}
-
emit(eth)将数据包的以太网头添加到输出的数据包中。
8. 完整的 P4 程序示例
下面是一个简单的 P4 程序,展示了如何解析以太网头,并根据目标 MAC 地址转发数据包。
// 定义以太网头
header ethernet_t {
bit<48> dst_addr;
bit<48> src_addr;
bit<16> ether_type;
}
// 解析器
parser start {
extract(eth);
return select(eth.ether_type) {
0x0800: parse_ip;
default: drop;
}
}
// 控制块
control ingress {
apply {
if (eth.dst_addr == 0x123456789abc) {
output_port = 1; // 如果目标地址匹配,发送到端口 1
} else {
output_port = 2; // 默认发送到端口 2
}
}
}
// 反解析器
deparser end {
emit(eth);
}
// 动作
action forward(bit<9> port) {
standard_metadata.egress_spec = port;
}
action drop() {
mark_to_drop();
}
9. 编译和运行 P4 程序
-
编写 P4 程序:如上所示,编写 P4 程序文件。
-
编译程序:使用 P4 编译器(如
p4c)将程序编译为可以在硬件或软件平台上运行的配置。p4c --target bmv2 --arch v1model --output p4_program.p4 <your_p4_file.p4>
-
部署和测试:将编译后的程序部署到支持 P4 的交换机或模拟器(如 BMv2)上,使用测试流量验证程序的正确性。
更多推荐
所有评论(0)