是否存在一种方法可以将 TCP/IP 流量拆分到三条路由并使用最先到达目的地的数据包?
我正在想象类似多宿主的东西,但要求每次在所有三个链路上发送流量。
我们有三条通往 IP 地址的路由(通过不同的物理接口连接到不同的 ISP),并希望始终通过冗余/故障转移实现最小延迟。我们希望应用层看到单个 IP 地址,但让流量充分利用这三个连接。
所有三个连接上的延迟/可用性都会发生变化,所以我想知道是否有可能沿着所有路由发送数据包,并让获胜的数据包成为被使用的数据包。
答案1
我认为你所建议的方法完全是错误的。
为什么?
这是对资源的浪费,就像“通过模糊性实现安全”一样,修补问题而不是直接解决问题,并且会产生复杂性,而这种复杂性可以通过更好设计的解决方案来避免(同时通过三个链接解决网络问题,我不喜欢这样!)
那么接下来呢?
正如您自己所说,每个链接的延迟都会波动。我在这里看到了几种方法,无论哪种方法,解决方案都需要是为这种情况(解决延迟和 RTT 问题)而设计的。寻找解决方案,解决您的实际问题,而不是“如何同时使用所有三个链接?”的元问题。
解决方案一
首先,如果您有三条链路,请放弃其中的 1 或 2 条,然后将资金重新投资于具有保证延迟的链路。ISP 出售点对点链路(因此,请将一条链路连接到您的目的地),并附有延迟的 SLA,这样您就赢了。如果您愿意,可以保留第三条链路作为备份。
解决方案二
第二种选择是使用喜欢Cisco 的 OER(最佳边缘路由)。其他供应商也有类似的技术,或者如果您有 *nix 防火墙/路由器/网关,您也可以为自己编写脚本或编码类似的解决方案。以 Cisco OER 为例,它允许您设置到目的地的测试(即 ping),它会测量测试的质量,如果质量下降到某个点,流量将重新路由到另一条路。因此,您可以设置延迟测试并始终使用延迟最低的路由。
解决方案三
MPLS TE - 多协议标签交换 - 流量工程。我知道这有点难懂,但 MPLS-TE 允许您在两个端点之间设置隧道,并再次将流量路由到延迟最低的路径。不过这有点专业化;您要么需要一个可以为您完成此操作的优秀 ISP,要么需要投资一些还不错的路由器并自行设置。您可以在远程路由之间运行 MPLS over GRE 并进行设置。
解决方案四
一种可能的想法是,您可以在网络的两端之间使用多个 VPN 或隧道,并在所有三个链路上引入按数据包负载平衡(轮询)。例如,您可以使用 Cisco 和 Juniper 路由器来执行此操作,或者,如果您使用 Linux,则可以使用类似的软件包teql
,或购买 FireBrick 之类的硬件设备。如果所有链路都有类似的延迟(因此您不会混合使用 ADSL、3G 和光纤),那么这种方法是可行的。一般不建议这样做,因为无序的数据包会导致应用程序出现问题,所以不要混合我刚才提到的延迟式链路。但是,我现在确实在几个链路上启用了它,在我上一个地方也是如此,它们没有问题。我敢肯定数据包偶尔可能会无序到达,但这种情况一定很少见,因为我从未注意到任何问题。
解决方案五
您提到延迟与您的应用程序有关。由于我不知道您的应用程序是什么或它是如何工作的,因此我可能总是会理智地建议您在应用程序层对此进行一些处理。我的意思是,重新编码应用程序以处理更高延迟的链接。糟糕的事情总会发生,即使您实施了神奇的低延迟网络解决方案,糟糕的事情也会发生,延迟会上升,为最坏的情况做计划,将其编码到您的应用程序中以处理这种不良情况,以防最坏的情况发生(错误的计划和所有情况,FMEA 等)。
答案2
这确实可能是一种非常糟糕的方法,因为您只会让流量充斥链接。如果我理解正确的话,VPN/隧道软件也不是您真正想要的,因为它更像是一种保护进入内部网络或远程访问的流量的方法。
在我看来,您需要购买一个支持链路聚合的硬件设备,它会智能地决定您的出站流量需要路由到哪个端口。许多当前的防火墙都可以做到这一点,或者您可能可以使用 Cisco 设备并使用 BGP。
答案3
没有任何方法可以像您建议的那样“多播”单播数据包。以下是一些替代方案:
尝试运行最新版本的 OLSRD,例如在每个 WAN 接口上运行 OpenWRT OLSRd 版本,在多宿主主机的接口上运行 Debian 或 Ubuntu OLSRd。将 OLSRD 的 LinkQualityLevel 配置为 2 应会导致使用最低延迟的 ISP 链路,尽管除了到 ISP 的下一跳之外,到任何特定 Internet 目标的延迟都不会是最低的。
如果提前知道目的地,或者您有一组很好的代表性目的地,则可以用 Python 或 Perl 编写一个守护进程,定期测试到每个目的地的 ping 时间。您将在每个 WAN 接口(可能意味着每个面向 ISP 的路由器)上运行守护进程,并使用客户端程序查询来自多宿主主机的 ping 数据,该客户端程序根据最佳 ping 时间更改多宿主主机上的默认路由。编写和调试这可能需要您花费 50 到 100 个小时的编程时间。
如果您使用 BGP,则需要注册 ASN 并要求您的 ISP 配置其路由器以使用 BGP 与您通信。除非您注册大量 IP 地址,否则这对您来说可能不可行。
您尝试执行的路由类型通常称为优化链路状态路由。