NS-3下默认的数据调度算法是Round_Robin算法,但是在Linux的内核中默认的调度算法是最小RTT(Min_RTT),同时在ns-3下默认的子流窗口大小为1,但是在Linux内核中默认的子流窗口数目是10。

ns-3下轮询算法或者说数据包的调度算法流程如下:在子流建立后,子流的默认窗口大小是1,所以轮询算法调度子流时每一次调用都是发送一个窗口大小的数据包,通常这个值得大小等于MSS,这是子流建立后首次发送数据包的情况,然后当子流接收到ACK信息时,根据ACK的信号进行窗口的变化,然后进行数据的调度,每一次调度都是对所有窗口进行一次轮询,发送一个MSS大小的数据包,当有些窗口有空闲时,该窗口并不会一次发送所有窗口大小的数据包,而是每一次发送一个MSS后进入下一个子流进行数据包的发送,每次发送一个MSS,这就相当于是有N个水桶,每个水桶里面的水量不一样,当桶内有水时,每一个桶都取一瓢水,然后一直汲取,直到水桶为空,而不是将其中一个桶的水汲取完后才进行下一个桶的汲取。但是这个会导致两个问题:

1.当一个MPTCP流可以建立多条子流的时候,如果待发送的数据量超过一个MSS,那么会启用至少两条流,因为每一次都给每一条子流调度一个MSS的数据包;

2.当子流之间性能差异很大时,不会选择最好的路径发送数据,如一个MPTCP连接只有2个子流s1与s2,其中s1的RTT为10ms,s2的RTT为100ms,窗口都是10000,发送的总的数据量为10000,那么根据RR算法会选择每一条自流都是发送5000字节的数据(假设每一个包携带的数据为1000),这样就会使得发送时间为百毫秒级别,而如果只是使用s1,那么发送时间为十毫秒级别。