所以我读到,当路由器知道到达目的地的成本相等的两条路径时,它可以执行负载平衡。这种负载平衡发生在域间或域内。我无法理解这一点,因为我知道当两条路径具有相同的成本时,BGP 会选择“小”IP 地址。
域间和域内负载平衡有什么区别?
要回答这个问题,我们必须定义术语“域”。简单地说,互联网是一个网络中的网络。在 BGP 术语中,Internet 上有许多自治系统 (AS),每个自治系统都是一个网络(或域)。例如,一家公司可能拥有一个非常大的网络,但由单个 AS 表示,因此是 BGP 中的单个“节点”。
术语域间路由描述了自治系统之间路由前缀的过程,其中域内路由是指单个 AS内的路由。
但是,我不确定您最后一句话的意思。当到同一目的地的两条路径具有相同的成本时(即在最基本的 BGP 中,AS 路径的长度,因此是路由经过的 AS 数量)。有关 BGP 如何选择路径的详细讨论,请参见此Cisco 文档。
更新
正如评论中所证明的那样,我可能误解了 OP 问题。问题其实就是负载均衡是如何进行的,常见的域间路由协议和域内路由协议在负载均衡上的区别在哪里。
域间路由
BGP 是域间路由的事实上的标准,默认情况下不会执行负载平衡。但是,它可以配置为这样做。这里有两个主要选项:
- 配置 BGP 使用环回接口配对,并使用一些底层路由(例如静态路由或其他内部路由协议)提供到对端的相等路径,这将有效地开启负载均衡
- 使用 BGP 多路径功能,但是有点复杂。必须考虑是否应该使用 iBGP(内部)或 eBGP(外部)对等方或两者都执行负载平衡。要成为多路径的候选者,路由在以下属性中必须相等:
- 重量
- 本地偏好
- AS-PATH 长度
- 起源
- 医学博士
您可以通过搜索此关键字或查看此Cisco 文档来找到有关 BGP 多路径的详细信息。
域内路由
大多数内部路由协议都支持更简单的负载平衡。只要使用的一个度量相等,就可以将多个等成本路由安装到路由表中。例如,默认情况下 OSPF 使用最多四个等价路由。其他路由协议(例如 EIGRP)甚至可以执行不等价多路径。请参阅实际路由协议的定义以了解其默认行为。
最后一句
澄清一下:是否可以使用相等的路径取决于路由协议。在任何情况下,如果存在相同的路径,则两条路径都安装到路由器上的本地转发表中,而其他非路由协议特定的机制(例如 Cisco 路由器上的 CEF)用于实际负载平衡。
具有相等成本的两条路径通常称为等成本多路径 (ECMP) 机制。ECMP 通常运行良好,但有一些注意事项。在讨论在并行链路上运行 BGP 的问题之前,重要的是要了解流量是如何在多个并行链路上分配的。
最简单的方法是通过链路 A 传输数据包 1,通过链路 B 传输数据包 2,再次通过链路 A 传输数据包 3,通过链路 B 传输数据包 4,依此类推。这是每包负载均衡。per-packet负载均衡的问题是当包1、3、4是属于同一个TCP会话的1500字节的数据包,而包2是一个小的TCP ACK包时,包3必须等待包1要传输,但数据包 4 不必在更短的数据包 2 后面等待几乎一样长的时间,因此数据包 4 最终会在数据包 3 之前传输。
因此,按数据包负载平衡会导致重新排序。理论上,这很好,因为 TCP 将简单地缓冲重新排序的数据包,并以正确的顺序将内部数据传送到接收应用程序。但是,乱序接收数据包会让TCP认为有丢包,所以它重新发送数据包并减慢其传输速率。为避免此类问题,路由器和交换机努力确保属于同一 TCP 会话(或 UDP 流)的所有数据包都通过同一链路传输。当然,这反过来也有一个缺点,即单个 TCP 会话只能使用一个链接;因此,ECMP 仅在流量由多个 TCP 会话组成时才有用。
路由器和交换机通常无法跟踪单个 TCP 会话,因此它们的数据包可以通过同一链路传输。相反,他们查看 IP/TCP/UDP/ICMP 标头中的几个字段,并根据这些字段的内容将数据包分组在一起。有些交换机甚至无法查看 IP 报头内部,从而根据以太网 MAC 地址执行负载均衡。那效果不佳,因为这样两个路由器之间的所有流量都通过同一链路传输。
执行负载平衡的更细粒度的方法是基于三元组:IP 标头中的协议号(即 TCP、UDP、ICMP 等)以及 IP 源地址和目标地址。这比仅使用 MAC 地址来确定应通过同一链路传输哪些数据包更有效。执行 ECMP 的最佳方法是使用 5 元组:协议号、IP 地址以及 TCP 或 UDP 源和目标端口号。实施 ECMP 的路由器和交换机在这些字段上计算散列函数,然后使用(部分)结果散列值来选择传输数据包的链路。(见RFC 2992) 由于 5 元组中的字段对于属于同一会话的所有数据包是相同的,因此哈希值相同,因此属于同一会话的所有数据包最终都使用相同的链路。这很有效,但在实践中,在所有链路被平等利用之前,它仍然可能需要多达一千个 TCP 会话。
在 ECMP 算法可以在并行链路上分发数据包之前,必须首先说服BGP等路由协议并行使用多条链路。BGP 和 ECMP 可以通过三种方式协同工作:
- 使用 IEEE 802.3ad 或 EtherChannel 在以太网级别捆绑链路
- 使用环回地址在多条链路上建立一个 BGP 会话
- 每个并行链路上都有一个单独的 BGP 会话
为了实现负载平衡,对于通过并行 BGP 会话学习的前缀,以下路径属性需要相同:
- 重量
- 本地偏好
- AS路径长度
- 起源
- 医学博士
邻居 AS 或整个 AS 路径(取决于 IOS 版本) 为每个并行链路使用单独的 BGP 会话会使用更多内存和 CPU 周期,因此通常这不是首选选项。然而,这个选项确实有一个重要的好处:与其他两个选项不同,如果链路连接到另一端的不同路由器,只要上面列出的属性相同,这个选项也有效。