代码改变世界

高性能服务框架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,应该效率有比较大的提升。