这篇文章给出了对于TCP Pacing技术的详细评测分析结果。
对于pacing想要解决的问题和实际效果给出了详细的实验数据分析,是理解pacing
技术的一篇很好的入门文章。
1. What is Pacing ?
TCP的数据发送目前有三种策略:
a. ACK-Clocking: 这是Linux TCP/IP协议栈现有的实现策略。每一个数据包的发送
都是由收到的确认包触发的。当数据确认包ACK由于网络拥塞无法及时达到发送端时,
发送方是不会发送数据的,除非timeout。总的来说就是,ack控制数据发送的时机,
min(cwnd, rwnd)控制发送数据的多少。
b. Rate-based: pure的rate-based的方法使用一个估计的瓶颈链路带宽rate来控制
数据发送的多少和时机。
c. Pacing: pacing算是以上两种方法的一个hybrid。pure的rate-based的方法最大的
缺点就是可能造成瓶颈链路的over-subscribed,而不能及时的发现。而在Pacing方法
中,发送数据量的多少还是由min(cwnd, rwnd)控制,而数据的发送时机则由timer控制。
timer控制的目的就是保证在一个RTT内,数据是比较平滑的发送出去的。
why needs pacing ?
Pacing的提出主要是为了解决传统协议栈中存在的bursty transmission的情况。
文章总结的TCP中可能产生burst的情况有:
a. Slow Start:慢启动阶段cwnd的增长是指数级的
b. Losses: 当rwnd用完后,在丢包发生时无法发送新数据,重传结束后会引发burst。
Note: 这种burst可以用opportunistic retransmission 解决 :)
c. ACK Compression: 当存在双向的数据流时,ACK包可能会在瓶颈链路中排队,破坏ack-clocking机制。
d. Multiplexing: 当多条流共享一个高速瓶颈链路时,尽管同一条流数据包可能到达瓶颈链路的时间不同(细小的维持ack-clocking的gap),但当数据包经历在瓶颈链路排队后,维持ack-clocking的gap被完全的破坏了。最终导致的结果就是数据包的发送都是突发性的。
Results
Pacing的实现:
Timeouts are scheduled at regular intervals of duration RTT/window.
A packet is transmitted from the window whenever the timer fires.
单条流的情况:
a. 当瓶颈链路buffer小于BDP时,reno会更早的遭遇丢包,因此pacing在throughput方面表现更好
b. 当瓶颈链路buffer超过BDP时,pacing的throughput更差,这主要是由于pacing会delay congestion signal
多条流的情况:
a. 在initial period,reno反而性能更好。主要是pacing流几乎同时丢包造成的性能下降,即synchronization effect现象。
synchronization effect:pacing流由于将数据包打散,当瓶颈链路buffer溢出时,
许多pacing流都会产生丢包,进而许多pacing流都会下降cwnd。
而reno由于数据包相对是以burst的形式发送的,要么有一条流丢很多包,
要么可能某些流一个包都不丢。
b. 在steady state,pacing反而性能更好。主要是de-synchronization effect现象导致的。
de-synchronization effect:在稳定状态,Reno每个RTT会将cwnd加1。
在buffer用满后,每个Reno流多发的这个数据包(burst最后一个包)很大概率就会drop。
而pacing由于将数据包打散了,丢包的发生有一定的随机性。对于单条pacing流而言就可能没有包被drop
参考资料
Understanding the Performance of TCP Pacing, INFOCOM’2000