计算机网络 网络层:控制平面(二)
5.4 ISP 之间的路由选择:BGP
OSPF 是一个 AS 内部路由选择协议。 当在相同 AS 内的源和目的地之间进行分组选路时,分组遵循的路径完全由 AS 内路由选择协议所决定。 然而,当分组跨越多个 AS 进行路由时,比如说从位于马里廷巴克图的智能手机到位于美国硅谷数据中心的一台服务器,需要一个自治系统间路由选择协议( inter- autonomous systenl routìng protocol)。 因为 AS 间路由选择协议涉及多个 AS 之间的协调,所以 AS 通信必须运行相同的 AS 间路由选择协议。 在因特网中,所有的 AS 运行相同的 AS 间路由选择协议,称为边界网关协议 (Broder Gateway Protocol , BGP)。
BGP 无疑是所有因特网协议中最为重要的,因为正是这个协议将因特网中数以千计的 ISP 粘合起来。 如看到的那样,BGP 是一种分布式和异步的协议,与 5.2.2 节中描述的距离向量路由选择协议一脉相承。 尽管 BGP 是一种复杂和富有挑战性的协议,但为了深层次理解因特网,需要熟悉其基础结构和操作。
5.4.1 BGP 的作用
考虑一个 AS 和在该 AS 中的任意一个路由器。 前面讲过,每台路由器具有一张转发表,该转发表在将到达分组转发到出路由器链路的过程中起着主要作用。 如已经学习过的那样,对于位于相同 AS 中的目的地而言,在路由器转发表中的表项由 AS 内部路由选择协议所决定,而对于位于该 AS 外部的目的地而言情况如何呢? 这正是 BGP 用武之地。
在 BGP 中,分组并不是路由到一个特定的目的地址,相反是路由到 CIDR 化的前缀,其中每个前缀表示一个子网或一个子网的集合。 在 BGP 的世界中,一个目的地可以采用 138.16.68/22 的形式,对于这个例子来说包括 1024 个 IP 地址。 因此,一台路由器的转发表将具有形式为(x,I) 的表项,其中先是一个前缀(例如 138. 16. 68/22),I 是该路由器的接口之一的接口号。
作为一种 AS 间的路由选择协议,BGP 为每台路由器提供了一种完成以下任务的手段:
1)从邻居 AS 获得前缀的可达性信息 。 特别是, BGP 允许每个子网向因特网的其余部分通告它的存在。 一个子网高声宣布"我存在,我在这里",而 BGP 确保在因特网中的所有AS 知道该子网。 如果没有 BGP 的话,每个子网将是隔离的孤岛,即它们孤独地存在,不为因特网其余部分所知和所达。
2)确定到该前缀的 “ 最好的 ” 路由。 一台路由器可能知道两条或更多条到特定前缀的不同路由。 为了确定最好的路由,该路由器将本地运行一个 BGP 路由选择过程(使用它经过相邻的路由器获得的前缀可达性信息)。 该最好的路由将基于策略以及可达性信息来确定。
钻研 BGP 如何执行这两个任务。
5.4.2 通告 BGP 路由信息
考虑图 5-8 中显示的网络。 如我们看到的那样,这个简单的网络具有 3 个自治系统:AS1 AS2 和 AS3。 如显示的那样, AS3 包括一个具有前缀 x 的子网。 对于每个 AS ,每台路由器要么是一台网关路由器( gateway router) ,要么是一台内部路由器 (internal router)。 网关路由器是一台位于 AS 边缘的路由器,它直接连接到在其他 AS 中的一台或多台路由器。 内部路由器仅连接在它自 AS 中的主机和路由器。 例如 AS1 中路由器 1c 是网关路由器; 路由器 1a lb ld 是内部路由器。
考虑这样一个任务:向图 5.8 中显示的所有路由器通告对于前缀 x 的可达性信息。 在高层次上,这是简明易懂的。 首先, AS3 向 AS2 发送一个 BGP 报文,告知 x 存在并且位于 AS3 中; 将该报文表示为" AS3 x"。 然后 AS2 向 AS1 发送一个 BGP 报文,告知 x 存在并且能够先通过 AS2 然后进入 AS3 进而到达; 我们将该报文表示为”AS2 AS3 x"。 以这种方式,每个自治系统不仅知道 x 的存在,而且知道通向 x 的自治系统的路径。
虽然在图 5-8 中有关通告 BGP 可达性信息的讨论能得到路径穿越的大意,但就自治系统彼此并未实际发送报文而言,它并不是准确的,相反是路由器在发送报文。 为了理解这一点,我们现在重温图 5-8 中的例子。 在 BGP 中,每对路由器通过使用 179 端口的半永久 TCP 连接交换路由选择信息。 每条直接连接以及所有通过该连接发送的 BGP 报文,称为BGP 连接(BGP connection)。 此外,跨越两个 AS 的 BGP 连接称为外部 BGP (eBGP)连接,而在相同 AS 中的两台路由器之间的 BGP 会话称为内部 BGP (ïBGP)连接。 图5-8所示网络的 BGP 连接的例子显示在图 5-9。 对于直接连接在不同 AS 中的网关路由器的每条链路而言,通常有一条 eBGP 连接; 因此,在图 5-9 中,在网关路由器 1e 和 2a 之间有一条 eBGP 连接,而在网关路由器 2c 和 3a 之间也有一条 eBGP 连接。
在每个 AS 中的路由器之间还有多条 iBGP 连接。 特别是,图 5-9 显示了一个 AS 内部的每对路由器之间的 BGP 连接的通常配置,在每个 AS 内部产生了网状的 TCP 连接。 在图 5-9 中, eBGP 会话显示为长虚线, iBGP 显示为短虚线 。 注意到 iBGP 连接并不总是与物理链路对应。
为了传播可达性信息,使用了 iBGP 和 eBGP 会话。再次考虑向 AS1 和 AS2 中的所有路由器通告前缀 x 的可达性信息。在这个过程中,网关路由器 3a 先向网关路由器 2c 发送一个 eBGP 报文 "AS3 x"。网关路由器 2c 然后向 AS2 中的所有其他路由器(包括网关路由器 2a)发送 iBGP 报文 "AS3 x"。网关路由器 2a 接下来向网关路由器 1c 发送一个 eBGP报文 "AS2 AS3 x" 最后,网关路由器 1c 使用 iBGP 向 AS1 中的所有路由器发送报文"AS2 AS3 x" 在这个过程完成后,在 AS1 和 AS2 中的每个路由器都知道了 x 的存在并且也都知道了通往 x 的 AS 路径。
当然,在真实的网络中,从某个给定的路由器到某个给定的目的地可能有多条不同的路径,每条通过了不同的 AS 序列。例如,考虑图 5-10 所示的网络,它是在图 5-8 那个初始网络基础上,从路由器 1d 到路由器 3d 附加了一条物理链路。在这种情况下,从 AS1 到 x 有两条路径:经过路由器 1c 的路径 "AS2 AS3 x"; 以及经过路由器 1d 的新路径 "AS3 x"。
5.4.3 确定最好的路由
从一个给定的路由器到一个目的子网可能有多条路径。事实上,因特网中的路由器常常接收到很多不同的可能路径的可达性信息。一台路由器如何在这些路径之间进行选择(并且再相应地配置它的转发表)呢?
几个 BGP 术语。当路由器通过 BGP 连接通告前缀时,它在前缀中包括一些 BGP 属性。用 BGP 术语来说,前缀及其属性成为 路由。两个较为重要的属性是 AS-PATH 和 NEXT-HOP。AS-PATH 属性包含了通告已经通过的 AS 的列表,如前面例子所见。为了生成 AS-PATH 的值,当一个前缀通过某 AS 时,该 AS 将其 ASN 加入 AS-PATH 中现有的列表。例如,在图 5-10 中,从 AS1 到子网 x 有两条路:其中一条使用 AS-PATH “AS2 AS3”;而另一条使用 AS-PATH “ AS 3”。BGP 路由器还使用 AS-PATH 属性来检测和防止通告环路;特别是,如果一台路由器在路径列表中看到了包含它自己的 AS,将拒绝该通告。
在 AS 间和 AS 内部路由选择协议之间提供关键链路方面,NEXT-HOP 属性具有敏感而重要的作用。NEXT-HOP 是 AS-PATH 起始的路由器接口的 lP 地址。为了深入理解该属性,我们再次参考图 5-10 如图 5-10 中所指示的那样,对于从 AS1 通过 AS2 的路由'AS2 AS3 x",其属性 NEXT- HOP 是路由器 2a 左边接口的 IP 地址。对于从 ASl 绕过 AS2到 x 的路由 "AS3 x",其 NEXT-HOP 属性是路由器 3d 最左边接口的 IP 地址。总的说来,在这个假想的例子中, AS1 中的每台路由器都知道了到前缀 x 的两台 BGP 路由:
路由器 2a 的最左侧接口的 IP 地址 :AS2 AS3;x
路由器 3d 的最左侧接口的 IP 地址 :AS3 ;x
这里,每条 BGP 路由包含 3 个组件:NEXT- HOP;AS-PATH;目的前缀。在实践中,
一条 BGP 路由还包括其他属性,眼下我们将暂且忽略它。注意到 NEXT-HOP 属性是不属于
AS1 的某路由器的 IP 地址;然而,包含该 IP 地址的子网直接连接到 AS1。
1. 热土豆路由选择
讨论 BGP 路由选择算法。以最简单的路由选择算法开始,热土豆路由选择。
考虑在图 5-10 网络中的路由器 1b。如同刚才所述,这台路由器将学习到达前缀 x 的两条 BGP 路由。使用热土豆路由选择,(从所有可能的路由中)选择的路由到开始该路由的NEXT-HOP 路由器具有最小开销。在这个例子中,路由器 1b 将查阅它的 AS 内部路由选择信息,以找到通往 NEXT-HOP 路由器 2a 的最低开销。AS 内部路径以及通往 NEXT-HOP路由器 3d 的最低开销 AS 间路径,进而选择这些最低开销路径中具有最低开销的那条。例如,假设开销定义为穿越的链路数,则从路由器 1b 到路由器 2a 的最低开销是 2,从路由1b 到路由器 3d 的最低开销是 3,因此将选择路由器 2a 路由器 1b 则将查阅它的转发表(由它的 AS 内部算法所配置) ,并且找到通往路由器 2a 的位于最低开销路径上的接口 I。1b 则把(x,I) 加到它的转发表中。
图 5-11 中总结了在一台路由器转发表中对于热土豆路由选择增加 AS 向外前缀的步骤。注意到下列问题是重要的:当在转发表中增加 AS 向外前缀时, AS 问路由选择协议(BGP) 和 AS 内部路由选择协议(如 OSPF )都要用到。
2.路由器选择算法
实践中,BGP 使用了一种比热土豆路由选择更为复杂但却结合了其特点的算法。对于任何给定的目的地前缀,进入 BGP 的路由选择算法的输入是到某前缀的所有路由的集合,前缀该是已被路由器学习和接受的。如果仅有一条这样的路由,BGP 则显然选择该路由。如果到相同的前缀有两条或多条路由,则顺序地调用下列消除规则直到余下一条路由:
1)路由被指派一个本地偏好 (local preference) 值作为其属性之一( 除了 AS-PATH 和 NEXT-HOP 以外)。一条路由的本地偏好可能由该路由器设置或可能由在相同 AS 中的另一台
路由器学习到。本地偏好属性的值是一种策略决定,它完全取决于该 AS 的网络管理员(随后将更为详细地讨论 BGP 策略问题),具有最高本地偏好值的路由将被选择。
2)从余下的路由中(所有都具有相同的最高本地偏好值),将选择具有最短 AS-PATH 的路由。如果该规则是路由选择的唯一规则,则 BGP 将使用距离向量算法决定路径,其中距离测度使用 AS 跳的跳数而不是路由器跳的跳数。
3)从余下的路由中(所有都具有相同的最高本地偏好值和相同的 AS-PATH 长度),使用热土豆路由选择,选择具有最靠近 NEXT-HOP 路由器的路由。
4)如果仍留下多条路由,该路由器使用 BGP 标识符来选择路由。
举一个例子,再次考虑图 5-10 中的路由器 1b 。前面讲过到前缀 x 确切地有两条 BGP 路由,一条通过 AS2 而另一条绕过 AS2 。前面也讲过如果它使用自己的热土豆路由选择,则 BGP 将通过 AS2 向前缀 x 路由分组。但在上面的路由选择算法中,在规则3 之前应用了规则2 ,导致 BGP 选择绕过 AS2 的那条路由,因为该路由具有更短 AS-PATH。因此我们看到使用上述路由选择算法, BGP 不再是一种自私的算法,即它先查找具有短 AS 路径的路由(因而很可能减小端到端时延)。
5.4.4 IP 任播
除了作为因特网的 AS 间路由选择协议外, BGP 还常被用于实现 IP 任播 (anycast) 服务,该服务通常用于 DNS 中。为了说明 IP 任播的动机,考虑在许多应用中,对下列情况感兴趣:①许多分散的不同地理位置,替换不同服务器上的相同内容。② 让每个用户从最靠近的服务器访问内容。例如,一个 CDN 能够更换位于不同国家、不同服务器上的视频和其他对象。类似地, DNS 系统能够在遍及全世界的 DNS 服务器上复制DNS 记录。当一个用户要访问该复制的内容,可以将用户指向具有该复制内容的"最近的"服务器。BGP 的路由选择算法为做这件事提供了一种最为容易和自然的机制。
描述 CDN 可能使用 IP 任播的方式。如图 5-12 所示,在 IP 任播配置阶段, CDN 公司为它的多台服务器指派相同的 IP 地址,并且使用标准的 BGP 从这些服务器的每台来通告该 IP 地址。当某台 BGP 路由器收到对于该 IP 地址的多个路由通告,它将这些通告处理为对相同的物理位置提供不同的路径(事实上 ,这时这些通告对不同的物理位置是有不同路径的)。当配置其路由选择表时,每台路由器将本地化地使用 BGP 路由选择算法来挑选到该 IP 地址的"最好的" (例如,由 AS 跳计数确定的最近的)路由。例如,如果一个 BGP 路由( 对应于一个位置 )离该路由器仅一AS 跳的距离,并且所有其他 BG 路由(对应于其他位置)是两 AS 跳和更多 AS 跳,则该 BGP 路由器将选择把分组路由到一跳远的那个位置。在这个初始 BGP 地址通告阶段后, CDN 能够进行其分发内容的主要任务。当某客户请求视频时, CDN 向该客户返回由地理上分散的服务器所使用的共同 IP 地址,而无论该客户位于何处,当该客户想向那个 IP 地址发送一个请求时,因特网路由器则向那个" 最近的 "服务器转发该请求分组,最近的服务器是由 BGP 路由选择算法所定义的。
尽管上述 CDN 的例子很好地诠释了能够如何使用 IP 任播,但实践中 CDN 通常选择不使用 IP 任播,因为 BGP 路由选择变化能够导致相同的 TCP 连接的不同分组到达 Web 服务器的不同实例。IP 任播被 DNS 系统广泛用于将 DNS 请求指向最近的根 DNS 服务器。2.4 节讲过,当前根 DNS 服务器有 13 个 lP 地址。但对应于这些地址的每一个,有多个DNS 根服务器,其中有些地址具有 100 多个 DNS 根服务器分散在世界的各个角落。当一个 DNS 请求向这 13 IP 地址发送时,使用 IP 任播将该请求路由到负责该地址的最近的那个DNS 根服务器。
5.4.5 路由选择策略
当某路由器选择到目的地的一条路由时, AS 路由选择策略能够胜过所有其他考虑,例如最短 AS 路径或热土豆路由选择。在路由选择算法中,实际上首先根据本地偏好属性选择路由,本地偏好值由本地 AS 的策略所确定。
用一个简单的例子说明 BGP 路由选择策略的某些基本概念。图 5-13 显示了 6个互联的自治系统:A、B、C、W、X 和 Y。他们是 AS 不是路由器。假设自治系统 W、X 和 Y 接入 ISP,而 A、B 和 C 是主干提供商网络。还假设 A B C 直接彼此发送流量,并向它们的客户网络提供全部的 BGP 信息。所有进入一个接入 ISP 网络的流量必定是以该网络为目的地,所有离开一个接入 ISP 网络的流量必定源于该网络。W 和 Y 显然是接入 ISP。X 是一个多宿接入 ISP (multi- homed stub network) ,因为它是经由两个不同的提供商连到网络的其余部分(这种方法在实践中变得越来越普遍)。 然而,就像 W 和 Y 一样, X 自身必定是进入/离开 X 的所有流 的源/目的地。但这种桩网络的行为是如何实现和强制实现的呢?X 如何防止转发 B 与 C 之间的流量呢?这能够通过控制 BGP 路由的通告方式容易地实现。特别是,X 如果(向其邻居 B 和 C) 通告它没有通向(除自身以外)任何其他目的地的路径,那么它将起到一个接入 ISP 的作用。这就是说,即使 X 可能知道一条路径(比如说XCY)能到达网络 Y ,它也将不把该条路径通告给 B。由于 B 不知道 X 有一条路径到 Y,B 绝不会经由 X 转发 目的为 Y (或 C) 的流量。这个简单的例子说明了如何使用一条选择的路由通告策略来实现客户/提供商路由选择关系。
接下来关注一个提供商网络,比如自治系统 B。假定 B 已经(从 A 处)知道了 A 有一条到 W 的路径 AW。B 因此能将路由 AW 安装到其路由信息库。显然,B 也想向它的客户 X 通告路径 BAW,这样 X 知道它能够通过 B 路由到达 W。但是,B 应该将路径 BAW 通告给 C 吗?如果它这样做,则 C 可以经由 BAW 将流量引导到 W。如果A、B、C 都是主干提供商,而 B 也许正好觉得它不应该承担在 A 与 C 之间传送流量的负担(和开销)。 B 可能有理由认为,确保 C 能经过 A和C 之间的直接连接引导 A 客户的来去流量是 A 和 C的工作(和开销)。目前还没有强制主干 ISP 之间如何路由选择的官方标准。然而,商业运行的 ISP 们都遵从的一个经验法则是:任何穿越某 ISP 主干网的流量必须是其源或目的(或两者)位于该 ISP 的某个客户网络中;不然的话这些流量将会免费搭车通过该 ISP 的网络。各个对等协定(前面的问题)通常都是 ISP 双方进行协商,而且经常对外保密。
5.4.6 拼装在一起:在因特网中呈现
许多协议和概念结合到一起,包括 IP 地址、DNS 和 BGP。
假定你只是创建了一个具有若干服务器的小型公司网络,包括一台描述公司产品和服务的公共 Web 服务器,一台从你的雇员获得他们的电子邮件报文的电子邮件服务器和一台DNS 服务器。你当然乐意整个世界能够访问你的 Web 站点,以得知你的现有产品和服务。此外,你将乐意你的雇员能够向遍及世界的潜在客户发送和接收电子邮件。
为了满足这些目标,你首先需要获得因特网连接,要做到这一点,需要与本地 ISP 签订合同并进行连接。你的公司将有一台网关路由器,该路由器将与本地 ISP 的一台路由器相连。该连接可以是一条通过现有电话基础设施的 DSL 连接、 一条到 ISP 路由器的租用线,或者是第 1 章描述的许多其他接人解决方案之一。你的本地 ISP 也将为你提供一个 IP地址范围,例如由 256 个地址组成的一个/24 地址范围。一旦你有了自己的物理连接和 IP地址范围,你将在该地址范围内分配 IP 地址:一个给你的 Web 服务器, 一个给你的电子邮件服务器,一个给你的 DNS 服务器,一个给你的网关路由器,并将其他 lP 地址分配给公司网络中的其他服务器和联网设备。
除了与一个 ISP 签订合同外,你还需要与一个因特网注册机构签订合同,以便为你的公司获得一个域名,如在第 2 章中所描述的那样。例如,如果你的公司名称比如说是 Xanadu Inc.,你然希望获得域名 xanadu.com。你的公司还必须呈现在 DNS 系统中。具体而言,因为外部世界将要联系你的 DNS 服务器以获得该服务器的 IP 地址,所以你还需要为注册机构提供你的 DNS 服务器的 IP 地址。该注册机构则在 .com 顶级域名服务器中为你的 DNS 服务器设置一个表项(域名和对应的 IP 地址) ,如第 2 章所述。在这个步骤完成后,任何知道你的域名(例如 xanadu. com)的用户将能够经过 DNS 系统获得你 DNS 服务器的 IP 地址。
为了使人们能够发现你的 Web 服务器的 IP 地址,你需要在你的 DNS 服务器中包括一个将你的 Web 服务器的主机名(例如 www.xanadu.com)映射到它的 IP 地址的表项。你还要为公司中其他公共可用的服务器设置类似的表项,包括你的电子邮件服务器。如此一来,如果 Alice 要浏览你的 Web 服务器, DNS 系统将联系你的 DNS 服务器,找到你的 Web 服务器的IP 地址,并将其给Alice 。Alice 则能与你的 Web 服务器创建一个直接的 TCP 连接。
然而,允许来自世界各地的外部人员访问你的 Web 服务器,仍然还有一个必要的、决定性的步骤。考虑当 Alice 做下列事情发生的状况:Alìce 知道你的 Web 服务器的 IP 地址,她向该 IP 地址发送一个 IP 数据报(例如 TCP SYN 报文段)。该数据报将通过因特网进行路由,经历了在许多不同的自治系统中的一系列路由器,最终到达你的 Web 服务器。当任何一个路由器收到该数据报时,将去它的转发表中寻找一个表项来确定转发该数据报的外出端口。因此,每台路由器需要知道你公司的 /24 前缀(或者某些聚合项)。一台路由器如何知道你公司的前缀呢?如我们刚才看到的那样,它从 BGP 知道了该前缀。具体而言,当你的公司与本地 ISP 签订合同并且获得了分配的前缀(即一个地址范围) , 你的本地 ISP 将使用 BGP 向与之连接的 ISP 通告你的前缀。这些 ISP 将依次使用 BGP 来传播该通告。最终,所有的因特网路由器将得知了你的前缀(或者包括你的前缀的某个聚合项),因而能够将数据报适当地转发到适当的 Web 和电子邮件服务器。
5.5 SDN 控制平面
深入 SDN 控制平面。控制分组在网络的 SDN 使能设备中转发网络范围逻辑,以及这些设备和它们的服务的配置与管理。这里学习建立在 4.4 节一般化 SDN 转发讨论的基础上。这里同前面一样,将网络的转发设备称之为 “ 分组交换机 ”,能够根据网络源/目的地址、链路层源/目的地址以及运输层、网络层 和 链路层中分组首部字段做出转发决定。
SDN 体系结构具有 4 个关键特征:
① 基于流的转发。SDN 控制的交换机的分组转发工作,能够基于运输层、网络层或链路层首部中任意数量的首部字段值进行。在 4.4 节中,看到了 OpenFlow 1.0 抽象允许基于 11 个不同的首部字段值进行转发。这与我们 5.2 - 5.4 节中学习的基于路由器转发的传统方法形成了鲜明的对照,传统方法中 lP 数据报的转发仅依据数据报的目的 IP 地址进行。回顾图 5-2,分组转发规则被精确规定在交换机的流表中;SDN 控制平面的工作是计算、管理和安装所有网络交换机中的流表项。
② 数据平面与控制平面分离。这种分离明显地显示在图 5-2 和图 5-14 中。数据平面由网络交换机组成,交换机是相对简单(但快速)的设备,该设备在它们的流表中执行" 匹配加动作 "的规则。控制平面由服务器以及决定和管理交换机流表的软件组成。
③ 网络控制功能:位于数据平面交换机外部。考虑到 SDN 中的 S 表示 “ 软件 ”,也许 SDN 控制平面由软件实现并不令人惊讶。然而,与传统的路由器不同,这个软件在服务器上执行,该服务器与网络交换机截然分开且与之远离。在图 5-14 中所示,控制平面自身由两个组件组成:一个 SDN 控制器(或网络操作系统),以及若干网络控制应用程序。控制器维护准确的网络状态信息(例如,远程链路、交换机和主机的状态);为运行在控制平面中的网络控制应用程序提供这些信息;提供方法,这些应用程序通过这些方法能够监视、编程 和控制下面的网络设备。尽管在 图5-14 中的控制器为单一的服务器,但实践中控制器仅是逻辑上集中的,通常在几台服务器上实现,这些服务器提供协调的、可扩展的性能和高可用性。
④ 可编程的网络。通过运行在控制平面中的网络应用程序,该网络是可编程的。这些应用程序代表了 SDN 控制平面的"智力",使用了由 SDN 控制器提供的 API 来定义和控制网络设备中的数据平面。例如,一个路由选择网络控制应用程序可以决定源和目的地之间的端到端路径(例如,通过使用由 SDN 控制器维护的节点状态和链路状态信息,执Dijkstra 算法)。另一个网络应用程序可以执行访问控制,即决定交换机阻挡哪个分组,如 4.4.3 节中的第 个例子那样。还有一个应用程序可以用执行服务器负载均衡的方式转发分组 (4.4.3 节中我们考虑的第二个例子)。
从讨论中我们可见, SDN 表示了一种意义重大的网络功能的"分类",即数据平面交换机、 SDN 控制器和网络控制应用程序是分离的实体,该实体可以由不同的厂商和组织机构所提供。这与 SDN 之前模式形成了鲜明对照,在 SDN 之前模式中,交换机/路由器(连同其嵌入的控制平面软件和协议实现)是一个整体,它是垂直、综合的,并且由单一的厂商所销售。SDN 中的这种网络功能分类,可以与大型计算机到个人计算机的早期演化相比拟,前者的硬件、系统软件和应用程序是由单一厂商所提供的,而后者具有各自的硬件、操作系统和应用程序。计算硬件、系统软件和应用程序的分类,无疑已经在所有这三个领域的创新驱动下导致了丰富、开放的生态系统。对 SDN 的希望是,它也将导致如此丰富的创新。
给出了我们对图 5-14 的 SDN 体系结构的理解,自然会产生许多问题。流表是如何实际计算的,以及在哪里进行的?响应 SDN 控制的设备产生的事件时(例如,一条附属链路的激活/关闭),这些流表是如何更新的呢?在协作的多台交换机中,流表项是如何以种导致和谐、一致的网络范围功能的方式进行协作的呢(例如,用于转发分组的从源到目的地的端到端路径,或与分布式防火墙协作)?提供这些以及许多其他能力是 SDN 控制平面的作用。
5.5.1 SDN 控制平面:SDN 控制器和 SDN 网络控制应用程序
考虑控制平面必须提供的一般能力开始讨论 SDN 控制平面。总体的体系结构,反映了 SDN 控制平面如何在实际中实现。
如上所述,SDN 控制平面大体划分为两个部分,即 SDN 控制器 和 SDN 网络控制应用程序。先来仔细考察控制器。自从最早的 SDN 控制器 Gude 2008 开发以来,已经研制了多种 SDN 控制器。图 5-15 提供了一个通用 SDN 控制器的更为详尽的视图。控制器的功能可大体组织为 3 个层次。以一种非典型的自底向上方式考虑这些层次:
① 通信层:SDN 控制器和受控网络设备之间的通信。显然,如果 SDN 控制器要控制远程 SDN 使能的交换机、主机或其他设备的运行,需要一个协议来传送控制器与这些设备之间的信息。此外,设备必须能够向控制器传递本地观察到的事件(例如,一个报文指示一条附属链路已经激活或停止,一个设备刚刚加入了网络,或个心跳指示某设备已经启动和运行)。这些事件向 SDN 控制器提供该网络状态的最新视图。这个协议构成了控制器体系结构的最底层,如图 5-15 中所示。控制器和受控设备之间的通信跨越了一个接口,它现在被称为控制器的" 南向 "接口。 在5.5.2 节中,将学习 OpenFlow ,它是一种提供这种通信功能的特定协议。OpenFlow 在大多数 SDN 控制器中得到了实现(即使不是全部)。
② 网络范围状态管理层。由 SDN 控制平面所做出的最终控制决定(例如配置所有交换机的流表以取得所希望的端到端转发,实现负载均衡,或者一种特定的防火墙能力),将要求控制器具有有关网络的主机、链路、交换机和其他 SDN 控制设备的最新状态信息。交换机的流表包含计数器,其值也可以由网络控制应用程序很好地使用;因此这些值应当为应用程序所用。既然控制平面的终极目标是决定用于各种受控设备的流表,控制器也就可以维护这些表的拷贝。这些信息都构成了由 SDN 控制器维护的网络范围"状态"的例子。
③ 对于网络控制应用程序层的接口。控制器通过它的" 北向 "接口与网络控制应用程序交互。API 允许网络控制应用程序在状态管理层之间读/写网络状态和流表。当状态改变事件出现时,应用程序能够注册进行通告。可以提供不同类型的 API,将看到两种流行 SDN 控制器使用 REST [Fielding 2000 ]请求响应接口与它们的应用程序进行通信。
SDN 控制器被认为是" 逻辑上集中 "的,即该控制器可以被外部视为一个单一 、整体的服务(例如,从 SDN 控制设备和外部的网络控制应用程序角度看)。然而,出于故障容忍、高可用性或性能等方面的考虑,在实践中这些服务和用于保持状态信息的数据库一般通过分布式服务器集合实现。在服务器集合实现控制器功能时,必须考虑控制器的内部操作(例如维护事件的逻辑时间顺序、一致性、意见一致等)的语义。
5.5.2 OpenFlow 协议
OpenFlow 协议 运行在 SDN 控制器和 SDN 控制的交换机或其他实现 OpenFlow API 的设备之间( OpenFlow API 在 4.4 节学习过)。OpenFlow 协议运行在 TCP 之上,使用 6653 的默认端口号。从控制器到受控交换机流动的重要报文有下列这些:
5.5.3 数据平面和控制平面交互的例子
为了具体地理解 SDN 控制的交换机与 SDN 控制器之间的交互,考虑图 5-16 中所示的例子,其中使用了 Dijkstra 算法(该算法我们已在 5.2 节中学习过)来决定最短路径路由,图 5-16 中的 SDN 场景与前面 5.2.1 节和 5.3 节中描述的每路由器控制场景有两个重要差异,Dijkstra 算法是实现在每台路由器中并且在所有网络路由器中洪泛链路状态更新:
Dijkstra 算法作为一个单独的程序执行,位于分组交换机的外部。
分组交换机向 SDN 控制器发送链路更新并且不互相发送。
在这个例子中,假设交换机 s1 和 s2 之间的链路断开;实现了最短路径路由选择,因此,除了 s2 操作未改变外, s1 s3 和 s4 的入和出流转发规则都受到影响。我们也假定 Open-Flow 被用作通信层协议,控制平面只执行链路状态路由选择而不执行其他功能。
1)交换机 s1 经历了自己与 s2 之间的链路故障,使用 OpenFlow “端口状态” 报文向 SDN 控制器通报该链路状态的更新。
2) SDN 控制器接收指示链路状态更新的 OpenFlow 报文,并且通告链路状态管理器,由管理器更新链路状态库。
3)实现 Dijkstra 链路状态路由选择的网络控制应用程序先前进行了注册,当链路状态更新时将得到通告。应用程序接收该链路状态更新的通告。
4)链路状态路由选择应用程序与链路状态管理器相互作用,以得到更新的链路状态;也会参考状态管理层中的其他组件。然后它计算新的最低开销路径。
5)链路状态路由选择应用则与流表管理器交互,流表管理器决定更新的流表。
6)流表管理器则使用 OpenFlow 协议更新位于受影响的交换机 s1 s2 和 s4 的流表项,其中 s1 此时将经 s4 将分组的目的地指向 s2,s2 此时将经中间交换机 s4 开始接收来自 s1 的分组,s4 此时必须转发来自 s1 且目的地为 s2 的分组。
这个例子虽简单,但图示了 SDN 控制平面如何提供控制平面服务( 此时为网络层路由选择) ,而该服务以前是以每路由器控制在每台路由器中实现的。现在能够容易地体会到, SDN 使能的 ISP 能够容易地将最低开销的路由选择转变为更加定制的路由选择方法。因为控制器的确能够随心所欲地定制流表,因此能够实现它喜欢的任何形式的转发,即只是通过改变它的应用控制软件。这种改变的便利性与传统的每路由器控制平面的情况形成对照,传统的情况必须要改变所有路由器中的软件,而这些路由器可能是由多个不同厂商提供给 ISP 的。
5.5.4 SDN 的过去和未来
5.6 ICMP:因特网控制报文协议
因特网控制报文协议(ICMP),被主机和路由器用来彼此沟通网络层的信息。ICMP 最典型的用途是差错报告。例如,当运行 HTTP 会话时,你也许会遇到一些诸如" 目的网络不可达 "之类的错误报文。这种报文就来源于 ICMP。在某个位置, IP 路由器不能找到一条通往 HTTP 请求中所指定的主机的路径,该路由器就会向你的主机生成并发出一个 ICMP 报文以指示该错误。
ICMP 通常被认为是 lP 的一部分,但从体系结构上讲它位于 IP 之上,因为 ICMP 报文是承载在 IP 分组中的。这就是说, ICMP 报文是作为 IP 有效载荷承载的,就像 TCP 与UDP 报文段作为 IP 有效载荷被承载那样。类似地,当一台主机收到一个指明上层协议为 ICMP 的 IP 数据报时(上层协议编码为1 ) ,它分解出该数据报的内容给 ICMP ,就像分解出一个数据报的内容给 TCP 和 UDP 一样。
ICMP 报文有一个类型字段和一个编码字段,并且包含引起该 ICMP 报文首次生成的 IP 数据报的首部和前 8 个字节(以便发送方能确定引发该差错的数据报)。在图 5-19 中显示了所选的 ICMP 报文类型,注意到 ICMP 报文并不仅是用于通知差错情况。
众所周知的 ping 程序发送 ICMP 类型 8 编码 0 的报文到指定主机。看到回显(echo) 请求,目的主机发回一个类型 0 编码 0 的 ICMP 回显回答。大多数 TCP/IP 实现直接在操作系统中支持ping 服务器,即该服务器不是一个进程。注意到客户程序需要能够指示操作系统产生一个类型 8 编码 0 的 ICMP 报文。
另一个有趣的 ICMP 报文是源抑制报文。这种报文在实践中很少使用,其最初目的是执行拥塞控制,即使得拥塞的路由器向一台主机发送 ICMP 源抑制报文,以强制该主机减小其发送速率 。我们在第 3 章已看到, TCP 在运输层有自己的拥塞控制机制,不需要利用网络层中的反馈信息,如 ICMP 源抑制报文。
在第 1 章中我们介绍了 Traceroute 程序,该程序允许我们跟踪从一台主机到世界上任意一台主机之间的路由。有趣的是, Traceroute 是用 ICMP 报文来实现的。为了判断源和目的地之间所有路由器的名字和地址,源主机中的 Tracerout 向目的地主机发送一系列普通 IP 数据报。这些数据报的每个携带了一个具有不可达 UDP 端口号 的 UDP 报文段。 第一个数据报的 TTL 为 1,第二个的 TTL 为2,第三个的 TTL 为 3,依次类推。该源主机也为每个数据报启动定时器 。当 n 个数据报到达第 n 路由器时,第 n 台路由器观察到这个数据报的 TT L 正好过期。根据 IP 协议规则,路由器丢弃该数据报并发送一个 ICMP 告警报文给源主机(类型 11 编码0)。该告警报文包含了路由器的名字和它的 IP 地址。当该 ICMP 报文返回源主机时,源主机从定时器得到往返时延,从 ICMP 报文中得到第 n 台路由器的名字与 IP 地址。
Traceroute 源主机是怎样知道何时停止发送 UDP 报文段的呢?前面讲过源主机为它发送的每个报文段的 TTL 字段加 1。因此,这些数据报之一将最终沿着这条路到达目的主机。因为该数据报包含了一个具有不可达端口号 UDP 报文段,该目的主机将向源发送一个端口不可达的 ICMP 报文(类型3 编码 3)。当源主机收到这个特别的 ICMP 报文时,知道它不需要再发送另外的探测分组。( 标准的 Traceroute 程序实际上用相同的 TTL 发送3 个一组的分组,因此 Traceroute 输出对每个TTL 提供了 3 个结果)。
以这种方式,源主机知道了位于它与目的主机之间的路由器数量和标识,以及两台主机之间的往返时延。注意到 Traceroute 客户程序必须能够指令操作系统产生具有特定 TTL值的 UDP 数据报,当 ICMP 报文到达时,也必须能够由它的操作系统进行通知。
5.7 网络管理和 SNMP
熟知网络是由许多复杂、交互的硬件和软件部件组成的,既包括构成网络的物理部件的链路、交换机、路由器、主机和其他设备,也包括控制和协调这些设备的许多协议。当一个机构将数以百计或数以千计的这种部件拼装在一起形成一个网络时,保持该网络 " 运行良好 " 对网络管理员无疑是一种挑战。5.5 节中看到, SDN 环境中逻辑上集中的控制器能够有助于这种过程。但是网络管理的挑战在 SDN 出现前很久就己如影相随了,网络管理员使用丰富的网络管理工具和方法来监视、管理和控制该网络。在本节中我们将学习这些工具和技术。
什么是网络管理?用一个单句来概括其定义:
网络管理包括了硬件、软件和人类元素的设置、综合和协调,以监视、测试、轮询、配置、分析、评价和控制网络及网元资源,用合理的成本满足实时性、运营性能和服务质量的要求。
给定了这个宽泛的定义,本节将仅涉及网络管理的入门知识,即网络管理员在执行其任务中所使用的体系结构、协议和信息库。
5.7.1 网络管理框架
图 5-20 显示了网络管理的关键组件。
① 管理服务器 (managing server) 是一个应用程序,通常有人的参与,并运行在网络运营中心 (NOC) 的集中式网络管理工作站上。管理服务器是执行网络管理活动的地方,它控制网络管理信息的收集、处理、分析和/或显示。正是在这里,发起控制网络行为的动作,人类网络管理员与网络设备打交道。
② 被管设备 (lnanaged device) 是网络装备的一部分(包括它的软件) ,位于被管理的网络中。被管设备可以是一台主机、路由器、交换机、中间盒、调制解调器、温度计或其他联网的设备。 在一个被管设备中,有几个所谓被管对象 (managed object)。这些被管对象是被管设备中一件的实际部分(例如,一块网络接口卡只是一台主机或路由器的一个组件)和用于这些硬件及软件组件的配置参数(例如,像OSPF 这样的 AS 内部路由选择协议)。
③ 一个被管设备中的每个被管对象的关联信息收集在管理信息库 (ManagemenLInformation Base , MIB) 中,我们将看到这些信息的值可供管理服务器所用(并且在许多场合下能够被设置) 。一个 MIB 对象可以是:一个计数器,例如由于 IP 数据报首部差错而由路由器丢弃的 IP 数据报的数量,或一台主机接收到的 UDP 报文段的数量;运行在一台 DNS 服务器上的软件版本的描述性信息;诸如一个特定设备功能是否正确的状态信息;或诸如到一个目的地的路由选择路径的特定协议的信息。MIB 对象由称为 SMI (StrucLure of Management Information)的数据描述语言所定义。使用形式化定义语言可以确保网络管理数据的语法和语义是定义良好的和无二义性的。相关的 MIB 对象被收集在 MIB 模块(module) 中。
④ 在每个被管设备中还驻留有网络管理代理 (network management agent) ,它是运行在被管设备中的一个进程,该进程与管理服务器通信,在管理服务器的命令和控制下在被管设备中采取本地动作。网络管理代理类似于我们在图 5-2 中看到的路由选择代理。
网络管理框架的最后组件是网络管理协议 (network management protocol)。该协议运行在管理服务器和被管设备之间,允许管理服务器查询被管设备的状态,并经过其代理间接地在这些设备上采取行动。代理能够使用网络管理协议向管理服务器通知异常事件(如组件故障或超过了性能阔值)。 重要的是注意到网络管理协议自己不能管理网络。恰恰相反,它为网络管理员提供了一种能力,使他们能够管理( "监视、测试、轮询、配置、分析、评价和控制)网络。这是一种细微但却重要的区别。在下节中,我们将讨论因特网的 SNMP 协议。
5.7.2 简单网络管理协议
简单网络管理协议 (Simple Network Management Protocol) 版本 (SNMPv2) 是一个应用层协议,用于在管理服务器和代表管理服务器执行的代理之间传递网络管理控制和信息报文。SNMP 最常使用的是请求响应模式,其中 SNMP 管理服务器向SNMP 代理发送一个请求,代理接收到该请求后,执行某些动作,然后对该请求发送一个回答。请求通常用于查询(检索)或修改(设置)与某被管设备关联的 MIB 对象值。SNMP 第二个常被使用的是代理向管理服务器发送的一种非请求报文,该报文称为 陷阱报文( trap message) 。陷阱报文用于通知管理服务器,一个异常情况(例如一个链路接口启动或关闭)已经导致了 MIB 对象值的改变。
表 5-2 中显示了 SNMPv2 定义的 7 种类型的报文,这些报文一般称为 协议数据单元(PDU),图 5-21 显示了这些 PDU 的格式。
① GetRequest、GetNextRequest 和 GetBulkRequest PDU 都是管理服务器向代理发送的,以请求位于该代理所在的被管设备中的一个或多个 MIB 对象值。其值被请求的 MIB对象的对象标识符定义在该 PDU 的变量绑定部分。GetRequest GetNextRequest 和GetBulkRequest 的差异在于它们的数据请求粒度。GetRequest 能够请求 MIB 值的任意集合;多个 GetNextRequest 能用于顺序地读取 MIB 对象的列表或表格; GetBulkRequest 允许读取大块数据,能够避免因发送多个GetRequest 或 GetNextRequest报文可能导致的额外开销。在所有这三种情况下,代理用包括该对象标识符和它们相关值的 Response PDU 进行响应。
② 管理服务器使用 SetRequest PDU 来设置位于被管设备中的一个或多个 MIB 对象的值。
代理用带有" "no Error'''差错状态的 Response PDU 进行应答,以证实该值的确已被设置。
③ 管理服务器使用 InformRequest PDU 来通知另一个 MIB 信息管理服务器,后者对于接收服务器是远程的。
④ Response PDU 通常从被管设备发送给管理服务器,以响应来自该服务器的请求报文,返回所请求的信息。
⑤ SNMPv2 PDU 的最后一种类型是陷阱报文。陷阱报文是异步产生的, 即它们不是为了响应接收到的请求而产生的,而是为了响应管理服务器要求通知的事件而产生的。RFC 3418 定义了周知的陷阱类础,其中包括设备的冷启动或热启动、链路就绪或故障、找不到相邻设备,或鉴别失效事件。接收到的陷阱请求不要求从管理服务器得到响应。
考虑到 SNMPv2 请求响应性质,这时需要注意到尽管 SNMP PDU 能够通过许多不同的运输协议传输,但 SNMP PDU 通常是作为 UDP 数据报的载荷进行传输的。RFC 3417 的确表明 UDP 是"首选的运输映射"。然而,由于 UDP 是一种不可靠的运输协议,因而不能确保一个请求或它的响应能够被它希望的目的地接收到。管理服务器用该 PDU 的请求 ID字段为它向代理发送的请求编号:该代理的响应从接收到的请求中获取它的请求 ID。因此,该请求 ID 字段能被管理服务器用来检测丢失的请求或回答。如果在一定时间后还没有收到对应的响应,由管理服务器来决定是否重传一个请求。特别是, SNMP 标准没有强制任何特殊的重传过程,即使初始进行重传。它只是要求管理服务器"需要根据重传的频率和周期做出负责任的动作。当然,这使人想知道一个"负责任的 "协议应当如何动作。