一文读懂MPLS

MPLS(多协议标签交换) 顾名思义,它不考虑协议(多协议),使用标签(标签交换)在网络中移动数据包。多年来,MPLS 一直是网络运营商确保实时应用程序可靠连接的首选技术。

MPLS 通过将标签应用于数据包的报头来封装传入的数据包。MPLS 域中的每个路由器都会查看 MPLS 标签以了解如何处理每个数据包,但其不查看或关心数据包中的内容,它只关心标签。当数据包离开 MPLS 域时,标签将被移除,由标准 IP 路由接管。

可以看出,MPLS技术的核心就是标签交换。本文我们将从标签入手,逐步了解什么是MPLS。

MPLS 为什么要使用标签?

MPLS 为什么要添加标签?什么是标签?

我们先看看VLAN 标签是什么样,大概就知道什么是 MPLS 标签了。标签本身基本上只是数字,如下图所示,第 4 行写着“Label:299776”。

在此数据包捕获中,标签被插入到“第 2 层”以太网报头和“第 3 层”IP 报头之间。这就是为什么有人说 MPLS 工作在“第2层半”。

这些数字,也就是这些标签,只对接收数据包的路由器有意义。本质上,标签就像一条指令,这条指令通常做两件事:

它告诉接收路由器如何转发数据包

或者,它告诉接收路由器该数据包是特定 VPN 的一部分

当一个标签用于在特定方向转发数据包时,我们称之为传输标签。当一个标签用于告诉路由器该数据包属于一个特定的 VPN 时,它被称为服务标签,有时也称为VPN 标签。MPLS VPN 让许多客户都可以使用相同的私有 IP 范围,因为接收路由器不会查看目标 IP 地址。相反,VPN 标签会告诉路由器数据包属于哪个客户。

路由器如何学习这些标签?

IP 是一种寻址方案,需要其他协议在各处实际通告 IP。我们可以以类似的方式考虑 MPLS:MPLS 是一种标签方案,需要其他协议在各处实际通告这些标签。

先说说如何通告MPLS传输标签。有四种常见的方法,这四种协议以完全不同的方式工作,并且有不同的用例。

LDP(Label Distribution Protocol)代表标签分发协议。这是一个非常基本的协议,并且易于配置。流量将始终遵循 OSPF/IS-IS 指定的最佳路径。在 MPLS 网络中,两个标签交换路由器(LSR)必须用在它们之间或通过它们转发流量的标签上达成一致。

RSVP 是资源预留协议。RSVP 相比LDP 需要手动配置,但优势在于它提供了大量的流量工程功能,能够按照路由协议的要求以不同的方式移动流量,例如绕过带宽问题进行路由,或明确避免网络中的某些链路。

分段路由是一种在 OSPF 或 IS-IS 内部发布标签的方法,这意味着不需要运行额外的协议来通告标签。它可以实时告诉路由器使用哪个标签到达哪个目的地。通过将决策置于中央控制器中,可以获得真正的网络全局视图,甚至在 OSPF 区域或 IS-IS 级别,以及不同的自治系统之间。

BGP-Labelled Unicast是一个特殊的 BGP 地址族,往往只用于一些非常特地的、更高级的场景。

MPLS VPN 标签几乎都是在 BGP 中通告的。毕竟,如果不能在两个路由器之间传输数据包,就不能在它们之间运行 VPN。

路由器如何处理这些标签?

两个路由器之间的对话可能是这样的,路由器 B 对路由器 A 说“如果你想让我将数据包转发给路由器Z,包裹寄给我的时候贴上标签123456”。然后路由器 B 会对自己编程,如果数据包带有标签 123456,则该数据包会始终从特定接口发送出去。

路由器 B 并不知道这个传出接口是不是通往路由器 Z 的“最佳”路径。当路由器 B 将此数据包发送到路由器 C 时,路由器 C 也将根据标签知道如何处理该数据包,路由器 D 和路由器 E 等也会如此,一直到终点目的地。只要从一端到另一端有一个标签交换路径,沿途的路由器就能够成功地将数据包从 A 传输到 Z 。

路由器 B 甚至可能在发送标签时将标签更改为其他内容。在 LDP 和 RSVP 中,标签通常只对路由器本身有意义,沿途的每个路由器都可以自己决定它希望前一跳使用什么标签。当标签沿途发生变化时,我们称之为“交换”标签。例如,路由器 A 将标签为 123456 的数据包发送到路由器 B ,路由器 B 在将其发送到路由器 C 之前可以将其“交换”为标签 345678。

(相比之下,Segment Routing 中的某些标签是全局的,因此它不是MPLS 的通用规则。)

上面的例子要理解的关键是,当路由器 B 收到数据包并将其转发到路由器 C 时,路由器 B 根本没有查看目标 IP。相反,是传输标签告诉路由器 B 如何处理数据包。

因为没有查看底层目标地址,所以协议可以是 IP、IPv6 或任何其他协议,所以说是多协议标签交换。

向数据包添加标签有何意义?

到目前为止所说的一切听起来都非常像常规 IP 路由。如果没有 MPLS,路由器也会查看目标 IP 地址,然后将数据包发送到下一跳。那么MPLS 有什么意义呢?

如果将网络设置为每个路由器都知道整个网络中的每个 IP 地址,那么路由器 B 肯定可以从路由器 A 接收数据包,查看目标地址,检查自己的路由表,找到“最佳”路线,然后发送数据包。

但这里有一个问题:如果不想让一切都发送到所谓的“最佳”路径,会发生什么?

例如,如果所有内容都沿着一条“最佳”路径发送,则该链接可能会开始被大量使用,甚至可能达到极限。很可能会有其他根本没有被使用的潜在路径,最好将一些选择性流量发送到次优路径,以充分利用网络。

当存在另一条不太好且带宽可用的路径时,该如何解决链路饱和的问题?

如果从路由协议的角度来看,有两条或多条到达目的地的路径同样“好”,那么可以利用ECMP 或等价多路径,对流量进行负载平衡,并充分利用链接。

SD-WAN可以根据目的 IP 地址以外的质量,有选择地将流量路由到不同的链路,也许是基于应用程序本身,也可能是源 IP 地址。这对分支机构来说非常好,但对于每秒有很多千兆流量的服务提供商规模的网络,以及数以万计的用户前往数百万目的地的网络来说,很难真正的扩展。

我们需要的是某种可扩展的、功能丰富的协议,它允许以选择的任何方式发送流量,而不总是遵循“最佳”路径。

几十年前,这个问题正是服务提供商和大型企业面临的问题之一,而MPLS 就是解决答案。

标签交换路径

基于标签转发数据包的系统的优点在于,中转路由器不需要知道,甚至不需要关心数据包上的 IPv4 或 IPv6 地址。它们只关心数据包进入了带有标签 X 的接口,因此应该从带有标签 Y 的不同接口发送出去,以便路径上的下一个路由器知道如何处理它。

我们称这个端到端标记路径为LSP,或标签交换路径。

从路由器 1 开始检查 LSP ,一直到路由器 10。为了方便起见,我们假设它是通过RSVP创建的。给 RSVP LSP 一个名字和一个目的地,结果如下所示:

LSP 是单向的,如果要使流量在真实网络中正常工作,需要在相反的方向上建立第二个 LSP。但为了简单演示,我们只关注一个 LSP 。

如上图所示:

路由器 1 和路由器 10 是PE 路由器,或Provider Edge。
路由器 2、3、4 和 5 都是中转路由器,简称为P(Provider) 路由器。
路由器 1 称为首端或入口路由器,将 LSP 想象成流量进入的隧道。
同样,路由器 10 称为尾端或出口路由器。

假设R1 和 R10 正在进行BGP,R10 对 R1 说:“如果你想到达 69.69.69.0/24,请将流量发送给我。”之后,R10 会将通告其环回为该前缀的下一跳。LSP 进入R10 的环回。

路由器 2、3、4 和 5 不需要运行 BGP,它们只查看数据包上的标签,不查看 IP 地址。然后计算出需要从哪个接口传出,相应地交换标签。

MPLS VPN

假设客户需要为其各个办公室购买 100 个 WAN 链接,但要求将其放在自己的专用网络中,不要放在公共互联网上。服务提供商该如何实现这一点?

可以通过在 WAN 链接的末端添加一些额外的配置。

服务提供商会在一个路由器内部创建多个“虚拟”路由表,这些路由表相互独立,互不通信。客户有自己专门的路由表,称为 VRF,代表Virtual Routing and Forward。

除了客户和服务提供商之外,没有人可以“看到”流量。客户之间无法相互通信,因为他们在完全独立的路由表中。

核心路由器不运行 BGP,它们不知道涉及的 IP,甚至不查看 IP 标头。它们只看标签,然后进行相应地转发。MPLS VPN 的工作方式完全相同。VPN 只需要被边缘路由器知道即可。可以沿着标签交换路径发送 VPN 流量,这意味着核心设备甚至不需要知道 VPN 的存在,它们只需要知道将流量发送到哪个远程 PE。

但这里有一个问题:在刚才看到的拓扑中,如果 R1 发送一个数据包到私有 IP 地址 10.0.6.9,在数百个 VPN 客户中,R10 如何知道这个前缀属于哪一个?

这就是标签堆栈思想由来。我们可以在数据包内添加第二个标签,告诉 R10 该数据包属于哪个 VPN。数据包捕获如下:

  • 以太网报头
  • 外层传输标签<—逐跳更改
  • 内部 VPN 标签 <–仅对 R10 有意义
  • IP报头
  • TCP/UDP 等报头
  • 有效载荷

沿途的每一跳只查看外部标签,然后当数据包到达 R10 时,该 PE 可以查看内部 VPN 标签并确定它的真正目的地。

这个 MPLS 标签保留在服务提供商核心中,从 PE 到现场客户路由器的实际 WAN 链路将是纯 IP。只有在穿过服务提供商网络时才需要标签:从服务提供商到客户的流量没有标签。

*本文系SDNLAB编译自Chris Parker的技术博客


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/26131.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于23-01-15
2