我不知道这是问的正确地方。这可能是一个非常愚蠢的问题。我假设某些处理器必须处理数据帧以进行切换/路由。现代处理器的速度只有几GHz。他们如何处理速度比操作快的数据?
我不知道这是问的正确地方。这可能是一个非常愚蠢的问题。我假设某些处理器必须处理数据帧以进行切换/路由。现代处理器的速度只有几GHz。他们如何处理速度比操作快的数据?
Answers:
您完全正确,如果我们必须每位使用一个指令周期,那么10Gbps将无法实现。因此,首先要注意的是,每个CPU指令处理一个字-64位。
即使这样,我们对于性能而言最糟糕的事情是让CPU访问数据包的所有字。因此,重点放在数据包的“零复制”处理上。其中一些技巧在于接口本身:它们具有DMA(“直接内存访问”),因此以太网控制器芯片将数据复制到RAM中;他们计算校验和,以便CPU不必访问数据包中的所有字。其中一些是在数据结构设计中的:我们小心地对齐数据包缓冲区,以便我们可以通过更改页表条目的所有权来移动它们。其中一些只是仔细编程,以确保访问包数据的次数最少,并且最好直到接收应用程序时才访问。
一旦完成所有这些操作,下一个限制就是一次处理一个数据包的开销。因此,在以太网控制器和内核中都有大量的“分段卸载”功能,以便我们处理数据包组。我们甚至延迟从以太网控制器检索数据,以使这些组更大。
最后,我们有特殊情况的快捷方式,例如内核的sendfile()调用,它是使用最少的工作量从磁盘到网络的明确路径。
我们甚至可以使用网络接口卡的硬件功能进行特殊情况的路由(将数据包从一个接口转发到另一个接口),并将PCI总线视为卡之间的总线,而不用占用CPU。在通用操作系统中无法做到这一点,但是像Intel这样的供应商提供了可在其以太网控制器上实现此类功能的软件库。
完全脱离CPU,我们甚至可以构建专用路由器,其中所有转发任务都在硬件中进行。由于PCI总线将成为限制,因此它们需要运行多个并行总线。甚至多个并行总线连接到多个并行纵横开关组件。在市场的一端,一个基于TCAM的小型以太网交换机就是一个例子。在市场的另一端,瞻博网络M40将是一种规范的设计。
典型的交换机将开始接收数据包,在TCAM中查找目标地址,将带有出口端口的标签附加到数据包,然后将仍然进入的数据包DMA到出口端口的控制器。注意,如果输出端口拥塞,那么在此简单的交换机上可以完成的所有操作就是丢弃入口数据包。因此,当链接改变速度并需要排队时,简单的开关并不是一个好的选择。当然,存在更复杂的开关,为此您需要支付更多费用。
典型的路由器将接收一个数据包,并将其保留在较短的队列中。将在静态RAM中查找目标IP地址,然后将数据包分解为多个单元以减少延迟,并且每个单元都将发送到交叉开关到出口卡。该卡会将信元重新组装成一个数据包,并将该数据包从出口接口排队。出口接口上的队列可能很复杂。
如今,几乎所有交换和大部分路由都由硬件处理,因此处理器速度在异常情况下发挥了作用。对于服务器之类的事物,处理器可能不够快。过去就是这种情况。当1 Gbps以太网首次出现时,用于PC和服务器的总线只能处理400 Mbps。
当处理器的速度不够快时,会发生流量丢失的情况。无论如何,可能会丢弃大量流量,因为如果处理正确,这就是处理拥塞的方式。RED(随机早期检测)是一种用于随机丢弃队列中的数据包以防止其填充和丢弃数据包的方法。这可以帮助防止TCP同步。在交换机上会发生很多丢弃,其中某个速度的多个端口可能需要发送到相同速度的另一个端口。
the packet will then be exploded into cells to reduce latency
吗?