UDP 中可以重新路由吗?

网络工程 路由 通讯协议 UDP 第4层 传输协议
2021-07-23 23:43:44

所以我试图了解 TCP 和 UDP 段的路由。我有几件事让我感到困惑:

  • 在 TCP 中,是否有关于在为两个端系统之间建立的连接进行重新路由之前将丢弃多少数据包的规范?
  • 在 UDP 中,甚至可以重新路由吗?如果特定路由不断丢失大量数据,那么双方是否会使用另一条路由传输数据,因为从来没有连接建立阶段。那么,如果某处通信链路出现故障,如何在两方之间建立另一条路由。一般来说,UDP 的路由是如何决定的?我认为这是一个很好的问题?

提前感谢您的回答。

4个回答

这不是决定数据包将遵循哪条路由的主机,路径中的每个路由器都做出自己的决定。

(实际上,始发主机可以使用 IP严格源选项强制数据包通过特定路由,但它很少使用,如果有的话,它被 Internet 上的路由器完全忽略)

因此,每个路由器都可以根据网络状况(链路丢弃、链路拥塞、负载平衡……)更改数据包的路由器

主机可以决定的是改变它的 TCP 窗口(流量控制),修改它发送信息的速率,但这不会影响路由。

除了基于策略的路由,路由是第 3 层决策,不考虑第 4 层(TCP / UDP)信息,因此它以相同的方式执行 TCP / UDP / ICMP 等...

我猜您对 IP 和传输层的职责感到困惑。

IP层负责根据拥塞等因素决定每个数据包的路由。任何传输层协议都不保证给定连接的所有数据包将采用的路径。

但是 TCP 确保的是,由于它是面向连接的,因此如果某些数据包丢失或丢失,它会将它们重新发送到 UDP 中丢失的另一台主机,因为它不使用排序等方法跟踪数据包丢失。

好吧:你不能在这里得到一个甚至一次都没有提到“IP”这个词的答案。我需要解决这个问题...重要的东西在第一部分,如果你时间不够,你可以跳过动机部分。

洋葱(OSI模型)

让我非常清楚地说明这一点:在谈论网络时,您必须开始分层思考。在互联网的情况下,这意味着OSI 模型

  • 第 5、6、7 层:会话、演示、应用程序(简称:应用程序内容)。
  • 第 4 层:传输;段(TCP)/数据报(UDP);网络上各点之间数据段的可靠传输,包括分段、确认和多路复用。
  • 第 3 层:网络;数据包(此处:“Internet 数据包”或“IP”);构建和管理多节点网络,包括寻址、路由和流量控制。
  • 第 2 层:两个节点之间的流量(这里我们有 MAC 地址等,即以太网)。
  • 第 1 层:物理零碎(电缆、电子协议,还有 WLAN 无线电波和低级加密)。

(3 和 4 从维基百科复制,其余缩短,因为它在这里不相关。)

虽然从理论上讲,您可以在路由决策中使用任何层,但 OSI 模型(至少达到并包括第 4 级,在此之上事情变得有点模糊)不是某种理论上的 CS 构造,而是绝对实用和“真实”的。术语“路由”与第 3 层紧密相连,出于所有意图和目的,它确实发生在第 3 层。这意味着:IP 数据包被路由。我们既不路由以太网帧,也不路由 TCP 或 UDP 连接。

TCP/IP 的路由与 UDP/IP 相同,因为 TCP 和 UDP 都没有任何作用。通常; 此处与“/IP”部分相关。如果有任何区别,那就是协议是 TCP 还是 UDP(例如:如果您正在玩在线游戏并且它使用 UDP,您可能决定将所有 UDP 发送到某个单独的低延迟链接,而不是您的高延迟批量链接),而不是单个 IP 是否属于单个 TCP 或 UDP 流。

动机(摘要)

一个动机:想想你什么时候浏览维基百科或 Stack Exchange 页面。您的浏览器不仅请求一个资源,而且每页请求数十个甚至数百个资源(小图像、CSS、javascript 文件等等)。假设它们都来自同一个服务器(并假设您的浏览器不支持 HTTP 请求的 keep-alive),那么在最坏的情况下,您的 PC 和 HTTP 服务器之间将有数十个单独的 TCP/IP 连接。路由器决定在第 4 层进行路由(即根据它们属于哪个单独的 TCP/IP 流来路由流量)完全没有意义——所有这些 TCP/IP 连接共享相同的源和目的地,并且只查看单个 IP 数据包更有意义。这意味着,例如,如果在您下载一个非常大的页面期间该流量的最佳路线发生变化,所有IP 都可以通过另一种方式路由,而不是任何给定 TCP/IP 流的固定路由。

另一个例子是像 shell 会话这样的 TCP/IP 连接。假设您在早上打开它并一直打开到晚上(并假设没有超时/自动注销功能......)。那么,如果您以某种方式被迫在所有这些小时内使用相同的路线,那将完全没用;能够为每个数据包做出决定会更有用,比如间歇性故障是否会暂时中断某个路径。

动机(技术)

此外,即使他们只关注 IP 而不是更高层,高带宽路由器也有很多事情要做(原文如此)。大路由器已经非常昂贵,而且它真的不是他们做一件容易的事。

现在,如果您想跟踪 TCP 连接,您将在路由决策中引入一种额外的基于流的状态虽然可能有也可能没有路由算法这样做,但您可以想象,在通常情况下,在某些匿名路由器上承担这种额外的 CPU 和 RAM 负担毫无意义。网。如果您的应用程序与您面前的实际路由器紧密耦合,那么可能会有一些有用的应用程序,但这将是一个非常特殊的情况。

这就是为什么我们首先使用基于数据包的交换/路由,其中​​包括:我们完全接受,不,需求,需要并且通常在源和目的地之间没有固定路径。过去,静态路由算法需要跟踪每个连接的路由;现在已经不是这样了。

因此,即使规则可能存在一些例外情况,并且即使您确实找到了一些高级路由器,它们可以根据其 TCP 或 UDP 有效负载以某种方式影响 IP 路由,但对于绝大多数现有路由器/网络,您也不会找到这样的. 如果你这样做了,那些基于 TCP 的功能更有可能被用作入侵检测(即,更像防火墙)或更接近代理而不是纯粹的路由目的。即便如此,您可能会发现他们在进行连接检查时根本不关心路由。

传输层 (TCP/UDP) 不决定数据包采用哪条路由。并且发送主机只决定将第一跳的数据包发送到哪里。通常,第一跳只有一个选项,在这种情况下,发送主机无法做出任何决定。

但是,如果使用等价多路径 (ECMP) 路由,则发送方可以尝试通过改变 ECMP 检查的字段来影响数据包将采用的路径。通常这意味着使用不同的源端口号重试连接。

如果您正在使用多路径 TCP(在您可以使用它之前,两个端点都必须支持它)将尝试不同的 IP 和端口号底层组合,这可以为您提供更高的吞吐量和更好的网络链接故障恢复能力。

我知道用 UDP 无法实现相同的目标。UDP 之上的协议可以构建自己的方式来影响路由决策。例如,如果 DNS 请求没有收到响应,客户端可以使用不同的源端口号重试,这可能导致数据包采用不同的路由。

ECMP 也有可能包含 RFC 6438 中讨论的流标签。使用它,原则上发送方可以更改路由决策,而无需更改 IP 或端口号。但是,更改现有连接的流标签可能会以其他方式导致损坏。