From c075ed8fa015bfbf7d3743e46ee0b9d7c3168349 Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Wed, 23 Dec 2020 15:37:55 -0800 Subject: [PATCH] tcp: Update CUBIC documentation --- doc/models/Makefile | 4 + .../cubic-50ms-50mbps-tcp-cwnd-ecn.pdf | Bin 0 -> 22441 bytes .../cubic-50ms-50mbps-tcp-cwnd-ecn.png | Bin 0 -> 18866 bytes .../cubic-50ms-50mbps-tcp-cwnd-no-ecn.pdf | Bin 0 -> 22380 bytes .../cubic-50ms-50mbps-tcp-cwnd-no-ecn.png | Bin 0 -> 18039 bytes src/internet/doc/tcp.rst | 94 +++++++++++++++--- 6 files changed, 83 insertions(+), 15 deletions(-) create mode 100644 src/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-ecn.pdf create mode 100644 src/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-ecn.png create mode 100644 src/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-no-ecn.pdf create mode 100644 src/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-no-ecn.png diff --git a/doc/models/Makefile b/doc/models/Makefile index b93cfdd0e..5ef34c34f 100644 --- a/doc/models/Makefile +++ b/doc/models/Makefile @@ -127,6 +127,10 @@ SOURCEFIGS = \ $(SRC)/internet/doc/figures/dctcp-10ms-50mbps-tcp-throughput.png \ $(SRC)/internet/doc/figures/dctcp-80ms-50mbps-tcp-throughput.pdf \ $(SRC)/internet/doc/figures/dctcp-80ms-50mbps-tcp-throughput.png \ + $(SRC)/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-no-ecn.pdf \ + $(SRC)/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-no-ecn.png \ + $(SRC)/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-ecn.pdf \ + $(SRC)/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-ecn.png \ $(SRC)/internet/doc/figures/dce-linux-reno-vs-ns3-linux-reno.png \ $(SRC)/internet/doc/figures/dce-linux-reno-vs-ns3-new-reno.png \ $(SRC)/internet/doc/figures/ns3-new-reno-vs-ns3-linux-reno.png \ diff --git a/src/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-ecn.pdf b/src/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-ecn.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6c77ed406827499a6a637d22660fa9ad6008ed1e GIT binary patch literal 22441 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 Nmy|U%wRrNl^$$=0>F)pl literal 0 HcmV?d00001 diff --git a/src/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-ecn.png b/src/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-ecn.png new file mode 100644 index 0000000000000000000000000000000000000000..92b651ee5d06f6b2d175e7ef3387ed2b42936383 GIT binary patch literal 18866 zcmc$_2T)Vt_cj<10qF_~B1)Ampa!HPy#_>@AXRChN+)zdsRAlZLNA66(xro_NC_=c zBSm`e5FnKA#ozz?e>*$#?dd)*kTV8B$5FF;U#|mk#`zjH(Dt#*FL&M`Ju7Ly)-tK>x7;8Cxigvok?lNzEAVaZ79rH8Q8K{6BARlu7Lf}ooT@dA*?y_XagtpAuv6F_?M zTl@$hpH3h$BoI21$JsypXSJse1960q{8vZ8Z$>{E*900Bvv7T6ZtvZ5E4OJ76aC_U z2rs|Vd4G!Oq^#>ah=tPt0-1iF*!(twhF;M8eCo+dd3N?gJpHC00RiNV@L|h2L6EZ# zJQ|X!2w7{LGSn4*jJpF_<_fg2>mX1dC#c`pt~eYEv=W6tB%eH{`^0i7GLy_GljNs4 zmA*NN<}}qL4J7N!6>l19p4Kp?UtuOsi0;0EP{~vNmZzpv5lj)Sy?p}Y-t6GxVoqKhV0-nsTq|f#I zV^inA+`YL6uC#SYezB4;Q&hMPlxH{|qQ+)L|2c9{vraZSvoYss0k1B3p`h^V`Zyy+ zDfuSFwA_Gf)qZzds;XB;HymZwIo5gC@2}rZ(;Ugf4zw>39tZf4pNgM~o#v3rE0}$U zaTr;Ksg$TB{R;neOS>Y!p4-4Z&Nkil^OD$rZ}#pB%lnk~Ny=5q*I!h>p#T2!$BiF1 zXOw0pXLx2l&y>v6{;;_levR>(=Cy%qZ?AE2l&Wjo7YgNVf8F+S%^G^&NeGopgyO_R zC;#HNIQzx)LO?}L1*t-;x}Y|!X8Mt?LMV~AJ366<_hp(@bh)%TkBZCZ7r6(j)#}kI z_f)%8v8o*^^y*$Jv1);d7Tuzq9Gy(@%ZUiisJNjI`w8d|Qk=f>o~AK8Hg`MX_!1@f za0+)4Mn2%;rg#J80-gkD%WAhNvYKQW{jLAj$fiD^d0)F+Zo6V8^_qOA5|3mY_cHHo-acKPLZ+c-Lu5nJLzji`3JX^I zRf|+}typ@*_%t40-6z<;O9_iMk8Wa|V5~$ABAt*3q$85n$o<~)5{eR~lCW_i#~9C# z2iog+@%)$q%|^|VUMUmZ5sgQ(xcrSR#uLUU;R1Wck$0;DdtZIVd>nn^j`{tyP64O*nM>nZmP{3suF`K9`er@!Fma$RMlTdG^iZg5mV zw|-JlskZ_3NJ#0d6Pc4_?Ty;YUT!$Yjng|&>cCjWSo(DFbiY1R!Qb5ztM5m?`|R%* ztTr^YVbS>axQEQJ42p~l|0~VX&DG6-_D`4wg>d#gMedCTq5 znMk=xsaU~BSwu-dsZMc7@!l4bx3YIx&U!Xq_Tr1;mt8Nd zUzEJ;erYpXJWKTh{R8{c;AbC~D93M(MwmOSSj$*#M^ikx3dxlE=YyPDgi76e-Vez5 z@eI_b#1xU#(iGEpfu1itqN(MrxamhWY{|DC`Vwi#)|(5d^Vw?+Th_ol9S=HEGgIB_ zX6g#+LY}+VtYII-EvDky_5bKk4mbPFpO_rQVZUM-YuK?lHMsRB6WU*2`s8)@>NIdS zeDpkhYX0nr=~jT(*2bjV+iz)ab$pEvs;)=SZAbmY8LgL`Q{ha$dCB94H;N{4)uQ!> znh_SNR-I}*WqZ9ir6~jdmU>Ni}{)Qcu7%-9Xyo*Xk34%MICI zXHNg3!<-F}y2H#_Or7Fv#XH3-1^PwOPnw?6nmshKH^XXknbnp#E!*x5e0b^EF}`|z zMSVqvSxfXRzwL8Yk#y{YbTYKQ`bWlRh}p977Ee<2n7HI#VM_#k7U-)7>r2`KLvCLHXPe5OC)=7O{Fw$ zKHoF+J7b-1-+8*NoE)1c?IKO-M|CDynOZ4lTyUIy`WaW$F%mHpKQwd>k>h{gEWxN~ z3UViwmnu(T5Qq;a1QPTH0yzeM3R;3dJcJ;S6>|tg{1XI1|0=a!TM~Rg{6bw>0djuv zFS98x4*ccHD-}aG@W0BxAEi!vY4C=`T@|KCGDksA&+z~bcW;G2WcXDTWOcpA*CztE z*lqlow`w=?`n+n!${d9V-Zf2`|9MA{a;mu^7bX8JK~o+R-%F;!!YOKae}nGDxb+Vj z&Z_qc$SdzHIT;*nQEjRaN3|C!5>}q8qZCJN?}nWy(jGh96Z&55^7xiRuh-)41V+Za zFTkM41b(-q>UcWB)yI!5c1UX}lKu@24-e-oBxO|?i(p}6Ga@1B(u7>S zI#6%k&%wsl6(JiJ9?s203}a)caHKf)pY|aVgPC76a8S(u1bJY>_vbI%*t= zWP_|LuT0?vY@wkC1%RMnmgtkm%t9b^imxpg)=iE+R{Dbdysy^aVUH%x>U7HS`f$6OlmNJ2XI?LH~df4FN}q93*+LYdrGEQxm0 zfHFpZ2r6C`*TD36NW!|j^i6Xulc9{1RYvz9L2#tHOzHeKtqqcsqFv>*>8I53QjT{U zx#|1kKgCm0u+1l9S27)j?5@kwv_fG^^)W&eIm~G&_?D!g_?WsZjRF@BB0=C%(IVoD z<1O&im}Lkf`u& z4TNQU{ot3|X@D6iD-q;x{YJlAqSY0Xk+(E*UrQx+7`rRpWOEOk6Oe*8G;*I%JdkkH zvZSMA)d?p9hEP^_6Z-nnDC%120Xu+TqpAJ6Kz|hr~lD7+m zN}DwsjCfcWCVpCYAHC=}yrZY*k*~3nD;q%a0PPwGuDDb$9nWQG`T*wIP`WA)kDIcp z9MkYO4bV5LyW0&tOG`%aKw(ia$+?mpZ&vH&Gw!z7B$v)LH%yd5STr!HpG=cC;mx~q z&T>!nJeD5DwY;@tw7S{t?jfFL>s!$n*AjBL$PpXu9pKYsy5J(daR}oxFrqqumvS3E zk4K|iFs6FP&CEj&9I?H{x4qLzOh$50zf?1B5)m969MFWaQnZKL+3$#rQOt`{N%lpZ zF_#tmNXeyW4_ZVFoJ;k|m*|INa|^-TP>kutj@@DWBaQR+48*#6x3La4Mr@(xSP>{J z#Dd|Aql8bHhI-CGkOjjNI;;Gn2c(3+1B9tZR`)+hVry=HE-)>Nh3 zj3(!8=I@zxS7aL%tk%D@N1g@*=K9V1&Q2+xNT??w%0_5QSII^^-WC=Pxa~BhX>$3L zpy1lkQl`5DP{(`}dpFv{WMJ7{$u6d_&^qx)?n^eq=W!Vc`===XzS%(uM;HbQ8*r*s ztQ?~&ER3lt{N63Nj{oH&P@=?e9zdsfHPphg<`>6q$!dK+^xm<=y1zNh?QS`$E}Kq~ z$3Y=ywVp=qF)2WhoT8bkzEo=>)FvJrSbd`qZlv2z*-n#arC8l0L=k4!u>D$Nd%by+ z+T?YgtFV)ye!Lf}0(8_0xg!jtEi6>Jq>`(Y^IGk5FnHNjGp?7JmMLScS`3XPW4Bvw zMH72^d1)67_1jfHwU^yK8}mj>A2p4F4Yly{@>;61G>qXJQSEpmNj!reggU-}@trlh zET`!Mz=9*c@ROIW#^k;npNc;Tu)O)BrOdm|F!6GS%a_W^kfx@l-#3Cp4YB%kmn|47 zv|OWwY)iQjGs(X>lKlb(Rb|uNF`94cOY^7%y4V7@W~K9n>=a=MJLfy!kv8Wp2#lWP zks8|CEgwP8K%_I`apCCPJ(_tB>GBn0K4iGQf>n+wv`mGq))%z#pEX$}gk^KH)04}E zFL9(nOO3g1)51GibIAn}_i31m;}Rwj9NmJ+UPmT3?zf^V`1kPs?&7!e3&jVaslOdW z2Ec3CJv)lnh?)Y)r$*K33}qaMkfM;UGAhacnX@X+)DfZiw1P9~`un+(OOJilb@>=xc1g^UX!d~BxAIp;P8tKn0$8YF0yHxavm{JuM0=QYK zzq9Yw$yh+aQ8{U|B&xZhYJfuHPHp3zjf@0<&ISBT`vV?ehao%`s#(MF zy+yFYC0kl+EJISDNwvaE8g}yR1H6})UhJv3sar;vMqHznD$3#-;w1OBTUB$?$ZbGz7D+d;4$>NV&@u$?nOUI9(Py2udW{KwiM6z0On{7Wux<44d==+ zrsZAr7`b;ii+#L*)~ZjuQ*vq52ufBh!}?@DuIrJZ$o5XpZd&IaC;rpy%+Vu?m)vEM z+3y++FjclKNR;A~ho4NRt2)XsKyat-a4|R8U4ui0&(s?H(k}EaE8x4!GAwcIYqMl> z*&%y+Vn7S?K6{tscje=spZyI~_5y!)OE&k-ZL-{phG!%&b*5v`)18mLJ zP*z>Nw{Rpoma;tv1t0Krz$(!Y^+PE`E#lKIv$2g6ejb5_u(WP$IO+P@R~rquf%GC~ zmW4uoZGBy_3=UcOLK{wQ}`YxJ*r5TcOWD@ zJfHM42~6z0vYy_v#LMP1Dpu$Rsvw{U&yuoclYo7^s?TQI#W~{5^4r5dUu<|+62vY& zy{tlBrjDEAn&5G4KT{J`@RNf__Vx884TgkTD4Zss;Mqnca@uqNKZX?Ub;~uGhRuqS z2D2~%o48m35}2Oe!0P@q;trkS%|hWCtm7wC1W4Z=lTid06i56dA-{Oyr^~WBkt9F9 z7NZQtG}OU~{GV}fU{59F|2H={^>r#VJv_XIJY<35E8Wej1D^k1r03$go`l1l2F*Jn z5ScKp^uv^jI5`D{yXO5p%h$^w&AVwC1Q5wRnyu-OR@kG2G+t0waEkOT?DfmHp9i+z z>e9S;_UHe08(8CBpvg$qsyGCg(`Ze!5QPN;F-X2lZLlK2EWjFtC|)ivQ?*y9$ApI` zmh2%>iwIyr&718we954p%?ZzqKToBR;ox4z_V=3gkm^*EhISnyZeth|xFG#63`J9N;1! z?}NjC7htToUW2Q=16PrgeC~M-T&R-)YNO91K>#+;5}bW47?iNKSa9|Hr($ORIpW4O zfMy_>CT;(+c5;1YIS*4)fl^hdawH>1%F<*G*qVd%wxOXRU%zNzs>U%Xt?yf!gx8n< zeDU>bQ2(ipjSYcsLJAENN@XJTi%%O#PLmX?k5&%>K%XIZrJN4mfE&3OeUOB1M_ARZ?))Q-4Pq>B=IUp`{M5Co?>+A?vj0qR=Q-t@D1k=DpBwP zWg86B)oY(6>XQf-h)$g57tUWa=8~dzc7TSS-bk}n9J*3LfryR?+AajjCkUi(*ZiWC zd`v@Rwdf`QM^|3gzt|+rELj~)RlcDJg*+%Cfk8d4SA8>muT((+i|T*alFj|fgdT|k zc&yMi2t`-yiqVVo0Tg=DzceP=x7+U^l5^fYz9=q{R*`un#pYty|H?kR$@0j;I`d`6 zza1+H{uXRqZS-~#0SQveW*l~^?e1MP)=Xmrw!l;b0wospC3DO{1VkF94p34Lc)z^PIAj=ok5S=^`%K*2|o+>k-3zvSprl3cs(G)xX+$2@!>Q?iKI z@@GB`_?MG?{$FwHoo!dMA~CvZVNC7qBfD!?9aFw3SAsZXR~@PL`I;1C^v}_ekyVc> z?0Qymh$T$|R#y+y%-Ro2D7uiSdw$5~ss%$$r^gCa{$wp$4@=;lf0o94ny5hOz?e&y z(IKKaxhn>@lOC&T5OqkudvRm`B8pu#4H1Fy$Zex_4%O1gY`9U?n`bmc1CG4#5Wl&A zxz&pAAzoI!%f6$MAeyuiB5md^*DE@q6zx5q+kop^8TNZf*+nK0=p4j$Ej;Vn&4iDu zJWjyUNBqZ-j4^wX)REblm}QD+KiFg~PeGwLG)Vd2W!IS+2(KmjS=?%L<^-)3{J&Q{ zL}O@&Z0UI%Hw-VV1(O8Mn!AO4(yQf9H)k z)zVKcJ|kwmcr0Ko)X3IjLGiSB>7}rL&P^xnQ!`*o0do+7yM}nQ0+?hYydi`ucEm2Z zi_3?&iMYUp{`(#qg*lqj7dTZK{^LDZ8`d0~qM?=k=?o7ut=;ktrP}ffEbu3zL;_#j zl?3HR)!BUgqdwGBUfuiqy1-t)k!=Ehy*%MmyXFT%+4a)?fl81`SEFGcMSKqa)J1h` z-T)|O2;5HKh7{TdxysUns0qe83rbjl(=|Sq<<<4Rn5Y5oFN23MgjKFe28-B>^%^u4 zuEhhBe{fxz{XHo5jgp!-L8jDpfe1st6+e%(J?zVMmg!RkpjV@oB@Cn!0O`@m$0p-YOK2fru)*@^EQR@xoZQ;D6n~+hM4O2`Ifru~<;m zZ~4m@X<@+0CTwea%X{mw(ng+L07;W?)TCQ8g!X%Y4jM^eVd**x3q;fh>M!vR1JwTl z^yuG!!}mjjOqk|;pegam&RdgF+_ zz$n8D!>cj@i=DnGs~w-uO#5t8yYeYG4TQzKcL3W9`ZEg(?cB>y9G8~G@nL}~Q_Tw_ zgbE7K&u{tVnrdsqgeb~uYw0IkD|%y?wWiWVK1cxIEqy!T%7%wx*AK=gGkDU(;+jtz zrcQk!28n5sz_dPoBOw%Kqy%(dyAVhSK+bR?Y(_QryI^nKrXrgMTp$;i^Cli-8lV_s zx7O1$!4Fi1Jy@MhfP2a-DAH|GZ|6hOx5-t!;OhyLms{5DS z%^8$_2aY?4B$;|Q&c6w_ZJ@h|l8*tX!;$i`4=LmUQ3bLmQL5w9fEE0_Js_r#M*dS_ zfM9Xd(;KoaxDOeyu|?KwN$dP4dOX=JM!}an8%Wz}z_ur-T?Q{uM&*yJKB2qZWGc9O z`Y)j;k`?-$kvvS#ST+>Hj(NhvQeh?BmoEOp^Eq3#q;?^Ul&Ws6;PyRMEO)?TeHxFj5WI>+t_n#?8pmbqxLylosY#78_KK9WMRro;jQt{i5oFqEySe zCANR~7AL3NcLBD9`fAu3O)AUy!2+ErK?ykca)q}wf-Ch@dV0WF9{rZQmBH&AC%I4e z&y`jG;^2Tf?XJk=Ci_>lk(<4>9O%u^nhKcv_0Wnd8n|KpRwhqgd)!=V#VUUh;$Y0i z@FHGvz7>=+DH;-Sn%2^X?Vccdr2s&~$VzxSll^Z<$@dk~ykM=Q0e~OLyI0K2d{U`e zkwiRuj|(IOxm$%#T@haZ!KIX=?J2$JD)RDvoZDhdd>RxuX!bYdidKv9pk>G*x(Kh`fZ^irDhLd45o(v(z^(NGocnN0Ez5`b$PD? z9Ic`J7yR^vvEb&cc_nQ(Ha3*hLy|9iS;Uit#*u4^1C4?SmbHhywjoO`MbLJy4ywP-OJ_XsUt`$X!~9tHrR^@Fc#DI3ir*$> z1qr$21+^<*G{h^B5&x>=c59xD)F-yB6GUcy88^jiuO@O)AG*K7E+0C8SeNCuI^KmlhC99A)~M|T0eV3l-*AXjGif(%8XB0L-J zP2!sO8c*7oduleFYWXI&W6tksrg}f9Og%oWP&aR30wjH+6>PtmMWt_Ke`K=-HML0& z$XF}G>6J~1Yk?2RgHCl$Iisw{TVxR%>t(&zu zu)9JbuqT#f^>DCiOd9u^p-_?PiG;k6FcVU6F z)}^X1)!ILc5>V?Kx$Q;K)h6_A>4mm*#UIzGPtQ!F_(}eCCulKZC7OBc{N43WsPc4n z_uHs7Tc$w7KHOQs;j_mas1oG0xwcKqxcIvnk0)T`=O5UYkB+y(^3G3O=;`6}Lm-QJ zN;NBFYudkwy9@#BK(-_3fncEB=($v`(Aka=LED3W6yBaZ!%2{g@Ijb+pHv)w2K=gr-0; zA3wR@k^=AMn;g%CBVU;q07jU=+yXY_LV={;^J)5xL|HJ*Tf6pFKGDbgDZC6!;nu15 zb;YY-sj+9TMcuilsCkM|W1F~_ToaG9M*G?eP9Gxd$`w`9nc_~Nh>#y4)S3d75}Qox zp(-2a`(=Fr=L0!%jk{@4Vx{2DBC~sRso*p8)}a>Rnt5?WjXS@g=VLOr%uJmT-R|=V z4j=XDthj}GXrUN^Cvg?Q*6BOP`(_zsjRMWy{cnYinUn^h0$=H)WgjYycw})$_Ivmj z44sxI{{i@_MYhc{;1pGz)J{t$E5pQ-IxIot8T@UHse%$v@U zdV0e9g<@J?NQ2j8#p8k>`<>4sJE(UR$`XFYm!AC4ltkEZ>KJ%GUMeNXCm8dhgD&+V7u$Z z1JU*yy?>^(&gQ1~x8t^o(HfPE8}>g&<3@AMKj7YkzFSbLI}bb(#7yZFyo=G*Y_?99 zp7s{|#reyyi6uBduFNJ$Rbr5UlY~;MpH9vx6(^g+h<}lE?Xxx12^VZ`GHVC6GsiS%iDF;4d9+g`MlItV-|mOrxCz%J{9s{ijHT zKH)|yij!?Jd@v~oHY#fM8}%)%BP{_Eya}CnF_)Pk$fQ)o>9p+h=6QgSdN0Rf-=dZm z4bi`Po21oz;EiX4$r8UYXaWCgPFGa7fuYgPPKbaIZ2t#=*#Afcf3n`6MGI{f91 zxA_UtjlRIMv+FMD3qRH7{Z?=fHiqX7Q*37M5k_WfcJ3?a}PcFrDG=J5|=-Cp<>XuCVyd#2!lZ#C7qNJikmc)1P%Z z%PReG1d9HH9xH|~==i`exYH#vLp{AujnNf#a*gq-1<&CYlh3FCzv`D*~*a-|K$5rPr0nL<)FIkFS*$vp=O43bd*3nX<6Xu z>UN2D2KSJx?S&fn0$ZTc3DptkAIsl({F0(ju;t&YH?iembK zyksU;NtmPDis##}3rH>U=}pex<9(6p0*H2%480wX%>dk)n<4Ix|6WcUMi_?p!Nv2d z9?cr7DvSp4U!ZP|>vBI`l39R{1LC$gbeuXxAM*|eM@`tV;}3qS7QuNVAGnFl6~MbH zknW{*I8)ZieF4_e#-|!4rgGus^9i0s=;=cr%cX$1IhL=DInjogp1i%xo9C|c>x6P^ zfvWGvzqA}O$}!j(e}fpUaMUojKC8UOc|qepQe#;)cajU;2anO7Qx#Syu} z$?I$Hrp~jGHk);eeDs8ABCfF}Pg?}vSWr0atE9_^IiLT!W8t^Alq26U`s$`N3A)O^ zY0V1JlF~V!kUGy}k18>Be#I(WdfDaG_SP4O@qpb?L0R42U`yI7i~G{Cvq+mtB~T(nPH%J9aLr^(sS9vNEGXP z`^oP>TJvqtd&9VS_=6(d zpiO`011T+xr0*m=8ZfmPOX$C(fLorPZ8G(4y1{~+f+aiO>OFojex3%&tr~49z z6qVKy=a0NTKQ<%DnAoI7p1crKgXNS4UduRLa}=UrH>f->e;E>3_VvYHoqQP49UtzF zUs?C(uM-h~?!_ivJLwImH1D%^ucrG3wVbF=cXE+zUO1yG8b3wdxF8(jxJ_W)a+K1# zJ)1<}%^I+rR2s5M6?i63?N6;Gee^K`-niM^+2NMz-~_N=IYYvSj(z#PrPvz_@2o2o z8QzM`Q%Vd}`na0{WoATMxBs|w>~4*|4B6T7pLRYYK5Ux06x0FY#J$6V+CVaTqu0uk z$K1fZ*3V^1I**nHFo)eOjkc&ApQCQ&j3QmlzeQ&L_d%Nuw3S!JBUAG16%t37PY291 zvn89;agA-;^YzcaZrF@zKmS2P$b^xUQ*ZO=Xr|#MXEp`l(+8~TQlW7vV>arY1 zOeGk`nVFY9c*NQm!FH+7g-$D_&$e5TGYvNb8fUI=#&VJo94tOa&>@iC3Zi-RM@Ujt z@$*M%_z%fgTCVilaIw0Bald;cfLSusq5bK6?*pypCseW#RVPl9QPg9~U+yF)u6>xme8%hq_pYx&9|(k8o(%GXOUz#{lWjTtag?X1@dDboHM`z2c>0|y zsLzks`)v1h92ZH*eaoxEc0scc5~|b?n!spW%Q`LV7blDlHlRo0EGe*%E2K^C8}8L!tPtUr`I`g%Yl8#Ws2a&D*#k{bw)-KtnS8^0hexmY2lb~yV{EK;aG&=VtImr zwyUEi>-YXWTh}Y;E})S8id^u=eRkGL*;icgY#1n3-InIf{M3ArOO~P#`1PY>$I7`9 z_y%>!aAE+62Sb=m62$c#8snBw4 zTCb3(`Fb0>53&ze?^Mq5bM6o&8;h$f$j7jm&WY#71zQ`L1{~PzZU!3nH?Ec*A`>Ga z%@ThVL>Tz@JGE|@QFUg5Iw^l%056TW|r7K!QBF%6^6NIpJf43l+x4T>JSzXv`|Jw^Q=Gz5ffHOW48cK)6< z7)aB!DIkey{52|=v`vj@cQ>64w$9luA?JE)fBBWb?n3~=+q=IxLl$!Psb)D7#>!vD zIa{bq%0X@QZcfJXhmbHcO>G|hS?o16?R4+D!X9aqz-`v=X9Njp9*1*M{31gly7poyaLC?ghhsiy}^+l_Z^Lm#b!Kl$14AP0)?Hc zQkvl=KDFw+YV)zFs0MEt33KY%ZY9zNvrr#xCe*SW-I9cV;cB$X1T}cU(vR|9l(6b( zVMZ5U;)o=TGZcXbPE<8HV zeLwYfm9S-pZ@JIJ>-N@u*&;UfU&|hevYPy+9dB1n2B2+ecMfIb{{T~kt4 z;JM$*H~x%Mhk*=az@=5k+5~!`d1y2ymEmV}?%9e#rHnGM1_tT|V@tm-wAomB7<9$l z_V+=Bd&43*-o)~9kHlsVv(W7Plezdea0KX=Z%I;vMkscD0hzejZI-^iYla^ma5N;K zwVgS@%3L$i=&gi&`^no-*g&ys?e=uHmr zpZL=(>I5CCiX+&W1llWMNYZ!vN6tJ;iq!m~C3>1&p&4~9iP?t9qjV0IW7Mbke+u{Y z4nBJ1h?sXYNkHfA;IbBz6Kz-aHZ~0sef?g|=K9?$YJ8Q&r<&ezLs-ZqEd_9}{6Qcm zsRdokZ$ieSb7Ma~k1+dM;gtiSQ)d`!TQ$4dj=uCNm5QSQmsDHNv_`;opD&(kOql|u z%tA9FCc^X9;ajt38i?;nbk7q7{o&>K4CqxKMzNz)wiGKMH7yzn&gRysetfUK@obv< zpj*AS@w<_=I5AqRfcMo#D)Z$Y&xWQ!0-Y}L`%IFeUnBhQlvGLNyxjQu@|bo!n<4c6 zPy}lU;$XUM;0k?^Y+wP!r`_V!!)DyQnnp{RqUPMAek$hl5>S;Qy43ZC-kM1MN`MEo z5iuh0F|kaB4hWE8hYUUYIGU6kBkLy6mx;Z7LSxx#yf^)tjU&lC3PkP2DbTeL7>s^I z*m8=sN@{IpYc4Z8-``u0nSHDsUq}3U!kc|7i@HQvY;M0i_MX#Jna_~leD$yK8jzh) zIwAXR_5?OC)Td7dfABK@Bl4m@wXK(GE1UlGN>I@guuRw2M_A1XXSFDpPo`(2aX@Z} z880C-8OgiDgB+GjkzD?c1GJbM<&KKm+Nf)n{fFuzs0_|6YHTxtwl(AY$PfQ)&)GZC z`j}0*yu$=xbwG5~EqP~{5-4`k@y64i1y3Cz7Obaw-H9GAfUcq(FXK_TmP-ALZ^=-T zqI1Epu1htQ0$E?$=W#9IczHg){Xxp#LH!UOxzB`>3C@L6J+9Awu8X8K(rTN%noo#Q z4Kw~Kj((7`GV*kc{X?R~qywjNU-R5uJiGR;#%wLGPt#<7^lE3a4l1pOr2r5hMXxxN z7n+WTtQG@Ci`j9ZBXb%VyHz8rfSAlfa@d_toDK?pZYjmC3%K)Y!PAuc9@s9tr$COFwJ<}YkixkX zxJkb6Zt3jbKd{R+&ffm9fnRr?5-jT$xZtP(Bl7le@m$hZ?$Gd$&uRdoY3r@k;+JPF zC*5+5+tE>cWkqEI5@A1#6c9~+De?0j6CPHJubM)v6~kRXejEx~35W{BfMRR%L;QKm zna?yXa4KvO!DJy4YP|R9p48EoMpXL_GKMMR(Mx*YEYREG?>6eTHrLEal6Pe+bXz38 zeOyVkHF|?T9Z>!khf;MHF))$F%U68#*)kvF0YeZEgunw8!|%vQV*@~owCVnTJ)fCp zB#@d>0Kv)EWmJXEV+94P|F;tq=$o&;c>=+Y?y=8BCmKgWF1}hXUBwM&2>mDb{|3~V z`+Sc7E!E=}MssP#UnrM!LkI1VV1faVGc}IwyNy|k;939SG-&unr30Dlf9v&{__?$a z|N9)YH7$4nCBJRM|GrH~41@$gcp;LauI}clZ3pCmR6rwO1N`n5Ul_msI6}#$eqpZS0AsBdw>p;N+ zfdH|1AW(&Y5C&xNURY$`r<55&<#Eo0Aq$3}VV8S`{%1tV4iim) zf=k=vZ?FsxAJzd)P%A_B#eI)275>Pl`j{dI)V)jpT4y@T=*m^w>eU6%U;@*x0$+%%TQIp- zBZXLC^O~;qSZ{_*ET9(}L_OCS1X@laE8;3?`Xt?mfdoZ4_RbF%fpvMJAX&F;nN!Sw zW0}9>SV4A0nwT5$VqZr4bpzwqmqS;=KC#CCn}OpLR!Eq^^`-=qsf%5N&xy8mNbDA+)3O_(WH279&x1(G&Z zT+fp%yh1F77Tvyvmj>a+-6VFwv~*+@SRx7zbdX@m1gP=umDk2RN}^2wV?(y+o1s@r zxK{B2(574z92{4=s?;`6!4D2Axj|<(8Whg?vOhHlT^S#iI$UmxKt*UYPYO|h5f#|O zn`JQGNJ1C}$R~r^{`7q;T`fjjgSBRg$pVEMneA=R2-gStsDRn(?~Rr^_k<7=hBBU7 zdWM*%*Gg!K(N{!`5_g{IQaUC+=1l6=p|g6io&j-m-qu2>W6i}#3}_->0UAwP zDCi%C9!rL>d@Afr3P0H9th^#BCQ%|@N9FkWX~b~SkjL%9LNHp>TH^@hUFOct)IbJ0 z0HhEDc-{muKw^ylJ5yl_c18vw3Tl3%?a%HJ`qx4hh$xU%SM;-% zKiSfLL3jppWiXw|*udD?#!V>*X#Mcm_H&u<^hc*=;`CXoF z`wyM~*&K`5)<4CIZ+Vzgu-hV#UJbnXoSf(?$S{P68Zv`pt%q|@tW?q4y;NPGyFu(=0!Ry=OdD-0ZZ4aBtB2&McV5%yjKG@FR z2P<=O1XiZ#7nFp+DOJml@UX{*xa2yuj3jAAncw^&PJ^~%Cd3;IcLC7^PxoQ)YJQmm*(&0ZSW4)pEM#y>leM% z%)8Vs1c1~5Yx=DJq*6vAQr})^X8=kt`BSNgqYnDXc%$26!dC1HXg~R!Tb&4lQI&V4 zceAza>7iB`?~GSeFi;}dFJJm}=*(reKiOvO@RR(!+a8Xp^pw>(XwpE|<$ilB7!jUt zZvTk=y@MQ5w}DPhff@uiwqmP(T|HssL(Hz^q?wYs*Yr2LIh)>8fK%lAKwX!ZMwFdU z;fbznHBXEKYPAj*8ltve=A_w*5>rD6K2-ND!<0NDPL0@ zeqh^mBs}krG){iqwIwgJM<}`fJ5JQg>7h-dsOucJK-1n+Ch@AoyervnpJB}|h5gbQ zqhb;b>K5?T1e*QqyG9Mt7ek1^BQEszRW;~Jj2)EGip#<-R_08!w0@SW=O z3tD(2KJDG-QPidfcBgw*G(-6gf+$w%;Mthrr%wIfQ0L~Og^D<#IQ(Wy%Nhqi+D3Xe zxgzch6uZ~t^gIB;w75H%)J$h!=I;ScP*vR8I8V?k(XU zjKfd^AbSO}RxlbS-lhihLAre$UG9F(d+`eMPrM$yha)ynb-perPV_T!0fTD4J$ z?O%6n4H!3qP-sH`BY|(;eCg%&$Y-J+3ZB7p>+%d^Y_ZL$0qF;WUt+colGGLqFa9G3)?V!g4+0war9wySe|}37 zBCr@8lk=t>?kMYlq|n}WT@5a0Y@USWl#sR^Sor!FVCWh4N>O~8$5p}6OsaLit|kEWHRyHkB1}fg8yX}YOx(T-`#Dglpbo}*v%mmf!>*)YJxo@h zmg7>fm7(@M;j=q+L~*HDsN+peY|Vv;Zgn3*VV8C>7}K8R4+bIg3%kZS2jWNbRCR;B zD@$fYfv;%OOaRg4CLS;?NKa}8qDdgf&P3KUCT`;8?e#9~u%M4aPcO{6oHg4IOkC@O zT^_gu8DIB=-n}hES^?7IzFVR9>7IP964RQm@h*8FJ#_2pd`G5gRd9uM&j)nP_K?NT zWq0xaF@|r`H%wwI5e|Q(5XHvFq7=n!bl~MKIn&3>u4+wwExBry6sw=4N$TY{WR{{fe70=K)d+Fvhik6ZrQDr;-hm;ZO~0#{7St=*vHe!6Pj_6^Z-9cGg5 z=Y`fzES%ip4fJNzV?#Tw@O}3_+gy45HKRor;+jNYQRQ}j*~HpK9|O0!OyP$_k_>Qx z7;t|UghOBl)!+J$>$m-~XDqw{+)A%n;u=wsl30>zm0Xkxq!^40j0|)QjdYESLkvx= zjLob}4Rj4GtPBj+XZ<^hq9HdwB{QuOw}yM>Zk0d{Dj*vQQqrtEGJ{f!o$^cbQZn<> zo$@OfOw0`QEGmpmO!dsP4YUpP=iV^_suzK&4@)g7&dkqa2yk)JHPkavka4%F0Ln9X My85}Sb4q9e0Cq^qbpQYW literal 0 HcmV?d00001 diff --git a/src/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-no-ecn.pdf b/src/internet/doc/figures/cubic-50ms-50mbps-tcp-cwnd-no-ecn.pdf new file mode 100644 index 0000000000000000000000000000000000000000..63ead3bfd9592c488301402531a8403ddf34e065 GIT binary patch literal 22380 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 literal 0 HcmV?d00001 diff --git a/src/internet/doc/tcp.rst b/src/internet/doc/tcp.rst index 97ae690e5..95a9f1b98 100644 --- a/src/internet/doc/tcp.rst +++ b/src/internet/doc/tcp.rst @@ -13,7 +13,7 @@ Overview of support for TCP inherit from a few common header classes in the ``src/network`` directory, so that user code can swap out implementations with minimal changes to the scripts. -There are two important abstract base classes: +There are three important abstract base classes: * class :cpp:class:`TcpSocket`: This is defined in ``src/internet/model/tcp-socket.{cc,h}``. This class exists for hosting TcpSocket @@ -22,6 +22,8 @@ There are two important abstract base classes: that derive from class :cpp:class:`TcpSocket`. * class :cpp:class:`TcpSocketFactory`: This is used by the layer-4 protocol instance to create TCP sockets of the right type. +* class :cpp:class:`TcpCongestionOps`: This supports different variants of + congestion control-- a key topic of simulation-based TCP research. There are presently two active and one legacy implementations of TCP available for |ns3|. @@ -32,6 +34,11 @@ There are presently two active and one legacy implementations of TCP available f NSC is no longer actively supported; it requires use of gcc-5 or gcc-4.9, and only covers up to Linux kernel version 2.6.29. +Direct Code Execution is also limited in its support for newer kernels; at +present, only Linux kernel 4.4 is supported. However, the TCP implementations +in kernel 4.4 can still be used for ns-3 validation or for specialized +simulation use cases. + It should also be mentioned that various ways of combining virtual machines with |ns3| makes available also some additional TCP implementations, but those are out of scope for this chapter. @@ -41,7 +48,7 @@ ns-3 TCP In brief, the native |ns3| TCP model supports a full bidirectional TCP with connection setup and close logic. Several congestion control algorithms -are supported, with NewReno the default, and Westwood, Hybla, HighSpeed, +are supported, with NewReno the default, and CUBIC, Westwood, Hybla, HighSpeed, Vegas, Scalable, Veno, Binary Increase Congestion Control (BIC), Yet Another HighSpeed TCP (YeAH), Illinois, H-TCP, Low Extra Delay Background Transport (LEDBAT), TCP Low Priority (TCP-LP) and and Data Center TCP (DCTCP) also supported. The model also supports @@ -64,13 +71,12 @@ Before the ns-3.25 release, a congestion control was considered as a stand-alone through an inheritance relation: each congestion control (e.g. TcpNewReno) was a subclass of TcpSocketBase, reimplementing some inherited methods. The architecture was redone to avoid this inheritance, -the fundamental principle of the GSoC proposal was avoiding this inheritance, -by making each congestion control a separate class, and making an interface +by making each congestion control a separate class, and defining an interface to exchange important data between TcpSocketBase and the congestion modules. -For instance, similar modularity is used in Linux. +The Linux ``tcp_congestion_ops`` interface was used as the design reference. Along with congestion control, Fast Retransmit and Fast Recovery algorithms -have been modified; in previous releases, these algorithms were demanded to +have been modified; in previous releases, these algorithms were delegated to TcpSocketBase subclasses. Starting from ns-3.25, they have been merged inside TcpSocketBase. In future releases, they can be extracted as separate modules, following the congestion control design. @@ -79,6 +85,10 @@ As of the ns-3.31 release, the default initial window was set to 10 segments (in previous releases, it was set to 1 segment). This aligns with current Linux default, and is discussed further in :rfc:`6928`. +In the ns-3.32 release, the default recovery algorithm was set to +Proportional Rate Reduction (PRR) from the classic ack-clocked Fast +Recovery algorithm. + Acknowledgments +++++++++++++++ @@ -368,11 +378,11 @@ callback as well. Congestion Control Algorithms +++++++++++++++++++++++++++++ Here follows a list of supported TCP congestion control algorithms. For an -academic peer-reviewed paper on these congestion control algorithms, see +academic paper on many of these congestion control algorithms, see http://dl.acm.org/citation.cfm?id=2756518 . NewReno -^^^^^^^^ +^^^^^^^ NewReno algorithm introduces partial ACKs inside the well-established Reno algorithm. This and other modifications are described in RFC 6582. We have two possible congestion window increment strategy: slow start and congestion @@ -395,11 +405,30 @@ During congestion avoidance, cwnd is incremented by roughly 1 full-sized segment per round-trip time (RTT), and for each congestion event, the slow start threshold is halved. +CUBIC +^^^^^ +CUBIC (class :cpp:class:`TcpCubic`) is the default TCP congestion control +in Linux, macOS (since 2014), and Microsoft Windows (since 2017). +CUBIC has two main differences with respect to +a more classic TCP congestion control such as NewReno. First, during the +congestion avoidance phase, the window size grows according to a cubic +function (concave, then convex) with the latter convex portion designed +to allow for bandwidth probing. Second, a hybrid slow start (HyStart) +algorithm uses observations of delay increases in the slow start +phase of window growth to try to exit slow start before window growth +causes queue overflow. + +CUBIC is documented in :rfc:`8312`, and the |ns3| implementation is based +on the RFC more so than the Linux implementation, although the Linux 4.4 +kernel implementation (through the Direct Code Execution environment) has +been used to validate the behavior and is fairly well aligned (see below +section on validation). + Linux Reno ^^^^^^^^^^ TCP Linux Reno (class :cpp:class:`TcpLinuxReno`) is designed to provide a Linux-like implementation of -TCP NewReno. The implementation of class :cpp:class:`TcpNewReno1 in ns-3 +TCP NewReno. The implementation of class :cpp:class:`TcpNewReno` in ns-3 follows RFC standards, and increases cwnd more conservatively than does Linux Reno. Linux Reno modifies slow start and congestion avoidance algorithms to increase cwnd based on the number of bytes being acknowledged by each @@ -621,7 +650,7 @@ More information at: http://dx.doi.org/10.1109/JSAC.2002.807336 BIC ^^^ - +BIC (class :cpp:class:`TcpBic`) is a predecessor of TCP CUBIC. In TCP BIC the congestion control problem is viewed as a search problem. Taking as a starting point the current window value and as a target point the last maximum window value @@ -1047,6 +1076,7 @@ The following enum represents the mode of ECN: The following are some important ECN parameters: :: + // ECN parameters EcnMode_t m_ecnMode {ClassicEcn}; //!< ECN mode UseEcn_t m_useEcn {Off}; //!< Socket ECN capability @@ -1313,10 +1343,12 @@ implementation of Linux kernel 4.4.0 using ns-3 Direct Code Execution (DCE). DCE is a framework which allows the users to run kernel space protocol inside ns-3 without changing the source code. -In this validation, cwnd traces of DCE Linux Reno was compared to ns-3 Linux Reno -and NewReno for delayed acknowledgement of 1 segment. And it was observed that -cwnd traces for ns-3 Linux Reno was closely overlapping with DCE Linux Reno whereas -for ns-3 NewReno there was deviation in congestion avoidance phase. +In this validation, cwnd traces of DCE Linux ``reno`` were compared to those of +ns-3 Linux Reno and NewReno for a delayed acknowledgement configuration of 1 +segment (in the ns-3 implementation; Linux does not allow direct configuration +of this setting). It can be observed that cwnd traces for ns-3 Linux Reno are +closely overlapping with DCE ``reno``, while +for ns-3 NewReno there was deviation in the congestion avoidance phase. .. _fig-dce-Linux-reno-vs-ns3-linux-reno: @@ -1335,7 +1367,7 @@ for ns-3 NewReno there was deviation in congestion avoidance phase. DCE Linux Reno vs. ns-3 Linux Reno The difference in the cwnd in the early stage of this flow is because of the -way cwnd are plotted. As ns-3 provides a trace source for cwnd, an ns-3 Linux +way cwnd is plotted. As ns-3 provides a trace source for cwnd, an ns-3 Linux Reno cwnd simple is obtained every time the cwnd value changes, whereas for DCE Linux Reno, the kernel does not have a corresponding trace source. Instead, we use the "ss" command of the Linux kernel to obtain @@ -1380,6 +1412,38 @@ sensitivity to RTT (and can be reproduced using the Linux implementation). DCTCP throughput for 80ms/50Mbps bottleneck, 1ms CE threshold +Similar to DCTCP, TCP CUBIC has been tested against the Linux kernel version +4.4 implementation. Figure :ref:`fig-cubic-50ms-50mbps-tcp-cwnd-no-ecn` +compares the congestion window evolution between ns-3 and Linux for a single +flow operating over a 50 Mbps link with 50 ms base RTT and the CoDel AQM. +Some differences can be observed between the peak of slow start window +growth (ns-3 exits slow start earlier due to its HyStart implementation), +and the window growth is a bit out-of-sync (likely due to different +implementations of the algorithm), but the cubic concave/convex window +pattern, and the signs of TCP CUBIC fast convergence algorithm +(alternating patterns of cubic and concave window growth) can be observed. +The |ns3| congestion window is maintained in bytes (unlike Linux which uses +segments) but has been normalized to segments for these plots. +Figure :ref:`fig-cubic-50ms-50mbps-tcp-cwnd-ecn` displays the outcome of +a similar scenario but with ECN enabled throughout. + +.. _fig-cubic-50ms-50mbps-tcp-cwnd-no-ecn: + +.. figure:: figures/cubic-50ms-50mbps-tcp-cwnd-no-ecn.* + :scale: 80 % + :align: center + + CUBIC cwnd evolution for 50ms/50Mbps bottleneck, no ECN + +.. _fig-cubic-50ms-50mbps-tcp-cwnd-ecn: + +.. figure:: figures/cubic-50ms-50mbps-tcp-cwnd-ecn.* + :scale: 80 % + :align: center + + CUBIC cwnd evolution for 50ms/50Mbps bottleneck, with ECN + + Writing a new congestion control algorithm ++++++++++++++++++++++++++++++++++++++++++