更加精确的TCPWestwood拥塞控制算法_第1页
更加精确的TCPWestwood拥塞控制算法_第2页
更加精确的TCPWestwood拥塞控制算法_第3页
更加精确的TCPWestwood拥塞控制算法_第4页
更加精确的TCPWestwood拥塞控制算法_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、st乳忙iniIxp训畀ructsacksk,cafisisuurtskbLffscbrtfiag)更加精确的TCPWestwood拥塞控制算法Westwood算法控制的是在从快速恢复阶段退出时的拥塞窗口的值。原理上讲,这时的窗口值应该是一个不包括队列缓存在内的BDP,即最大带宽与最小RTT的乘积。问题是如何求最大带宽。标准的Westwood算法做的非常粗糙,它将一个TCP连接的生命周期分解为一段一段的采样周期,每一个采样周期内采集被ACK的字节数,然后除以采样周期的间隔,结果做低通滤波(其实就是移动指数平均),就是带宽。我们来看一下Westwood是如何在采样周期内采集ACK字节数的。然而,

2、4.9版本之前的内核对于Linux的TCP实现,在开放给拥塞控制回调的接口中,只能通过当前的snd_una与上次记录的snd_una之间的差值来估算被ACK的字节数,说“估算”这个词的意思是,在拥塞控制回调中,关于SACK的信息会丢失。比如说收到一个ACK,如果它是重复的ACK,那么在拥塞控制回调中将无法取到任何其携带的SACK信息。虽然说一个重复的ACK可能携带了一大段SACK,然而对于拥塞控制回调而言,它看到的只是一个没有推进snd_una的ACK。本来,携带SACK的ACK段是想告诉拥塞模块对端其实收到了N个字节的数据,只不过没有按序,按照BDP的观点,这些乱序的数据也应该计入BDP的,

3、然而却由于拥塞模块听不到这个信息而被忽略。我们来看一下这个逻辑:staticinlineu32westwood_acked_count(structsock*sk)conststructtcp_sock*tp=tcp_sk(sk);structwestwood*w=inet_csk_ca(sk);w-cumul_ack=tp-snd_una-w-snd_una;/*Ifcumul_ackis0thisisadupacksinceitsnotmoving*tp-snd_una.*/if(!w-cumul_ack)/如果当前ACK是没有推进snd_una的重复ACK,仅计入一个段,忽略SACK带来

4、的BDP排空。w-accounted+=tp-mss_cache;w-cumul_ack=tp-mss_cache;if(w-cumul_acktp-mss_cache)/*Partialordelayedack*/if(w-accounted=w-cumul_ack)w-accounted-=w-cumul_ack;w-cumul_ack=tp-mss_cache;elsew-cumul_ack-=w-accounted;w-accounted=0;w-snd_una=tp-snd_una;returnw-cumul_ack;可见,上述针对ACK数据的计数是极其粗糙的!然而这不是Westwo

5、od的错,这是LinuxTCP实现的错!st乳忙iniIxp训畀ructsacksk,cafisisuurtskbLffscbrtfiag)st-uctpori|.estiofl_opsttrudi吐总記iisl;uiiMjiedSongHd(s;Fr(tiaizeprvate曲口lopth)财I*vojdfluitistactscdcst):/*zleariuppr和我电cati)+vaid*reii-trudsoctSsk;tipofi忙p/ck.dubiousl就F理ii-单邂&FU.G_3flTA_AXEDj&也t中11那誌e_潔出比I:-Jups:匸:;:垢HLi二泗7_少丄,0皿叽

6、LI:,;上:_-.11FJl*g&F/GJMH.gED)/*連扎巾山凋starttheshoiij肝equh副(*55trira5hi;(5:ftctsock七朗/*c/erKxreTorccnggstloircowfDptcnaEi*/u32(1Tiin_2ATdXca讪sirirtso:k*sf/dneurcwndcakuHiDnirequied|/_3pidrcongLSVuicIUstiuct?ccksKu32乍曲u32广cjNbtfotcunngcajlste(cptid冊l|*/cfoid|*5邑伯te|ELCtseekik,订为抽怛划;:illwtnencndeventoccu

7、riloxbrcillKf/Tosdfo:k*已numt卬_uje呃nte).怙/*砂理悄Iuee*詡他a-terlo&sgptiDnaO/、u31(*Lrdd_twndHnirt址山skj:X,/*forpacketzekilulntinjfQtianlB/oidrpktikeJJisInjctsxKKsk.j32numcted.户学tmtalorinef_d延loptiona*/vod(*;卿:nteiistructsock*也口胆&AtJrjstOpen的拥塞控制状态中,系统会调用私有的有在特定的点,才会进入外挂的拥塞控制模块的回调函数,对于在非程和重传逻辑了无法被拥塞控制模块控制.。后

8、来在Linux内核升级时,将重传逻辑从tCp_fastretrans_alert中剥离可以看到,只tcp_fastretrans_alert函数,该函数中就是例行的PRR降窗chafnueFFCPCAMflMEMAXf;了出来,但是那只是代码结构的调整,整个非Open状态依然是skip-节羽竭&FlAG_SKWPATHi鵲曲州町hp-iw_sn1_vuHNtT_fflicsk_ca_ops-cong_control)icsk-icsk_ca_ops-cong_control(sk,rs);/然后直接返回。return;/常规的逻辑。类似CUBIC等算法均会调用常规逻辑。if(tcp_in_cw

9、nd_reduction(sk)/*Reducecwndifstatemandates*/tcp_cwnd_reduction(sk,acked_sacked,1);elseif(tcp_may_raise_cwnd(sk,flag)/*Advancecwndifstateallows*/tcp_cong_avoid(sk,ack,prior_in_flight);tcp_update_pacing_rate(sk);我认为,抛开BBR算法本身不谈,以上逻辑的引入是BBR为LinuxTCP实现带来的最有价值礼物。这个大礼包中最重要的也许要算structrate_sample参数了。我们看下这个

10、参数包含什么:/*Aratesamplemeasuresthenumberof(original/retransmitted)datapacketsdelivereddeliveredoveranintervaloftimeinterval_us.Thetcp_rate.ccodefillsintheratesample,andcongestioncontrolmodulesthatdefineacong_controlfunctiontorunattheendofACKprocessingcanoptionallychosetoconsultthissamplewhensettingcwnd

11、andpacingrate.Asampleisinvalidifdeliveredorinterval_usisnegative.*/structrate_samplestructskb_mstampprior_mstamp;/*startingtimestampforinterval*/u32prior_delivered;/*tp-deliveredatprior_mstamp*/s32delivered;/*numberofpacketsdeliveredoverinterval*/longinterval_us;/*timefortp-deliveredtoincrdelivered*

12、/longrtt_us;/*RTToflast(S)ACKedpacket(or-1)*/intlosses;/*numberofpacketsmarkedlostuponACK*/u32acked_sacked;/*numberofpacketsnewly(S)ACKeduponACK*/u32prior_in_flight;/*inflightbeforethisACK*/boolis_app_limited;/*issamplefrompacketwithbubbleinpipe?*/boolis_retrans;/*issamplefromretransmission?*/;已经携带了

13、足够的注释,我就不解释了。对于Westwood而言,最重要的或许是acked_sacked参数了。好了,现在开始修改Westwood的实现:1.去掉既有的带宽统计逻辑:staticvoidtcp_westwood_event(structsock*sk,enumtcp_ca_eventevent)structtcp_sock*tp=tcp_sk(sk);structwestwood*w=inet_csk_ca(sk);switch(event)/*不再需要*/*caseCA_EVENT_FAST_ACK:westwood_fast_bw(sk);break;*/caseCA_EVENT_COM

14、PLETE_CWR:tp-snd_cwnd=tp-snd_ssthresh=tcp_westwood_bw_rttmin(sk);break;caseCA_EVENT_LOSS:tp-snd_ssthresh=tcp_westwood_bw_rttmin(sk);/*UpdateRTT_minwhennextackarrives*/w-reset_rtt_min=1;break;/*不再需要*/*caseCA_EVENT_SLOW_ACK:westwood_update_window(sk);w-bk+=westwood_acked_count(sk);update_rtt_min(w);br

15、eak;*/default:/*dontcare*/break;2加入新的回调函数和新的带宽统计逻辑2.1.加入一个新的回调staticstructtcp_congestion_opstcp_westwood_read_mostly=.init=tcp_westwood_init,.ssthresh=tcp_reno_ssthresh,.cong_collect=westwood_collect,.cong_avoid=tcp_reno_cong_avoid,添加一个新回调的用意在于不改变原有的BBR以及我修改过的CDG等算法的调用逻辑,因此在tcp_cong_control中需要增加对该回调

16、的调用:staticvoidtcp_cong_control(structsock*sk,u32ack,u32prior_in_flight,u32acked_sacked,intflag,conststructrate_sample*rs)conststructinet_connection_sock*icsk=inet_csk(sk);/新增了一个cong_control回调函数。在拥塞状态无关的情况下无条件接管所有的逻辑。if(icsk-icsk_ca_ops-cong_control)icsk-icsk_ca_ops-cong_control(sk,rs);/然后直接返回。return;if(icsk-icsk_ca_ops-cong_collect)icsk-icsk_ca_ops-cong_collect(sk,rs);/并不返回。fallthrough!/常规的逻辑。类似CUBIC等算法均会调用常规逻辑。2.2.实现新增的回

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论