我不知道这是问的地方。这可能是一个非常愚蠢的问题。我假设某些处理器必须处理数据帧以进行切换/路由。现代处理器的速度只有几GHz。他们如何处理以比操作更快的速度来处理数据?

#1 楼

您完全正确,如果我们必须每位使用一个指令周期,那么10Gbps将无法实现。因此,首先要注意的是,我们每条CPU指令处理一个字-64位。

即使如此,对于性能而言,最糟糕的事情就是让CPU访问a的所有字。包。因此,重点放在数据包的“零复制”处理上。其中一些技巧在于接口本身:它们具有DMA(“直接内存访问”),因此以太网控制器芯片将数据复制到RAM中;他们计算校验和,以便CPU不必访问数据包中的所有字。其中一些是在数据结构设计中的:我们小心地对齐数据包缓冲区,以便我们可以通过更改页表条目的所有权来移动它们。其中一些只是仔细的编程,以确保访问包数据的次数最少,并且最好直到接收应用程序时才访问。

一旦完成所有这些操作,下一个限制就是一次处理一个数据包的开销。因此,在以太网控制器和内核中都有大量的“分段卸载”功能,以便我们处理数据包组。我们甚至会延迟从以太网控制器中检索数据,以使这些组更大。

最后,我们有特殊情况的快捷方式,例如内核的sendfile()调用,该调用是使用磁盘从网络到网络的明确路径。

我们甚至可以使用网络接口卡的硬件功能,将PCI总线视为之间的总线,在特殊情况下进行路由(将数据包从一个接口转发到另一个接口)卡,而不是让CPU参与进来。在通用操作系统中无法做到这一点,但是像Intel这样的供应商提供了在其以太网控制器上实现此类功能的软件库。

完全脱离CPU,我们甚至可以构建专用路由器,其中所有转发任务都在硬件中进行。由于PCI总线将成为限制,因此它们需要运行多个并行总线。甚至多个并行总线连接到多个并行纵横开关组件。在市场的一端,一个基于TCAM的小型以太网交换机就是一个例子。在市场的另一端,瞻博网络M40将是一种规范设计。

典型的交换机将开始接收数据包,在TCAM中查找目标地址,并在标签上附加一个出口-端口将数据包发送到数据包,然后将仍然传入的数据包DMA发送到出口端口的控制器。请注意,如果输出端口拥塞,那么在此简单的交换机上可以做的就是丢弃入口数据包。因此,当链接改变速度并需要排队时,简单的开关并不是一个好的选择。当然,存在更复杂的交换机,为此您需要支付更多的费用。

典型的路由器将收到一个数据包,并将其保留在较短的队列中。将在静态RAM中查找目标IP地址,然后将数据包分解为多个单元以减少延迟,并且每个单元都将发送到交叉开关到出口卡。该卡会将信元重新组装成一个数据包,并将该数据包从出口接口排队。出口接口上的队列可能很复杂。

评论


好答案。您能详细说明一下数据包随后将分解为多个单元以减少延迟吗?

–艾迪
16年5月17日在14:46

在路由器设计中,您可以简单地通过交叉开关(或其他类型的卡间总线)将数据包从一个线卡发送到另一个。但是随后,延迟受数据包的长度限制-当数据包通过纵横开关进行发送时,您将有另一个完整的数据包传输延迟。为避免这种情况,我们可以将多个并行链接插入纵横开关,并在这些链接之间拆分数据包。这样,大数据包的等待时间就大大减少了。拆分数据包的一部分称为“单元”。

–vk5tu
16年5月17日在23:37

我知道这个答案是两年前的事,但是非常感谢。我和原始海报有相同的问题,并在搜索中找到了您的答案。它写得很好而且很彻底。谢谢!

–loneboat
18年5月10日在23:54

#2 楼

如今,几乎所有交换和大部分路由都由硬件处理,因此处理器速度在异常情况下发挥了作用。对于服务器等而言,处理器可能不够快。过去就是这种情况。当1 Gbps以太网首次出现时,用于PC和服务器的总线只能处理400 Mbps。

当处理器不够快时,会发生流量下降的情况。无论如何,可能会丢弃大量流量,因为如果正确完成,这就是处理拥塞的方式。 RED(随机早期检测)是一种用于随机丢弃队列中的数据包以防止其填充和丢弃数据包的方法。这可以帮助防止TCP同步。在交换机上会发生很多下降,其中可能需要将一个速度的多个端口发送到相同速度的另一个端口。

评论


这将入口丢弃与出口丢弃混淆。丢弃通常在以太网接口的环形缓冲区溢出时发生,例如在CPU无法跟上数据的到达速度时发生。该环形缓冲区太小,无法实现RED。

–vk5tu
16年5月17日在12:32

@ vk5tu,您错过了我的观点,即流量始终在下降,无论是入口还是出口。如果系统的任何部分无法处理流量,则某些部分将被丢弃,而某些部分则被有意丢弃。

–罗恩·莫潘♦
16年5月17日在14:24