细流与 TCP

许多使用可靠传输协议的基于互联网的服务都表现出我们称之为细流的特性。这意味着应用程序发送数据的速率非常低,以至于传输协议的重传机制没有完全发挥作用。在时间敏感的场景(如在线游戏、控制系统、股票交易等)中,用户体验取决于数据交付延迟,数据包丢失可能会严重影响服务质量。极端延迟是由于 TCP 依赖于来自应用程序的新数据到达来有效地触发快速重传,而不是等待长时间超时导致的。

在分析了大量的时延敏感交互式应用程序后,我们发现它们通常产生细流,并且在整个生命周期中都保持这种流量模式。时间敏感性与使用 TCP 时流引发高延迟的事实结合在一起,这很不幸。

为了减少数据包丢失时的应用层延迟,我们做了一系列机制,解决细流的延迟问题。简而言之,如果内核检测到细流,则重传机制将按以下方式修改:

  1. 如果流是细流,则在第一个 dupACK 上进行快速重传。

  2. 如果流是细流,则不应用指数退避。

这些增强功能仅在检测到流为细流时才应用。这是通过为飞行中的数据包数量定义一个阈值来实现的。如果飞行中的数据包少于 4 个,则无法触发快速重传,并且该流容易出现高重传延迟。

由于这些机制的目标是时间敏感的应用程序,因此必须由应用程序使用 TCP_THIN_LINEAR_TIMEOUTS 和 TCP_THIN_DUPACK IOCTLS 或 tcp_thin_linear_timeouts 和 tcp_thin_dupack sysctls 来专门激活。这两个修改默认都是关闭的。

参考资料

有关修改的更多信息,以及大量实验数据,请访问此处

“提高可靠传输上交互式细流应用程序的延迟” http://simula.no/research/nd/publications/Simula.nd.477/simula_pdf_file