下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024至2030年水轮机主轴项目投资价值分析报告
- 2024至2030年中国卫星VAST地面站数据监测研究报告
- 2024年配料控制仪表项目可行性研究报告
- 2024至2030年中国人工机械心脏瓣膜数据监测研究报告
- 2024年充电式自动送料螺丝枪项目可行性研究报告
- 感恩教育课程实施方案
- 2024年中国橱柜板材市场调查研究报告
- 2024年直型荧光灯管项目综合评估报告
- 2024年碳硫分析仪项目成效分析报告
- 2024灾后重建实施方案与协议细则
- 广西南宁市第十四中学2023-2024学年七年级上学期期中地理试题
- 2024-2030年中国应急产业市场发展分析及竞争形势与投资机会研究报告
- 2024年中国电动鼻毛器市场调查研究报告
- 2025年高考语文复习备考复习策略讲座
- 2024年中国具身智能行业研究:知行合一拥抱AI新范式-19正式版
- 数字中国发展报告(2023年)
- 缺乳(乳汁淤积)产妇的中医护理
- 《理解与尊重》主题班会
- 2024北师大版新教材初中数学七年级上册内容解读课件(深度)
- 2024年上半年软考信息系统项目管理师真题
- 金华市金投集团有限公司招聘笔试题库2024
评论
0/150
提交评论