共437 次浏览

排头阻塞

前段时间在学习SCTP协议的时候提到了,SCTP协议可以很好的解决排头阻塞的问题。至于什么是排头阻塞以及排头阻塞的模型是什么,原以为会比较深奥难以理解,但是今天晚上仔细查阅了一下资料,发现并不复杂。接下来用我的理解来描述一下


排头阻塞是在缓存式交换的情境下出现的。这类的情景一般由缓存式输入端口,交换过程和缓存式输出端口这三部分来组成的。

由于缓存式输入端口遵循的是FIFO,也就是先进先出原则的队列。所以后面的数据包要等到前面的数据包经过交换过程传递到输出后才能发送。但是一旦排在第一位的包想要到达的输出端口正在忙碌,它就无法顺利的经过交换过程被送出去,于是就堵住了后面数据包的发送。即使后面数据包要到达的端口处于空闲状态,他也无法被发送出去。这就造成了排头阻塞,排在第一个位置的数据包堵住了后面所有的数据包。

我们用一张图来感受一下(抽象派作图)

上图用抽象的方式展现了排头阻塞的一种情况。a、b、c、d是缓存式输入,遵循FIFO规则,1、2、3、4是缓存式输出,也遵循FIFO规则。如果a和d的排头数据包同时都需要向输出端口2发送,但是同一个周期内只能有一个输入端口的数据包能够被送达到2端口,假设是a的排头数据包被送达到了2端口。那么d的队列就会造成排头阻塞,因为d队列的排头数据包没有被顺利送出,从而要等待下一个时钟周期。即使d队列后面的数据包有需要送往1,3,4这些空闲端口的。但是由于d队列排头的数据包没有被送出,从而都被堵在了d队列中。


排头阻塞在输入和输出端口数量不多时,造成的影响并不明显。但是一旦输入输出端口变得特别多,那这个影响效果就会被放大。甚至在查阅资料学习的时候发现,当满足一定条件的时候,排头阻塞会使得输入端口到输出端口的发送效率削减50%左右。


至于为什么SCTP协议可以避免排头阻塞情况的存在,我的理解是。由于SCTP支持多个串流进行传输,当有多个FIFO的输入端口都有需要发送的SCTP数据包时,他们不用去挤一个输出端口,拥挤到一个串流进行传输。而是有多个输出端口对应的串流可以去选择。这样就很大程度上避免了我们上文图片中存在的情况,就不用多个输入端口挤同一个输出端口去发送数据包的情况。从而避免了排头阻塞情况的存在。提高了传输效率。


其实关于如何解决排头阻塞,自然还有另一种办法。那就是在每个输入端口中,建立虚拟的队列,把每个输入端口中的包按照需要发送的输出端口分好类。就以我们上文中图片举例子,a输入端口中会创建很多虚拟队列,分别对应1,2,3,4这四个输出端口。把所有塞入a输入端口的数据包分类,要送往1的塞入对应1输出端口的虚拟队列,要送往2的塞入对应2输出端口的虚拟队列。这样对应1输出端口的虚拟队列只会向1端口发送数据包。即使1端口因为繁忙,没用送过去造成了堵塞,也不会影响对应2输出端口的虚拟队列数据包的发送。这些虚拟队列之间互不影响,以前排头数据包要发往1输出端口,堵住了,也把后面发往2端口数据包堵塞。现在发往1端口的数据包堵住了,只会影响这个虚拟队列中同样也发往1端口的数据包,对于另一个发往2端口的虚拟队列没有影响。不只是a输入端口有对应1,2,3,4输出端口的虚拟队列,在b,c,d输入端口也有,工作方式也相同。

这种虚拟队列的解决方案被用在一些中小型的交换机上面~

 

 

 

此条目发表在学习总结分类目录,贴了, , 标签。将固定链接加入收藏夹。