高性能服务框架revolver:RUDP(可靠UDP)算法详解(4)
2015-01-28 14:13 crow! 阅读(587) 评论(0) 编辑 收藏 举报3、继续发送数据报文,直到下一个ACK。重复2和3步骤,如果send_wnd >= MAX_WND.慢启动结束,或者慢启动时间超过10个RTT和出现丢包情况,慢启动也结束。
其中MAX_WND是通过RTT决定的。RTT与MAX_WND的对照
RTT MAX_WND
< 10ms 2048
< 50ms 6144
< 100ms 8192
其他 12288
从上面可得知,RTT越大MAX_WND越大,这样做的目的是提高高延迟稳定网络之间的吞吐量。
快恢复过程描述如下:
在慢启动结束后,数据传输过程会随着网络变化策略也要变化。
1、如果1个ACK周期没有丢包,发送窗口send_wnd = snd_cwnd * 1.5
2、如果1个ACK周期有丢包,send_wnd = send_wnd / 1.25;最小不能低于8
3、如果本地触发on_timer事件,检查本地重发报文resend_count > send_wnd / 8,如果条件满足send_wnd = send_wnd / 1.25;最小不能低于8。
RTT的评估是通过RUDP_KEEPLIVE的回路得到一个keeplive_rtt为参数如数计算得到rtt和rtt_var.伪代码如下:
void RUDPCCCObject::set_rtt(uint32_t keep_live_rtt) { ... //第一次计算rtt和rtt修正 if(rtt_first_) { rtt_first_ = false; rtt_ = keep_live_rtt; rtt_var_ = rtt_ / 2; } else //参考了tcp的rtt计算 { rtt_var_ = (rtt_var_ * 3 + core_abs(rtt_, keep_live_rtt)) / 4; rtt_ = (7 * rtt_ + keep_live_rtt) / 8; } rtt_ = core_max(5, rtt_); rtt_var_ = core_max(3, rtt_var_); ... }
总结,revolver RUDP模块在传输速度和稳定性上表现还算优秀,在带宽达到30M/s以上,CPU上升比较高,一般占用一个CORE的30%,造成这个原因主要是一个UDP socket发送比较耗CPU,还有就是大数据量造成发送和接收窗口增长,使得丢包判定、窗口移动等效率明显下降。关于窗口移动和发送以后可以考虑用存C来实现,不依赖C++和STL,应该效率有比较大的提升。