先看下面文章:
TCP 时间戳妙用
用时间戳优化 TCP 实践
文中的“算法”太简陋以至于不能称之为算法,所以我加了引号。
但态度是鲜明的。
新注入一个信息,拥塞判断肯定会更精确,这绝对毋庸置疑。质疑者不是在怼我,而是怼克劳德香农。
我已可排除 ACK 半程抖动影响,现在只考虑 Data 半程。观察 T = ACK.tsvar - ACK.tsecr 的方差 Var。
几乎可以肯定,当下面的条件满足时,一定是随机丢包而不是发生了拥塞:
V a r < δ 且 T e n d − T s t a r t < α 且 ( T m i d − T s t a r t ) − ( T e n d − T m i d ) < β Var < \delta 且 T_{end}-T_{start} < \alpha 且 (T_{mid}-T_{start}) -(T_{end}-T_{mid} )<\beta Var<δ且Tend−Tstart<α且(Tmid−Tstart)−(Tend−Tmid)<β
其中 T m i d T_{mid} Tmid随机间隔采样即可。我这只是一个例子而已,不算数。
时间戳差值的抖动要比绝对值更重要,也更真实。现网环境是不可能出现等差数列延时的,若差值抖动持续为0,几乎一定是没有发生拥塞。
虽无法精确识别真拥塞,但却可排除假拥塞,辅助此手段,当 CUBIC 检测到丢包时,假拥塞便不必降窗了。
AQM 很复杂,不能观察排队时间单调递增而判定发生了拥塞,但可训练下面的数据:
int main(int argc, char **argv)
{
static int iter = 0;
int loop = atoi(argv[1]), i;
static unsigned long d1_var = 0;
static unsigned long d1_last = 0;
long delta1 = 0;
int a = rand() % 10;
for (i = 0; i < loop; i += a) {
a = rand() % 10;
if (d1_last == 0)
d1_last = i;
if (i > d1_last)
delta1 = i - d1_last;
else
delta1 = d1_last - i;
d1_last = i;
d1_var = (d1_var*1000*4/10 + delta1*1000*6/10)/1000;
printf("%d %d delta:%d\n", d1_var, i, delta1);
}
}
…
我的意思不是说这是个算法或者这个算法多厉害,我的意思是,这可以辅助 CUBIC 更加精确判定拥塞,从而影响决策。
有个现象,周三下午三点找人,不回应,周六那人回复“不好意思,周三到周五一直忙,现在空了,请问什么事”…我 X ,你空了,我休假耶… 导数的导数,方差的方差,经理的皮鞋,经理的牵挂。
浙江温州皮鞋湿,下雨进水不会胖。