TCP 时间戳妙用

海哥  金牌会员 | 2022-6-25 15:50:59 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 537|帖子 537|积分 1611

盗图说个场景:
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 实现里还没有看到,别的实现我也没看过,不管怎样,想法是非常简单的,就是充分利用信息。我自己并不做这个领域,所以就简单记录下来几句话,哪天再有小长假了,验证一下试试看。
  浙江温州皮鞋湿,下雨进水不会胖。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表