以太网设备收到报文时,先保存到缓冲区,然后再转发出去。以太网设备就像个货物中转站,报文就像打包的货物。

货物中转站是怎么工作的呢?假设中转站有4个门,每个门都可以作为入口和出口,所有门的进货和出货的速度相同。中转站的中间是个公共的囤货区,转不出去的货物可以暂时存放在囤货区。公共囤货区被占满之后,再有货物进来就会被丢弃。


基本的存储转发

首先,看下最简单的情况。从A门进入的货物要从B门出去,同时C门进入的货物需要从D门出去。


170537457.png


货物从A门进入,很快被转往B门;C门进入的货物也会很快从D门转发出去。这种情况下,公共囤货区不会囤积货物。

以太网转发最简单的情况,就是这样。


缓冲区的作用

现在,A门和B门同时全速进货,这些货物都要从C门转出去。


170501708.png


C门出货速度不够快,A和B门进入的货物无法完全转出去,部分货物就会暂存在公共囤货区。如果A门和B门一直全速进货,公共囤货区很快就不够用了。幸运的是,A口和B口并非总是全速进货,多数情况下囤货区不会被占满,C口可以有条不紊地把堆积的货物逐渐转发出去。

以太网的缓冲区和货物中转站的囤货区的功能类似,可以对以太网帧进行缓冲。缓冲区越大,缓冲能力越强。但是,更大的缓冲区意味着更高的成本,因此通常会在转发效果和缓冲区大小之间做出权衡,取一个相对合理的缓冲区大小。


端口缓冲区

现在,看下更为复杂的情况。A门和B门同时往C门全速发货,D门收到的货物则要转往B门。


170650182.png


A门和B门同时全速进货,公共囤货区就已经不够用了,现在D门也在进货,公共缓冲区显然不够用。其实,稍作分析不难发现B门并不忙,完全可以转发从D门进入的货物,现在囤货区空间不足成了货物中转的瓶颈。


货物中转站的管理员想了个办法,在每个门的门口又开辟了一个囤货区,只能暂存发往这个门的货物。货物优先在门口的囤货区暂存,门口的囤货区不够用了才占用公共的囤货区。这样,从D门进入的货物就可以顺利地从B门转出去了。


170813568.png


由于门口的囤货区占用了部分空间,公共囤货区的空间就缩小了。相对于中转效率的提升而言,这样的调整是值得的。以太网交换机的buffer空间的分配,也采用了类似的机制。


出端口队列

某些情况下,有些货物需要加急转发,这意味着管理员要对货物进行分级。根据货物的不同特征,管理员把所有的货物分成8个级别,各级别的货物在出口处排成8队进行发送,管理员会考虑优先发送级别较高的货物。

如果级别较高的货物总是优先发送,而且级别高的货物源源不断,那么级别较低的货物就可能一直没有被转发的机会。为了解决这个问题,管理员对转发的方式做了调整,级别高的货物多发送,级别低的货物少发送。这样,级别低的货物也有机会被转发出去。

这就是以太网设备出端口队列的基本原理。出端口上,如何协调不同优先级的报文的发送,是一个“队列调度”问题。


流控

在“端口缓冲区”那一节,提过到A门和B门一直全速往C门发货的情况,囤货区的空间永远满足不了需求。

现在,中转站的管理员想了一个办法来解决这个问题。所有的货物先在入口进行登记,转发出去之后再注销对应的记录,这样管理员就进一步了解了货物的中转情况。如果从一个门口进入的货物囤积得太多了,管理员就告诉入口的送货人先停止送货一段时间。停止一段时间之后,如果囤积的货物还是太多,管理员会告诉送货人再停一段时间。直到该入口进入的货物的囤积量降低到一定水平,送货人才能继续送货。

这种方法就是以太网流控的基本原理。以太网端口通过向外发送PAUSE帧来告诉对端暂停发送报文,PAUSE帧的目的MAC地址是0180-C200-0001。需要注意的是,如果对端没有使能流控,则不理会PAUSE帧,继续发送报文。这样,本地端口进入的报文会越积越多,随后开始丢弃报文。

对于半双工链路而言,情况并非如此。半双工模式下,本地发送的PAUSE帧和对端发过来的报文可能发生冲突,对端就看不到PAUSE帧,流控机制也就不能工作了。

此处,我们使用了“流控”这个术语,因为这个术语大家比较熟悉。确切来讲,流控只是全双工模式下的Ingress Backpressure(IBP),半双工模式采用不同的机制。半双工模式下,本地端口会向外发送Jamming信号。

这里所说的流控,是基于端口的。一旦流控机制生效,整个端口的流量都会中断一小段时间。基于优先级的流控可以按报文的优先级触发流控机制,这样只有特定优先级的流量受影响,其他流量可以正常转发。


线头阻塞的预防

“线头阻塞”这个词似乎和以太网不太相关,这个词的英文是“Head-Of-Line Blocking”,简称为“HOL Blocking”。


为了简化问题的描述,下面使用较为简单的示意图。中转站的B门全速进货,货物要从C门转发出去;同时A门也在全速进货,一半儿发往C门,另一半儿发往D门。


170952406.png


C门的出货速度小于A门和B门的进货速度之和,C门很快就会拥塞,囤货区很快被占满。这时,在A门外面,货物还在排队等待进入中转站,但是发往C门和D门的货物都无法进入。这种情况就像在单车道的道路上,有车辆需要向右转,但是该车的前面有其他车辆在等待直行。这种情况就是“线头阻塞”。

这种情况如何解决呢?管理员又想到了解决办法,即在出口处对货物进行计数。如果某个出口处的货物囤积太多,那么管理员就通知所有入口进入HOL blocking prevention状态,随后入口收到发往那个出口的货物就自动丢弃。这样,入口处的其他货物就有机会进入中转站了。当出口处的货物囤积降到一定水平之后,出口再通知入口解除“HOL blocking prevention”状态。

以上就是“线头阻塞的预防”的工作机制。


报文的缓存时间

前面分析以太网的存储转发,忽略了一个问题——报文在缓冲区中究竟可以缓存多长时间?正常情况下,报文转发引入的时延很短,微秒级的时延已经不算短了。报文在缓冲区里缓存的时间可以长很多,可以达到秒级。问题是,缓存时间太长的话,报文就失去了意义。在语音和视频业务上,对时延要求比较高,这一点表现尤其明显。从另一个角度讲,长时间缓存报文也会占用宝贵的buffer空间,影响其他业务。