我们要实现网络互连,需要一个设备,这个设备可以实现将数据从一个端口转发到另外一个端口,从而实现信息的交换,这个设备就是路由器。
知道了路由器的功能需求,我们就要设计对应的结构来满足这样的需求从而实现相应的功能。
我们已经知道了路由器最核心的功能是交换,也就是N输入如何交换到N输出的问题,我们用下面这个图来表示:
我们现在的任务就是如何设计中间的交换单元的结构来实现成本较低的同时实现较高的交换效率,换句话说如何走线将输入和输出进行连接。
首先我们从最朴素的思想出发,最简单的思维就是将输入和输出一对一连接起来,如下图所示:
这种连接方式虽然连接效率高,但是由于走线的根数太多了,因此成本较高。
与之相对的另一种极端就是只需要一根总线,将所有的输入和输出都接到这根总线上,如下图所示:
这种走线方式虽然成本由N根线减少为了一根线,但是吞吐量大大降低。
因此我们要追求一种简单高效的设计方法,力求做到吞吐量和成本之间的tradeoff。
为此聪明的工程师们通过不断地trail and error,终于找到了如下网格式布局解决了布线问题。
通过观察这样的网络可知,对于N个输入和N个输出而言,对应的线的数目为2N,对应的节点数目为N²。这种布局方式称为cross bar,名如其形,交错的条条。
而在实际的元器件设计中如何实现节点的设计也是要兼顾易实现性和成本,我们对于电信号而言,需要使用电路器件实现节点的控制作用,我们最先想到的是开关,但是开关的话体积较大而且不易于控制,因此我们寻求性能更加优秀的器件,于是我们想到了数电设计中的与门。
我们知道与门是同1则1,其余为0,因此通过在节点处放置与门就可实现对于输入信号的选择和控制。
但是随着我们对于传输数据的体量和速度的要求,电信号作为载体传输信息已经不能满足要求,然后光纤通信应运而生,顾名思义光纤通信的载体为光信号,光信号的传输数据量和带宽速度均优于电信号,而且几乎没有衰减。
那么我们上述的cross bar的模型能否在光信号的传输中应用呢?答案是当然可以,因为我们只是载体不一样,但是目标和结构都是一致的,因此模型是可以套用的,但是到了具体设计层面就要有些差异,很自然的想到,在电信号的视角下我们采用与门来实现节点的功能,那么在光信号的视角下我们采用什么呢?
类比与门的功能,试想一下什么东西可以使光信号实现变向,如果大家小时候够淘气,一定有过这样的经历,在一个阳光明媚的午后拿一面镜子在屋内阳光穿过的地方反射太阳光,所以嘛最简单的就是镜子!而通过控制镜子的不同的偏转角度可以实现控制光信号是通过还是偏转90度,但是镜子存在在比如震动的或者其他情况下偏转角度会发生变换,这样会对光信号的传输造成影响,因此我们寻求一种更加稳定优质的材料。
这个时候们物理学家们研究了一种很好的环形结构,这种结构可以实现选择性的让光信号通过还是反射,相对于镜子的结构更加稳定,于是我们通过在节点处放置微环就可以实现对于光信号的控制。
即使环状结构解决了我们光信号传输的问题,但是工程师们永远追求着性能和成本的极致,N²个节点,可不可以不用N²个环?经过不断地优化尝试提出了更少的环结构,但是利用环来控制存在着不同的输入到输出过程中线路重叠的情况,这就代表着传输冲突。这种思想可能只能适应于特定的领域,从广泛应用的角度减少环的同时还是存在着一定的传输错误的风险。
至此我们已经搞定了路由器的交换单元部分,接下来就要设计输入单元和输出单元。
对于输入和输出而言,在正式发送数据之前,输出端首先向输出端发送一个“我要向你发送数据了你可以接受吗?”的请求,如果输出端空闲则向输入端返回一个确认,输入端接受了这个确认之后才正式开始发送数据。
而如果输出端正忙,则此时输入端不能向输出端发送数据,这时已经到输入段的输入端就要先在输入端的缓存等一下,那么面对如此多的缓存数据,如何设计输入端的缓存才能使数据发送最可靠高效?
我们首先最朴素的思想就是一个输入支路对应的就是一条主路呗,但是我们试想生活中交通驾驶的例子,在一个T型路口有直行和右转两个方向,此时想要直行的车位于红灯前,其后是想要右转的车,这时因为处于同一车道,后车必须要等前车直行之后才可以右转。
类比到我们输入缓存的结构,红灯代表输出端正忙,输入数据需要进行排队等待,如果所有的数据都处于一个通道中就会出现我目前排在最前面的分组A想要到达的输出端口是1,因为1忙所以输入等待,但是这个分组A就阻塞了后边的分组传输,如果A后边的分组B想要到达的是输出端口2,而恰好此时输出端口2是空闲,如果没有A分组的阻塞B分组本可以转发的,这样就大大降低了效率。
如果解决呢?我们再从T型路口的例子,如何避免前车堵了我,提前变道呗!对于输入缓存而言,我们解决的办法就是有N个输出端口则在一路输入中设置N个通道,这样数据进来通过路由计算知道要达到的端口号之后,就在对应的通道对号入列,这样一个通道内都是想去同一个输出端口的分组,大家一荣俱荣一损俱损,不存在谁耽误谁的情况。
而对于缓存是放在输入端还是输出端呢?两种形式都可以。放在输出端的情况下,对于k路输入,如果每一路的输入速率为v pk/s,那么交换单元的处理速率就要到达kv pk/s,那么每一路输出端缓存的处理速率就要对应的是kv pk/s。这就对缓存的容量与处理速率提出了较高的要求。而如果对于输入端缓存,则对于其的要求只是v pk/s。
这样的话,一个简单的路由器就做好了,主要的结构如下所示: