TCP 时间戳妙用

本文讨论了TCP中正反向路径差异导致的拥塞控制问题,通过利用时间戳区分Data和ACK半程抖动,提出了一种简单但有效的方法来优化拥塞控制。作者分享了在LinuxTCP实现中的潜在改进思路,展示了如何利用信息熵提升TCP性能。

盗图说个场景:
TCP in Painful Detail
在这里插入图片描述
这种场景怎么应对?怎么办?

其实我想描述的场景没这么复杂,它只是:

  • 正向 Data 路径与反向 ACK 路径不是同一条路径,反向路径更坎坷。
  • 正反向路径是同一条,但 ACK 路径上的策略配置与 Data 路径不同。

很多转发设备(比如 Wi-Fi )以与 Data 不同的方式对待 ACK,如乱丢 ACK,暂存 ACK 并聚集,ACK 优先排队等。然而 RTT 是包含 ACK 半程的,无论哪个半程发生抖动,TCP 发送端会无差别记账,因为它分不清哪个半程发生了抖动。

蹲了个厕所,想了个办法。借 TCP 时间戳可以区分两个半程的抖动。跟踪两个变量的方差即可:

  • Data 半程时间差:D1 = ACK.TSval - ACK.TSecr。
  • ACK 半程时间差:D2 = Now - ACK.TSval。

不用关心两端连接时间不同步,因为只需关注 D1 和 D2 两个变量随时间的变化情况而无需关注它们的值。

如果 D1_var 很大,说明 Data 半程发生了带宽争抢,buffer 堆积,此时需要收敛一下控制拥塞,反之,如果 D2_var 很大而 D1_var 很小,说明 Data 半程很稳定,没有拥塞,那就继续激进发送吧(但别太狠)。

若没此能力,仅凭 TCP 现有实现,RTT 抖动时,即使是 ACK 半程造成的抖动,也会一并记账到拥塞信号,此 RTT 会对拥塞控制算法施加影响,从而影响发送效率。

通过 TCP 时间戳,可更精细区分两个半程的延时抖动情况,之前说过,更准确的拥塞控制需要更多的信息,归根结底是需要 TCP 数据包更强的表达能力,多数 TCP 支持时间戳这没错,但如何利用这个时间戳,用尽它的信息熵,还是有更多玩法的。

半下午急着拉肚子,顺带了一个 issue,想了一个好办法识别 TCP 两个半程的延时抖动,挺不错的。我不知道这个好办法是不是我的原创,但至少在 Linux TCP 实现里还没有看到,别的实现我也没看过,不管怎样,想法是非常简单的,就是充分利用信息。我自己并不做这个领域,所以就简单记录下来几句话,哪天再有小长假了,验证一下试试看。

浙江温州皮鞋湿,下雨进水不会胖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值