随着互联网和数据中心流量的爆炸式增长,SDN 已经逐步取代静态路由交换设备成为构建网络的主流方式,本系列是免费电子书《Software-Defined Networks: A Systems Approach》的中文版,完整介绍了 SDN 的概念、原理、架构和实现方式。原文: Software-Defined Networks: A Systems Approach
SDN 的未来
SDN 还处于早期阶段,云托管的控制平面已经部署在生产网络中,但在接入网应用 SDN 以及在数据平面应用可编程流水线还只是刚刚开始。企业在不同程度上采用了网络虚拟化和 SD-WAN,但传统网络仍远多于 SDN 网络。
随着技术的成熟和 API 的稳定,我们期望看到越来越多的人采用前面讨论的用例,但对 SDN 最终扮演的角色影响最大的可能是还没有出现的新用例。事实上,支持传统网络中不可能实现的功能的能力是 SDN 承诺的重要组成部分。
本章着眼于一个很有前途的机会: 围绕正确性的验证。众所周知,网络很难对失败、攻击和配置错误进行健壮性和安全性的验证。虽然多年来网络验证一直是令人感兴趣的领域,但由于网络缺乏明确的抽象概念,限制了可以取得的进展。大多数网络仍然使用封闭/专有的软件和复杂/固定功能的硬件,其设计来源不明,其正确性很难被证明。众所周知,确定网络如何运行的分布式算法是很难推理的,BGP 就是一个典型,其故障模式已经让研究人员和实践者忙碌了几十年。
5G 网络及相关应用的出现只会加剧这种情况。5G 网络不仅将连接智能手机和人,还将连接从门铃、电灯、冰箱、自动驾驶汽车和无人机等一切事物。如果我们不能正确配置和保护这些网络,网络灾难的风险将比迄今为止所经历的任何事情都要严重得多。
可靠和安全的互联网的关键能力是可验证性,从而确保网络中的每个包遵循运营商指定的路径,并且只在运营商希望的设备中匹配一组转发规则,不多不少。
经验表明,在整个系统以组合(即解耦)的方式构建的环境中,可以最好的实现验证。因为这样能够对小块组件进行推理,从而使验证变得容易处理,将组件组合到复合系统中所需的推理也可以带来洞见。以解耦为基础,可验证性来自于(a)在网络级别而不是设备级别上陈述意图的能力,以及(b)在细粒度和实时观察行为的能力。 这正是 SDN 带来的价值,这让人们乐观的认为,可验证的闭环控制现在已经触手可及。
延伸阅读:
N. Foster, et. al. Using Deep Programmability to Put Network Owners in Control. ACM SIGCOMM Computer Communication Review, October 2020.
图 60 说明了其基本思想。本书介绍的软件栈增强了可验证闭环控制所需的测量、代码生成和组件验证能力。基于 INT(Inband Network Telemetry)实现的细粒度测量,允许转发组件对每个包进行标记,以表明经过的路径、经历的排队延迟以及匹配的规则。这些度量可以被分析,并反馈到代码生成和正式的验证工具中。该闭环补充了解耦的内在价值,使得根据构造进行正确推理成为可能。
图 60. INT 生成精细的测量值,这些测量值反过来提供验证网络行为的闭环控制回路。
其目标是使网络运营商能够自顶向下指定网络行为,在每个接口上验证正确性。在最低层,P4 程序指定如何处理数据包,这些程序编译后在转发平面组件内执行。这种方法代表了传统设计中不可能实现的新的基本功能,提供了如下两个关键见解。
首先,虽然网络控制平面本质上很复杂,但通过 P4 数据平面捕捉网络的真实情况,因此是部署验证技术的极有吸引力的平台。通过观察并验证数据平面级别的行为,可以减少可信计算的基础: 交换机操作系统、驱动程序和其他低级组件不需要被信任。此外,虽然控制平面倾向于用通用语言编写,并且比较复杂,但数据平面必然相对简单,并且最终被编译成具有简单数据类型和有限状态的高效前馈流水线体系结构。在一般情况下,对通用软件进行验证是不可能的,但数据平面验证功能强大且实用。
这种实用性的主张基于当前的先进技术,一旦知道了转发行为,就可以通过转发表状态来定义。例如,如果已知所有路由器都是 IPv4 转发,那么所有路由器的转发表状态就足以定义网络行为。这种想法已经被 Veriflow 和 Header Space Analysis(HSA)等技术简化为实践,现在已经商业化。知道这种状态足以验证具有固定转发行为的网络意味着我们"仅仅"增加了一个新的自由度: 允许网络运营商使用 P4 对转发行为进行编程(并随着时间的推移进行进化)。使用 P4 对数据平面进行编程是关键: 该语言小心排除了循环和基于指针的数据结构等特性,这些特性通常会使分析不切实际。要了解更多关于这个机会的信息,推荐 Jed Liu 及其同事的一篇论文。
延伸阅读:
J. Liu, et. al. p4v: Practical Verification for Programmable Data Planes. ACM SIGCOMM 2018.
自上而下的验证(Top-Down Verification)
本章描述的验证网络的方法类似于芯片设计中使用的方法。最上面是行为模型,然后在寄存器转移级别是 Verilog 或 VHDL 模型,最后在下面的是晶体管、多边形和金属。通过工具在每个边界和抽象级别上正式验证正确性。
这就是我们在这里讨论的一个模型: 在自顶向下的设计方法中跨边界验证。这是由软件栈定义的新的 SDN 接口和抽象实现的,一直扩展到交换芯片提供的可编程转发流水线。
硬件验证的经验表明,这种方法在组合系统中最有效,每个最小组件都可以单独验证或可靠的测试。然后,当组件在层边界上组合时,就应用正式的工具。
第二个观点是,除了构建分析网络程序的工具之外,开发将网络运营商的高级意图映射到实现该意图的代码的技术也很重要。目前的网络验证方法面临的挑战之一是,它们以现有网络设备及其复杂的分布式控制平面为出发点,建立这些控制平面行为的数学模型。如果现实与模型不精确匹配,那么验证就不能确保网络按要求运行。但是在 SDN 的集中控制模型中,控制平面被设计成将一个集中指定的请求映射成一组可以在数据平面中实现的控制指令。我们开始看到 SDN 控制平面本身是由其所需属性的高级规范编译而成的系统。因此,可以希望看到的控制平面是正确构建的,而不用试图建立模型,以准确捕捉历史上难以分析的系统行为,比如 BGP<sup>[1]</sup>。
[1] 在域间路由领域,很难想象 BGP 会完全消失,但至少对于大量域内用例来说,为可验证性设计的机会似乎是可能的。
图 61. 展望未来,SDN 的第三阶段专注于可验证的、自上而下的网络行为控制。
为了将这一切放在历史背景中,图 61 说明了 SDN 的三个阶段的视图。公平的说,我们处于第二阶段的早期,最先进的运营商已经能够通过分散的控制平面控制他们的软件,通过 P4 可编程数据平面控制数据包处理。我们看到了第三阶段的兴起,在此期间,可验证的闭环控制将使网络运营商获得定义其网络的软件的完全所有权。他们不仅能够通过软件来确定网络的行为,而且还能够提供网络实现他们的意图。就像硬件行业在芯片投入生产之前就已经建立了高度的信心,相信芯片会按照预期工作一样,网络运营商也会相信他们的网络是可靠的、安全的,并且满足他们指定的目标。
动手编程
本书提供了一组编程练习,用来实践书中描述的软件,包括:
- 使用 Stratum 的 P4Runtime、gNMI、OpenConfig 和 gNOI 接口
- 使用 ONOS 控制 P4 可编程交换机
- 编写 ONOS 应用程序实现控制平面逻辑
- 在 Mininet 中使用 bmv2 测试软件栈
- 使用 PTF 测试基于 P4 的转发平面
这些练习假设你熟悉 Java 和 Python,每个练习都附带初学者代码,因此不需要很高的熟练程度。练习也使用 Mininet 网络模拟器,基于 P4 的 bmv2 交换机模拟器,PTF 包测试框架,以及 Wireshark 协议分析器。关于这些软件工具的附加信息在单独的练习中提供。
这些练习起源于 ONF 制作的下一代 SDN 教程,附带一系列在线教程幻灯片,介绍了练习中涉及的主题:
这些幻灯片与这本书涉及的材料有很大重叠,所以不必从幻灯片开始学习,但是很好的补充资源。
环境
可以在笔记本电脑上运行的 Linux 虚拟环境中进行练习。本节将介绍安装环境的准备工作。
系统需求
虚拟机当前配置为 4GB 内存,4 核 CPU,这是完成练习的推荐的最低系统需求,虚拟机还占用大约 8GB 硬盘空间。为了获得平稳的体验,建议在资源至少翻倍的系统上运行虚拟机。
下载虚拟机
单击以下链接下载虚拟机(4GB):
虚拟机格式为.ova
,基于 VirtualBox v5.2.32 创建。可以使用任何现代虚拟化系统来运行虚拟机,但建议使用 VirtualBox。以下链接提供了如何获取 VirtualBox 并导入虚拟机的说明:
- https://www.virtualbox.org/wiki/Downloads
- https://docs.oracle.com/cd/E26217_01/E26796/html/qs-import-vm.html
或者,可以使用脚本在机器上通过 Vagrant 构建虚拟机。
Windows 用户
所有脚本都在 MacOS 和 Ubuntu 上测试过了,虽然应该可以在 Windows 上运行,但还没有经过测试,建议 Windows 用户下载所提供的虚拟机。
然后可以启动虚拟机(Ubuntu 系统),并使用sdn
/rocks
登录。本节剩余部分给出的说明(以及练习本身)将在运行的 VM 中执行。
克隆仓库
为了进行练习,需要克隆以下仓库:
$ cd ~ $ git clone -b advanced https://github.com/opennetworkinglab/ngsdn-tutorial --depth 1
如果ngsdn-tutorial
目录已经存在于虚拟机中,请确保更新其内容:
$ cd ~/ngsdn-tutorial $ git pull origin advanced
请注意,仓库有多个分支,每个分支有不同的练习配置,一定要确保是在advanced
分支上。
升级依赖
虚拟机可能附带了比练习所需的更旧的依赖版本,可以使用以下命令升级到最新版本:
$ cd ~/ngsdn-tutorial $ make deps
复制代码
该命令将下载所有必需的 Docker 镜像(约 1.5 GB),从而允许我们离线完成练习。
使用 IDE
练习中将需要用多种语言(如 P4, Java, Python)编写代码,虽然不需要使用任何特定 IDE 或代码编辑器,但推荐使用Java IDE IntelliJ IDEA Community Edition,它预装了用于 P4 语法高亮显示和 Python 开发的插件,特别是在 ONOS 应用程序开发中,可以为所有 ONOS API 提供代码补全。
代码库结构
代码库结构如下:
p4src\
→ 数据平面实现(P4)yang\
→ 配置模型(YANG)app\
→ 自定义 ONOS 应用程序(Java)mininet\
→ 2x2 叶棘网络(Mininet)util\
→ 工具脚本(Bash)ptf\
→ 数据平面单元测试(PTF)
注意,练习需要用到 GitHub 上各种文件的链接,不要忘记在笔记本电脑上克隆相应文件。
命令
为了便于练习,代码库提供了一组make
目标,以控制流程的不同方面。具体命令在练习中介绍,以下是一个快速参考:
make deps
→ 拉取并构建所有必需的依赖项make p4-build
→ 构建 P4 程序make p4-test
→ 执行 PTF 测试make start
→ 启动 Mininet 和 ONOS 容器make stop
→ 停止所有容器make restart
→ 重新启动容器并清除任何先前状态make onos-cli
→ 进入 ONOS CLI(密码:rocks
, Ctrl-D 退出)make onos-log
→ 显示 ONOS 日志make mn-cli
→ 进入 Mininet 命令行(Ctrl-D 退出)make mn-log
→ 显示 Mininet 日志(例如 CLI 的输出信息)make app-build
→ 构建自定义 ONOS 应用程序make app-reload
→ 安装并激活 ONOS 应用程序make netcfg
→ 将网络配置文件netcfg.json
推送到 ONOS
执行命令
提醒一下,这些命令需要在刚刚创建的虚拟机中打开的终端窗口中执行,同时确保位于克隆的代码库的根目录中(主
Makefile
所在的位置)。
练习
下面列出(并链接)每个练习。练习 1 和 2 的重点是 Stratum,最好在阅读完第 5 章后尝试。练习 3 至 6 关注 ONOS,最好在阅读了第 6 章后尝试。练习 7 和 8 主要关注 SD-Fabric,最好在阅读第 7 章之后进行<sup>[1]</sup>。注意,这些练习是相互建立的,所以最好按顺序完成它们。
[1] SD-Fabric 以前被称为 Trellis,现在仍然可以在代码中看到。UPF 以前被称为 SPGW,现在同样可以在代码中看到。
- P4Runtime Basics
- YANG, OpenConfig, gNMI Basics
- Using ONOS as the Control Plane
- Enabling ONOS Built-in Services
- Implementing IPv6 Routing with ECMP
- Implementing SRv6
- SD-Fabric (Trellis) Basics
- GTP Termination with fabric.p4
可以在代码库的solution
子目录找到每个练习的解决方案,如果遇到问题,可以将自己的解决方案与参考解决方案进行比较。
图形界面
当练习需要查看图形输出时,将会看到对 ONF Cloud Tutorial Portal 的引用,这是 ONF 运行教程期间使用的云托管虚拟机,因此并不适用。在同样的地方还可以看到如何访问本地运行的 GUI 的介绍。
关于本书
本仓库包含 Software-Defined Networks: A Systems Approach 的所有源文件,可根据创作共用协议(CC BY-NC-ND 4.0)许可条款获得。我们邀请社区在相同的条款下提供更正、改进、更新和新材料。虽然本授权并不自动授予制作衍生作品的权利,但非常希望与感兴趣的各方讨论衍生作品(如翻译)。请联系 discuss@systemsapproach.org。
如果使用了该作品,其版权归属应包括以下信息:
Title: Software-Defined Networks: A Systems Approach
Authors: Larry Peterson, Carmelo Cascone, Brian O’Connor, Thomas Vachuska, and Bruce Davie
Source: https://github.com/SystemsApproach/SDN
License: CC BY-NC-ND 4.0
阅读本书
本书是系统方法系列的一部分,其在线版本发布在https://sdn.systemsapproach.org。
要跟踪进度并接收关于新版本的通知,可以关注Facebook和Twitter。要阅读关于互联网是如何发展的连续评论,请关注Substack。
发布和版本
我们不断在 GitHub 上发布开源内容,并不时发布印刷和电子书版本。最新的印刷和电子书(第二版)对应于v2.0
标签。
一般来说,master
包含连贯以及内部一致的版本的材料。(如果是代码,那么本书就会构建并运行。)小补丁会直接检入到master
中,但是开发中的新内容会检入到分支中,直到可以被合并到master
而不会破坏一致性。该书的网页版本会不断从master
生成并可在https://sdn.systemsapproach.org上访问。
只要有足够的改进或新内容,就会标记小版本(例如v1.1
)。这样做主要是为了创建快照,以便课程中的每个人都可以知道他们使用的是同一个版本。
构建本书
要构建可供网页浏览的版本,首先需要下载源码:
$ mkdir ~/SDN $ cd ~/SDN $ git clone https://github.com/SystemsApproach/SDN.git
构建过程维护在 Makefile 中,并且需要安装 Python。Makefile 将创建一个虚拟环境(doc_venv
),用于安装文档生成工具集。可能还需要使用系统的包管理器安装enchant
C 库,以便拼写检查器正常工作。
执行make HTML
,在_build/html
中生成 HTML。
执行make lint
检查本书格式。
执行make spelling
进行检查拼写。如果有拼写正确但字典中没有的单词、名称或首字母缩写词,请添加到dict.txt
文件中。
运行make
查看其他可用的输出格式。
贡献
如果你使用这些材料,希望也愿意回馈。如果你是开放源码的新手,可以查看How to Contribute to Open Source。你可以了解如何发布 Issue,如何发出 Pull Request 合并你的改进,以及其他需要的东西。
如果想投稿,并且正在寻找一些需要关注的内容,请查看wiki上的当前待办事项列表。
关于作者
Larry Peterson,普林斯顿大学计算机科学系 Robert E. Kahn 名誉教授,从 2003 年到 2009 年担任主席。研究主要集中在互联网大规模分布式系统的设计、实现和操作,包括广泛使用的 PlanetLab 和 MeasurementLab 平台。他目前正在为开放网络基金会(ONF)的 Aether 边缘云项目做出贡献,并作为首席科学家提供建议。Peterson 是美国国家工程院院士,ACM 和 IEEE 院士,2010 年 IEEE Kobayashi 计算机与通信奖得主,2013 年 ACM SIGCOMM 奖得主。1985 年获普渡大学博士学位。
Carmelo Cascone,开放网络基金会(ONF)技术人员,目前在 ONF 项目(如 ONOS、CORD 和 Aether)中领导可编程交换机、P4 和 P4Runtime 的技术活动。2017 年,Cascone 在与École Polytechnique de Montréal 的联合项目中获得了米兰理工大学博士学位。他对计算机网络和系统有着广泛的兴趣,专注于数据平面可编程性和软件定义网络(SDN)。
Brian O’connor,开放网络基金会(ONF)技术人员,目前领导着交换机操作系统方面的技术活动。O’connor 于 2012 年和 2013 年分别获得斯坦福大学计算机科学学士和硕士学位。
Thomas Vachuska,开放网络基金会(ONF)首席架构师,领导 ONOS 项目。在加入 ONF 之前,Vachuska 是惠普的软件架构师。Vachuska 于 1994 年获得加州州立大学萨克拉门托分校数学学士学位。
Bruce Davie,计算机科学家,因其在网络领域的贡献而闻名。Davie 是 VMware 亚太区前副总裁兼首席技术官,在收购软件定义网络(SDN)初创公司 Nicira 期间加入 VMware。在此之前,他是 Cisco Systems 的研究员,领导一个架构师团队,负责多协议标签交换(MPLS)。Davie 拥有超过 30 年的网络行业经验,并合著了 17 个 RFC。他于 2009 年成为 ACM 研究员,并于 2009 年至 2013 年担任 ACM SIGCOMM 主席。他还在麻省理工学院做了五年的访问讲师。Davie 是多本书的作者,拥有 40 多项美国专利。