上面的总短实际上是 25kb/秒,但我不会将连接分成组,而是按速度排序并循环遍历它们。从总带宽开始,将新带宽设置为(剩余带宽/剩余计数)。这将保持 5k 和 10k 连接的限制,以防它们加速。您可以超出分配的带宽,但您会更正它。
List<Connection> connections = GetConnections();
connections.Sort(); // sorts by Speed
bandwidth = 100000;
for (int i = 0; i < connections.Count; i++)
{
Connection cnn = connections[i];
cnn.SpeedLimit = bandwidth / (connections.Count - i);
bandwidth -= Math.Min(cnn.Speed, cnn.SpeedLimit);
}
(start with all connections SpeedLimit set to 20000 bytes/sec)
Speed bandwidth SpeedLimit
5000 100000 20000
10000 95000 23750
20000 85000 28333
20000 65000 32500
20000 45000 45000
连接的总速度限制为 149583,因此如果慢速连接速度加快,您可以超过限制,但如果您每秒调整限制,它应该非常接近。
连接速度更改为:5000、10000、28333、21000、45000,所以我们实际下载了 109,333 字节,但我们会再次调整。除 45k 外的所有连接都已达到其可能的限制:
Speed bandwidth SpeedLimit
5000 100000 20000
10000 95000 23750
21000 85000 28333
28333 64000 32000
45000 35667 35667
新的速度将是 5000、10000、21000、28333、35667、100k
Speed bandwidth SpeedLimit
5000 100000 20000
10000 95000 23750
21000 85000 28333
28333 64000 32000
35667 35667 35667
现在让我们假设 5k 连接速度高达 20k:
Speed bandwidth SpeedLimit
10000 100000 20000
20000 90000 22500
21000 70000 23333
28333 49000 24500
35667 20667 20667