Jerry's Blog

Recording what I learned everyday

View on GitHub


27 January 2020

Network(2) -- 路由器里面有什么?

by Jerry Zhang

一般的路由器架构分为四个部分:

路由器的输入端口、输出端口、以及转换结构几乎都是用硬件实现的。

控制层面的功能,比如执行路由协议,响应向上向下走的连接,与远程控制器沟通,执行管理功能……这些操作都是毫秒甚至秒级别的。这些控制层面的功能一般是用软件实现并在路由器的CPU中执行的。

输入端口处理和基于目的地的转发

转发表被从路由处理器复制到线卡(line cards)。在每一个线卡都有这样一个拷贝,就可以在本地做出转发的决策,在每一个输入端口,而不需要去调用中心化的路由处理器,从而避免了中心化处理的瓶颈。

下面来思考最简单的情况,即只根据目标地址来确定输出端口。在32位的寻址系统中,转发表的一种暴力求解的实现方法就是每个目标地址都占一行。因此有超过40亿可能的地址,所以这个选择肯定行不通。

这个问题怎么解决呢?现在我们假设路由器有四个连接,编号从0到3。

只需要通过地址的前缀来判断即可:

prefix
11001000 00010111 00010         0
11001000 00010111 00011000      1
11001000 00010111 00011         2
otherwise                       3

如果一个地址能匹配上多个前缀,遵循“最长前缀匹配法则”, longest prefix matching rule。因为搜索对时间的要求非常高,所以不仅需要使用硬件进行线性搜索,还需要有特殊的搜索算法。内存访问的时间也需要特别注意,需要设计嵌入在芯片内的DRAM和更快的SRAM。

一旦通过搜索确定了输出端口,数据包就可以被发送到switching fabric了。在一些设计中,如果其他输入端口的包正在使用switching fabric,则数据包会被阻塞,从而形成队列等待。除了搜索外,还有其他一些重要的行动:(1)物理的和链路层的处理一定要做;(2)数据包的版本号,checksum, time-to-live存活时间,都需要检查或者覆写;(3)用于网络管理的计数器也需要被更新。

在很多网络设备中都采取了这种“匹配 + 行动”的模式,不止是路由器。

交换结构 Switching

正是通过switching fabric, 数据包才能从一个输入端口交换(转发)到一个输出端口。

通过内存交换

就像传统计算机CPU直接控制输入和输出端口之间的交换。当输入端口有一个包到达时,先通过中断的方式告诉路由处理器。然后数据包就从输入端口被复制到处理器内存。然后路由处理器从头部信息中抽取目标地址,去转发表查找合适的输出端口,最后把数据包复制到输出端口的缓存里。在此情景下,如果内存最大的带宽是B个包/秒可以被读/写,那整体的吞吐量就一定会小于B/2。

一些现代的路由器还是通过内存交换的。与早期的路由器主要的不同点是,目标地址的查找以及把包存到合适的内存位置这些操作,是通过输入线卡line cards完成的。

通过总线交换

输入端口直接把包通过总线发送到输出端口,没有路由处理器的干涉。让输入端口首先给数据包贴上标签(头部)标明发送到哪个输出端口,然后就发送给总线。所有的输出端口都能接收到这个包,但只有匹配标签的才留下数据包。然后输出端口把标签移除。如果有多个包同时到达路由器,那只有一个能通过总线,其他的都要等着。

通过interconnection网络交换

纵横交叉的2N条总线,连接了N个输入端口和N个输出端口。switch fabric可以控制交叉点的开关。这种方法能够同时转发多个包。在输出端口不会阻塞,只要没有其他的包也被转发到同一个输出端口。然而,如果两个包,从不同的输入端口,指向同一个输出端口,那么其中一个必须在输入端口等着

tags: Network