wordpress 分类 别名,如何优化网站关键词,努力把网站建设成为,网站打不开 清理缓存后可以打开接着 TCP 的文化内涵 继续扯一会儿。
自 30 instruction TCP receive 往前追溯#xff0c;论文 Jacobson88 源自第一次拥塞崩溃#xff0c;这篇著名文档在同时期的另一个缘起是另一篇考古文献 [Zhang86] Why TCP Timers Don’t Work Well#xff0c;后面这篇文献提出了 TCP…接着 TCP 的文化内涵 继续扯一会儿。
自 30 instruction TCP receive 往前追溯论文 Jacobson88 源自第一次拥塞崩溃这篇著名文档在同时期的另一个缘起是另一篇考古文献 [Zhang86] Why TCP Timers Don’t Work Well后面这篇文献提出了 TCP RTO 的缺陷指出
RTO 是兜底不要依赖改进 RTO 来优化性能本质上 RTT 是测不准的过大过小的 RTO 要么造成连接近乎中断要么加剧拥塞当性能太差时就近乎故障了虽然 RTO 计算有固有缺陷但还是需要 “更好的” RTO 计算方法比如启发式。
VJ 创造了很多技巧这些技巧携带了很多神秘的 magic number现在看来这些技巧被认为理所当然到微不足道早已没人过问理由(一句 “调一手好参数”)但在 1988 年却是精彩且轰动的它决定了后续至今的 TCP 演化风格。在 VJ 看来这些 magic number 都是有理由的这些理由多数来自 VJ-Style概括讲VJ-Style 即对指令的节约。
看 VJ 如何改进 RTO 计算。VJ 简单将 rtt 的移动指数平均换了一种写法(以下按照原始论文的写法) a ( 1 − g ) ⋅ a g ⋅ m a(1-g)\cdot ag\cdot m a(1−g)⋅ag⋅m a a g ⋅ ( m − a ) aag\cdot (m-a) aag⋅(m−a)
后面的形式直接就有了 “物理意义”(m - a) 即误差这个迭代过程展示的是一个校准过程rtt 不断收敛到正确的值。
由此 (m - a) 作为一个 “误差” 整体直接参与描述 “方差”。VJ-Style 体现在他没有使用真正的方差 Σ ∣ m − a ∣ 2 \Sigma|m-a|^2 Σ∣m−a∣2理由是它包含乘法乘方运算存在整数溢出的风险 “不太容易计算” 一直是 VJ 的动力VJ-Style 偏爱简单的整数加减和移位运算。
VJ 采用 m d e v 2 ( Σ ∣ m − a ∣ ) 2 ≥ Σ ∣ m − a ∣ 2 s d e v 2 mdev^2(\Sigma|m-a|)^2\ge\Sigma|m-a|^2sdev^2 mdev2(Σ∣m−a∣)2≥Σ∣m−a∣2sdev2 作为替换他证明了 mdev 和 sdev 之间存在简单关系从而确认 mdev 作为 “误差” 的直接表示恰好是 sdev 一个很好的近似。
接下来表示 mdev 均值的方法与表示 rtt 的方法相同然后用这个 “误差” 来修正 rtt 本身 E r r m − a Errm-a Errm−a a a g ⋅ E r r aag\cdot Err aag⋅Err v v g ⋅ ( ∣ E r r ∣ − v ) vvg\cdot (|Err|-v) vvg⋅(∣Err∣−v)
很精彩对 srtt 移动指数平均的简单变形直接导出了这个闭环。精彩还在继续。
为了 “快速计算”消除 1 的 g 的方式是缩放用 g 1 2 n g\dfrac{1}{2^n} g2n1 进行缩放可以利用简单的移位运算 2 n ⋅ a 2 n ⋅ a E r r 2^n\cdot a2^n\cdot aErr 2n⋅a2n⋅aErr 2 n ⋅ v 2 n ⋅ v ( ∣ E r r ∣ − v ) 2^n \cdot v2^n \cdot v(|Err|-v) 2n⋅v2n⋅v(∣Err∣−v)
剩下的事只是选择 n而 n 3 时效果最接近 RFC793 的建议由此VJ 完成了对 rtt 计算的一次优化下面的代码直到现在还在被各种 TCP 实现几乎照抄
/* 更新平均估计 */
m - (sa 3);
sa m;
/* 更新偏差估计 */
if (m 0)m -m;
m - (sv 3);
sv m;Linux 内核的 tcp_rtt_estimator 也在采用。
剩下的计算 RTO 自然水到渠成它由 rtt 加上 “误差” 的一定增益组成 R T O a 4 ⋅ v RTOa4\cdot v RTOa4⋅v
这里的 4 来自现实数据统计律因为它不太小足够大。仍然是为了便于计算v 的 g 采用了 1/4 2 3 ⋅ a 2 3 ⋅ a E r r 2^3\cdot a2^3\cdot aErr 23⋅a23⋅aErr 2 2 ⋅ v 2 2 ⋅ v ( ∣ E r r ∣ − v ) 2^2 \cdot v2^2 \cdot v(|Err|-v) 22⋅v22⋅v(∣Err∣−v)
m - (sa 3);
sa m;
if (m 0)m -m;
m - (sv 2);
sv m;
rto (sa 3) sv;这完美解决了 Lixia Zhang 在 Zhang86 提出的问题至今工作良好。
RTO 的魔数 4 还来自 VJ 慢启动的理论分析。如果在慢启动轮次结束时计算的重传超时小于等于下一轮的实际 rtt就会发生虚假重传。最坏情况下假设所有延迟都由窗口大小的数据排队引发延迟将每轮翻倍(因为窗口大小翻倍)因此 R i 1 2 ⋅ R i R_{i1}2\cdot R_i Ri12⋅Ri而 V i R i − R i − 1 R i 2 V_iR_i-R_{i-1}\dfrac{R_i}{2} ViRi−Ri−12Ri所以 R T O i R i R i 4 V i 3 R i 2 R i R i 1 RTO_iR_iR_i4V_i3R_i2R_iR_{i1} RTOiRiRi4Vi3Ri2RiRi1因此虚假重传将不会发生好精彩
AIMD 的 Additive Increase 过程每个 ACK 导致 w 增加 1 / w这导致了除法运算不仅如此VJ 建议不要发送 MTU 分数倍的数据包因为这会降低载荷率二力合一VJ-Style 的 AIMD 采用计数方式简单避免了除法运算
snd_cwnd_cnt ;
if (snd_cwnd_cnt cwnd)cwnd ;先写到这其余的参考 RFC1072 后面再说。
浙江温州皮鞋湿下雨进水不会胖。