如何使用TC和NETEM模拟没有数据包重新排序的抖动?

时间:2016-05-03 01:54:31

标签: linux networking delay jitter

显然,NETEM使用tfifo,它根据发送的时间对数据包进行排队。这会导致抖动导致数据包重新排序。例如,以下行将导致数据包重新排序*:

template <class T>
class Other{
public:
   T foo(){
      T a;
      return a;
   }
};

//Later
Other<A> other;
other.foo();  //This must compile

NETEM manual建议如果你不想重新排序,那么用纯数据包fifo(pfifo)替换内部队列规则tfifo,并给出以下示例,在不重新排序的情况下添加大量抖动:

tc qdisc add dev eth0 root handle 1: netem delay 10ms 100ms

但它不起作用!数据包仍然会被重新排序! (根据this看起来它依赖于内核)

那么,有没有人知道如何在不重新排序数据包的情况下添加抖动?

2 个答案:

答案 0 :(得分:0)

一个hacky选项是使用恒定延迟(无抖动)并有一个循环并改变循环中的延迟值。

假设您希望延迟50ms,方差为5ms。您首先添加基本延迟:

tc qdisc add dev eth0 root handle 1: netem delay 50ms

并且可以有一个循环,在45ms和55ms之间选择一个随机延迟并改变延迟如下:

tc qdisc change dev eth0 root handle 1: netem delay 53ms

但有两点需要注意:

1-更改延迟需要一些时间。我发现在循环中睡眠0.1秒是合理的。所以这意味着你受到抖动频率的限制。

2-减少延迟时,新数据包排队的延迟时间(即发送时间较早)比队列中已有的数据包排队,这可能导致重新排序!如果降低幅度很大,您可以通过减少几步的延迟来缓解这种情况。

答案 1 :(得分:0)

在我的情况下(Linux 4.17),如果方差>均值,我也会遇到同样的问题。通过设置方差<均值,ofo不再发生。当然,您仍然需要使用pfifo qdisc:

tc qdisc add dev ethBr2   root handle 1:0    netem delay 50ms 40ms 25%
tc qdisc add dev ethBr2   parent 1:1         pfifo limit 1000