经理:为啥 minrto 要 200 ms 那么大?
工人:你说的是 Linux 吧?
经理:不管什么系统,anyway,whatever,为啥 minrto 那么大,比如 200 ms,100 ms ?
工人:因为要照顾 Delayed ACK,避免不必要超时重传。规范说 Delayed ACK 的 delay 时长大概是 minrto 这个量级,比如 50 ms,100 ms,200 ms。
经理:原来如此,那为啥 minrto 不能每连接配置呢 ?
工人:因为 Delayed ACK 时间不能每连接配置,且 delay 时间对端不知道。
经理:我若确保我的连接在 IDC 内呢,RTT 不可能超过 1 ms 。
工人:Delayed ACK 该 delay 多久还是多久,且接收端不知道发送端在 IDC 内部。
经理:那我强行改 minrto 为 200us 呢 ?
工人:rto 精度为 ms,达不到 us。
经理:我若改了实现,精度达到 us 呢 ?
工人:经理有这个能力吗?
经理:你有就行,现在就改,不然开除你。
工人:我已改好,但仍然不允许你配置每连接 minrto,这个必须全局定死,且必须与 Delayed ACK 量级一致。
经理:这 TMD 为什么?
工人:如果完全照 RTT 算 rto,全世界遵守 Delayed ACK 规范情况下将造成频繁不必要超时重传,造成互联网拥塞!不必要超时重传造成互联网拥塞使所有拥塞控制机制付之东流。
经理:我保证只在 IDC 使用,不堵公网。
工人:有配置就肯定有人用,你兜不住的,人们必然会错误配置,就会堵互联网。不能开这个口子!
经理:还有别的办法吗?
工人:你想咋搞,偷摸的,别声张。
工人:Google 有两个方案,支持 us 时间戳,但不解决根本问题。
经理:那我找工人偷摸搞吧。
工人:经理好运!
附:
draft-wang-tcpm-low-latency-opt-00
draft-yang-tcpm-ets-00
很多 “不能开口子” 的配置,比如 Timewait 时间。全局考虑是必要的,若要保证这个全局,“什么配置是可以随意改的” 就需要严格控制。
拥塞控制要保证一个数据包有且只有一个副本在网络上,因此 “避免不必要重传” 就是要严格制止的,虽然你有权力任意修改 TCP 实现,但原则上你是违规的。因此,标准能带头违规吗?显然不行。
很多私有实现中,MIN_RTO 已经可配置,但这确实不好公开。
浙江温州皮鞋湿,下雨进水不会胖。