inet/0000755000175000017500000000000011665101052011266 5ustar dreibhdreibhinet/doc/0000775000175000017500000000000011665100760012042 5ustar dreibhdreibhinet/doc/src/0000775000175000017500000000000011665100760012631 5ustar dreibhdreibhinet/doc/src/tcp/0000775000175000017500000000000011665100760013417 5ustar dreibhdreibhinet/doc/src/tcp/plove-rttplot.png0000664000175000017500000003672011665100760016770 0ustar dreibhdreibhPNG  IHDRp# IDATx{$w] ɐd2L rP۪ uw#EWDQY~[N| *rU&BHuIK\uI0 @ͅ\方dէO>}[z>NNtW~̛{$kJ<5i|z䑭AR5>oKRnsYZI6˕[IZlKkFf%,SQk$~N_(sL[~pOnWM%I>)jN4tF)n:kRk5qtzNF >|Oٚ C#>g˯9M6tWgoL#y[~N<߸OkgPֲ9hY*v71(ƚw*dR㋇D{ `(g{D]mV(ն-nt>oIy|)g/>q~|mڴm-EҖ$elkU,oNuۮojv|ÒvԶmںM{y=t].; dz\- {#{$ֱI5jm+͕VfZ-C+ٱc7{/|}%Ldox|Csı졣Te\YjLJ6lڲ]]IO>tرg~} IiJL'u$ن%FْZb"5nwc-0xTF+VEr}&M,M[U$keQ82IdsNDRf$eǏ$=ı$ ͭҶd&RyL4N]}ޟ|q{mnM!uj__=g=i߽gJG<8o.m?w?z?INurU'VlZjjLʵ471M mI{m6<ْLJv˦-[6mv"a?Relq(ŷ*uo$F&6L_u۷|ˁ?[oے85kb#]?}υ'?hw ؜:y7r,/fl,ga~f۶jNf6͔6˕6Jm]rkUeD6?5[-lv{_QܹV*ϔw=3cs)-f>ҽsvG(VǝO{#>_vܙ^3ztݾ5t+݇[ɷo>] o#.~l%O^?}y{ϐuVٶI,YVZERd;=1fV**pB18iDTHIWWVSq"+^b1{_'$ceDZu~f$m&)-iiL,XI+<(zc-O^ ŝFJl\}ֳI7n7l܃KO-o;_v?o#ʯo}ھ5Nsm_m;S?PvՖZmr+[S+.6666V)LjLvƛ '"48%-%msU~wkٝ}~162yTgXD #$II5Z>6JLqĒ"Z;R3Nz7a_ub7$ecw`Dr$O\qé_,ŷ=|a$<{qڏ#_-9z#Έ|=η +|T;YnE =nWhKm"d?hgj6dV2R$c;}L.csU,3J84j"xDyzӃϬrI8 ĉ$9'Εswo|4˿_XzScdl1Z ͶmőVGH&ɋҥLV8 \̮h;iD$Ƭ,Im5m$2 ~ſ?+l"k2iռY֒$6-ږ*D51$)Iy}/x=YO7|c9I-+(]?B=ߟѻL#F)?7Y>+[$}[3o?㾣[7ϖltj>( F'n7Ͼٿdz(n?忥y[WL璥G\|m ?+wC̞cO/|K7W/8n/(Z0riZm)j 5E]K5i4Sֹ`[Dn|sRRf-\I"i/ls!)65yE݉*\ $t8}W$FmcZ2mU*MM4SY[ 3DV-V(.nu*##zln۶ҶVkզRe؜Xn۩NI\RQ@_3NQT,ˎ;,)2F8}zzoM;/zb~4՗'^ο,hm}d` QCH:ՌbcLIlQ&#,RjԖiYrʔJ[6key+UVϪ2DcvLlĉdMeҖҖکmi;ky/&Ҷj$jKj˴<)6Jv2b׭e3ffkߧ3Irz%`wu1ٖ816F8]fUfM;ifTj;ly0?yn{6^j*N$#c͍be&l6ij,mcm .zQ1om;+_/ϔǹUι~:ϴtude}ƿb<9y']yΥWݽJʘXdd2Fyer6m_|n.eƉwWo}uwXcr),ɳY+b2sWa)e]mfq۶$l9WnbA[l<=24 Ne!?u߃?z4rkgWU_>MpvGN^}s\:ʞ[nV=l=|U-KI/^Z]~)^ma~sG760TJbŅ2l9ZҞ[TmQ(kukO=zRRl)f7H$v2?'bݎ+r(5Фǜ5$ŽGqfM(RS乊 sȨmKEZt>wMϽ׽wde-3fh Dw_a.pp:Ì~)6ާ 3OXqOKg>WlLScמz{uCbvL){}ӛ:״-ڿ}~)]nO3YM0\6Dav=ch6[k1lfĉ 8 ֡;/ˮ)9M7Pl=qr-<쳟c)3K\%ݱtwoF:tCJn$sOqK_<ѤG(LYw[kc cڱC7a ^ߟstZڦo-W4;xg>󙒾/g3U5}/kTbM_uzkKM7;x;/vMǫ#)iDIc.(،{C]}3/e"{Uy}?wMvS8xnO?YEmٶSz"~mc6wCFUw'Ro8]O7h?i^|]5?.e\$i̩¡'۱kϕW^->+U|` 6 = ~zb'rhAƨ;٦$IzI/z|߶yJѮ]W^n>1KLkTR9X߶#W9]DR~O'^xkkqhcN.2h\qi<=c[Oapn|98Gۍg3燐/%ϟ%?,>~ƞ~Íݞ^74љn{zJ槫kWomWoqp~jC?~"`m=OjzJyg?r'BC;??_Ŀ~c&J:}DM }[o,z|??u@=LzMywSO_xos9owoco]ʗsŹI;?][EOO(˔Jy5}妏oa33.v%gJJv.?xǾc\oɃ:v$K+I6+6^} @=lͿ?`F|E=l-yjnڢ&t͹;?S3,ofnܝ$Zzz64F{?xIaݱk xgn>p_~zz$qÜ͑<UZ7??'}{Wz& jWoXwQ9qc|(nG?fC>})a|_iN@5ʩ{{as1n@w\=*m}7?0΂@muy]@MX۽I5@mP[tVuǙ7۳+2ڿoפZ;~OF{Br`ys_qzzyjnڢ-yjnJ$qu:j¬ֈj-yjnڪɅhʎ]as`+Z|+yТk| n֣ӣ6hEcמC7^ 9ڿo"ψx֤4MӤJ<ڵݗ~𬷓fL恎xu?434T;˚ap lc[ޱkψ#Zw bpy .ώaI%DjR tYo/8G?fÕp5Y׈nd)ýkz;JPBi>lF{җa̞G A=.BE[b>kpʛ.a[b}Voym60ihמMue2"ezgaRDlf@]#?~KfiSfzVboQ8z6iÇ=q8Sw~,? .SXo zk:}7 ճw=DƙU8VR写zjLiM!x[ଷnyޖ݆rVVƴ>fV=f[ ֤&>V=vRS}>6O1TMgB8rX-"np޴11>lֽ;D6biL*߿oDA?f)iq^q{IDATzz; n]>m.)ٹ|osw>NV pzA9no%bIms ,z+>K_@']t߱kO1`|BБ߭^w>([}jJ#II1>#[A:}@5Gn?"k<Z:tËTxjjV/F~P>#[A:}@5Gn?"k<)FȘ _:tË##ܺ|և=,IyT4s5sO gS/OX3ORɓUwv.[Z㰥T o=B]6hi,H3EK>jZ]w+AWC=j~A- zX5 -`j>#[A:З TxjjV/F~P>#[A:}@5Gn?"kAq3=z+"|3uڨihi-HKKi&כZ=t }?"k|- zڨihi-HKT]B_A:}@5_0^6ja)ZZG R >kU'8,ןj/yGM:fRi@";tx5jPW- :E~yKREhcaAZ -連K:tËM=?|, zXX.H3EKkj^vڳcמa4Y(݆S({xѦ^>gj埢^_55zkqF+XH{}:"[A:}ࠛ~zP,*/e]<}HBFaw37/v3- :E~?r7M(#[A:}0Q[Shm,ҚYfk^TM0BЅ?tA/Ë/T0^6hi,H3EK5ycTߗgFBE~5Qz[]RñEhĉ4St^󚭚_9#Ƀi9?tN=-v,oO]SqK]e57޾I7E5GViPE~y3{״J?r'K5tCYa JPyGx{xs-q:LjNJi4jj!4$;ú6YzLJ|x5%&} Ofθ{PͣP1_C(} -uܖ.B3CA3 iN%~S`h}w*>!`Ok՘~|N5.5DT>[Βh%#fQ֔kiY)etӹYb3Vjطrtf`.hSQռ[eq~GSMʷh즞/hhس=@j>_ dĉ̻?< ۰YۑOjLҩX+Qj^ κwkek̖Vp0%}yݟ6xltqZ:˼C5_a[9 pFU(tO=t653i3gnlJ@5}TS>΢=̨yMam =@e:T3R2 f}ѳ]}WÏg0$D^4g- }/P/6!wO5-O2{F)ӟQIWZ6S@5_t#MmXWVsj ?tyަ~zAUp034sr߹O-Y:@.2fre͸;,g'l+3!?fG5 Ƭ)'=\8o zkаk :N'jiƘSeKݮZ \ 1 zF֔P>A-qb杺vFtf6і[Z凧ۖn~sAWc%;Ց۝m\l'Ȉe~R>|FgkK+vo?|&žթ/b}Xܰ7˿oBag@t+Vi+[Û`3G{a)Po.j1ŀ4D ,qߘ&V1WI[:gT_qKy'Jц=*鳢=NưjC *mFkiQ!WZZY3om:cKݾyFۃԐ3 BЕ0~1;k wkJ{<M}[:i宫yn'gYf]ųk@z |YЀnêڟӕ2#^w>KٍkGPZ}>ѧ'ߡËTRs;ljj ΢<9·#ϑpeԛ7|W%nyޓS#CA]#q 6݀nqN5&{8?\޶VR+)- ۋj~^=R|pڂtA)ZZGAjj &}?)cj/|z8 Y.H3EK(RWɀn> %?'[/P(=y:? }@J~/F~P͗ATv@7{^w>/S)|(jj ՗>w("kռ(PW-W,-!ZVA#>/ͬrGKC_ T^R~ز !FB4PtAj>H[?uR;tx5jd҅3B.H3URc2HPE~ZU zg< M7s3OR;tx5;bd-w?wIґ{B5?tlԂvߡËTebg<`FTUz@jg|w("k| (e}|R;tx5j~JQW;EՁ }@J~/F~P͏kR0#JS{rD0HPE~Qw ^w>(߱kaHş>rd9ʬɃ:z$+{J{YLJ> %CA]#g-}anue0;tx5;U}bxUGi >$!?owzoMyNZ Z|Q*F~tx5A7?ls}<.3w+A]#c{7wG{<1V/F~,Yyc6?}@G~tx5`y*xϨn?"k<<#WV2Fc\s5`n?"k.a9KR|^=y*x@(7_tw+A]#f+ :E~VTQW- :E~yg }@G~tx5 jE5΢Wg[;gNs }@G~tx5 j~}ͥR=zyTV/F~Gd$kխ=,II<A?cwIґr(} v@A~tx5jPW- :E~y#TU }@G~tx5jPW- :E~]PwPwNR͏! :E~y#TU }@G~tx5jPW- :E~y :E~y#TU }@G~tx5jPW- :E~y#TU }@G~tx5jPW- :E~y0-o$;pjnI:rVBBБ߭^w>#TU }@G~tx5jPW- :E~y#TU }@G~tx5j_[Ykd|/ :E~cv3=fԬɃjכO5w+A]#|BБ߭^w>#TU }@G~tx5jPW- :E~y#WFX{q#[A:}^5:Ub5)✸=aa=E7@m~vRnt[^ n?"kA"Y:Tt-b<E7@moNnbw˟nڢ-yjnڢw;v x\awPO$+YA<2_Պ@+[,x˿ۡ+ !0 =a_ Vuj7PW: ,6\lJL/ J~̂n~\\aɻz:"*>˿b5̡K^tîzX(O\@^t>/ XEd`b|'XkpBTow;-yjnڢ/)@Y:?nny7}nQ8ns/㜋ws1xMt=\ƿdWzXi@mP[t<E7@mig?xĶμUM\.=ƶ$_n}d~L[N<Ŭ1Sxh+i3S0y03ERͫo* V\km)>d*z]Z'dsXRxr8;3x;>Udv)uf&.SttgH tK%ͩѐOifm[ycNQfsdsoKd$Sa6nu{ZETlΜ*QEKDA|u&P\EQ[IENDB`inet/doc/src/tcp/Makefile0000664000175000017500000000006511665100760015060 0ustar dreibhdreibhall: doxygen doxyfile cp *.png ../../tcp-tutorial inet/doc/src/tcp/syn-anim.png0000664000175000017500000005706411665100760015674 0ustar dreibhdreibhPNG  IHDR ر IDATxy|չ?ϙEݎ,!@XRl-z[v.-(-Go -)!$&ocˋY1@o?lĬB(|C5UWa -h9‘EB&ò̒> j0 C>l8V`6r$ 0UQ( d Zɘ00@gdW"@r0 L62tduE Մ0P$@CAaZ8 !ؙ-lp dIHBl1h( fR nMB!uC0C&` iZMf~]ư5Tׁy* ٩ $5Bƹ \BۭL1=5?Y!0 } Bqc>tǭ WE@Z(L8xҜYB0&gNjaˆ!KH ` P{Eu1Wc ` KQI v2B{3W Y!.@$Kz@6"ihx$H{( !Ca &`-1n "7.AT _<ϖՖMw}߬ ԋ!0 92\B{st9L"CU!8YHB0!qS$Pej-W`\0[>2d)*) !3BI0$Hu$Eo;T[x4@rʔ x ڽoMB[O 4]ht!L &tSyM3RRLQD'~ M&t]5@] C ID^S ¡@f I x__xdfs c~_B;75o^L"G Y@j iB74088 cus&e ) Hiqk\ׄ #Χ?_t?zIST 1 ^~<b,,~o݁#f8lkűNs>*,{{~H["KyȨ'$xZ>~.5A/+k7zB2n` IAC?̀C3EXBFdp7YAuܩdˍ C C6/(8G0-`]m"_0L$wq]gsSe[kS@%N>lWn1z_sw~ݻv{%kvXd7\7gZ.o-#x'#O۽杗B$xKfNS*s~דQ'?@PMn0a00 !tB?&B!BF]HЃ\DP~G^i0 +<hBp pk`*™<CRx I& ˡvg҆< `>9oU;Y)LLLJ*aYTr0w[K4 Y+oo̮J銻 ˁ_͜&{}Θ8d<$d2_PuȀB@$:2& u/$:Wc ^"AOւ-|LkC.^(IB 0,f袅B p(&T d@"ɐeP%K2@\u{B}< C?2])?]NY>;ZOU@fyZTz[COcVhtlo,424Wetl|0쳝֛kvk'}fKmhlصU͸6=s ڹ?vBHBMa  c֕222SbcF" b qf1t @`B0!ZnXJK$L& & ]0dA8Z4IfPupd Buty-Z׿S> *Ӛ6T%\փ;vοOOEfZ݀kd kee~X8)w|˝*Wد6mgsGAmCǞƌe1݄Y9Z~,4nS[IH IH7B `&Bw000&880MC0 )ݙaJ .D95'ח]k[-y wz+ "c=/<O=Ñx['&*[ˣ>|"w$k%@3DP"=N 69Cb 5ZIIq*gC 6&P0I5=k-o,@Ī߽EUkv|4i c ~(Vxp`p;0:01AfBb$EQl٩y[ Y @Ϊb܎^QY[g؃W+,._j) -ux/y+XK6gʾ8m9(N8p:nC r#t{QV[U,Tޒz# $Y< q@0 aXC[a2B:ǐBaFhAW/Z [oBs1@-I! LOߍ%ՄS`/(-xae֬Yk^' ` LZ{__%|޼HۋtY }E)p+i|tS?]R3x+~ț<_\h}y'a 6{wSx[RXOBREJsf AE%lS0+)a0anu*-?p%bt!&(|>&)ܼ'?pStCDT  @aD*9dƘ̄Ȳ ! )JU.d_Yu=sP\nxGcϗo^ߎ,1,WY_|_rƜebtCW~X8BP?{X ߮+wZDiU7a4?ޤn1g}[RU(`tc3L52i_38Θ `! )upeXHP@ b l ˲$D~؏!8.:Cw|Z@0 ajQ綺UP9-S<DY e3`F¦R@a|3 +'lݾPsč,!dӇsPdL00 L8Lh4MzѵCl|!:@<*ZQ,Iyd$* C:Lp蚡^?Տv vt^4mnBHi]' &AVG`l0„,D(H(A) On?-w0˫&pUqxٜ{JipAg zH1.6 \&3 @;kHq!@Y@#YgL00e0uMa0a`5\e a!B5~d\@Y;<c=/g5pfeneI\ !$9?|.w]qc233!`\H4MYrp~5B*~xCUq&sYb `”ɸ) nܔLgEp>Yb09)+PM'gڥU0co!/,\zΐ%\zI} M0ŎջZ<x 1Bc_1B;ğ +++?u8#z`1qQ)Y/$ҰC-w5zh~駟~;?Ok֬_zWnbob`kK{:#$+BX巴V`H2<Ğ&=nGi_{B>iӦE|ɷz[oy_2ގ"G+jl%Enh}!_5SBHURԱ.Зaz8K/g?YgggggM7/[oK.g 2ub=wtݨi &I!t~ꊹ"Im?% KQO`I ]]]-ZzU.䒃6Bqq5M=zG $W`7bT=5Z8[ˆCbKJ_25i%z kMHu_uam]qVxd-<xw׮]{M7-\s\ӒQl٭}+j̛jߙEpcK z[=PT d*u_0&wk`.uֽ;k֬?=cpt !dt_NFLtG&B2VbFJ,,k֬i=ͥۻ&F` Gݼ/6m(*r-B`AzlqW[#qⵘָ4g"&d%L܉߻9 {qz1 +!قF!$>0]N5MƩ*3떽R'!S- 0lqUs(^O#B{~t~z|D!$8=@!q# F$&nn+CB!mJ6v5sB!a+xbjA!$X&B!Q EB!}Ӫv6ӑ 2-7sK*-qU&f2D$TN~ɘ!d&BؿwvXqn=qŒ/-Vm"M]7"]Tܢưd2q$lu'RCՔe7ӵ 4B dõWc_-Am^BlM m ' t&J#Dm֣-vdql'(*v9'hCq9٧4J}U?ĨI# c.dWf:Rd!▓|E4{|C'8{ǹ&b8ќ̹b 5#mcK ƙLsvV"giGbb~Ԩ%ÉmM>A!آR.n%FyY-~-!dGM=x4“,6[]!#U2o`Ŏg !$3iBϋG+IRI91ȴEHY?D|3&=iTm3MV Sz !dk&B2NA?!P}+צ.BN89ķu$օBHFx%SM!FuGsϏ[N6ݗBHJf$^J!4BI VDwugiD!$>BA!$>2UQOB+<*HP g  bCBA#wƪ+. K !,s,xrkf_3B'?1iۢ~B!!% X}}$oz !$%ck(BBHr(BBHtu*\0c˙Q__՚FB) HX+*D$c{i!$6<Ľ4ڕBrOr2Y'VB9ُIFSj"ƐCLx?D$A!eX&;ncQ$!(UczB5A!d5ՄBBH|CK1w2 WJo :(8)92/mhjdt L_'W^{W^=c " 3I82{{zZg!uG~{S~cT]]{6\q7׮JᆛV+EBrڱc/. & eй-HpJ !^}=]??soJa!4Mk/YG_^g{[_fQW27C" ], f"|dpX:2Epnd<{Oq_߯]G_6* r8%]\& |^. IiEt~ܹvmܸs~~ DT+S?!$b|P` a5قdpJB-Q}& V?{8T躺mmx' ֿԣ2%+,4( %C nz^|a5}Syq<]w:3ό\E9(tKn0$XM zWO8iVf8+,YSw뮻SO2h,S|g;jk:2Ieǿ* ;;VȲs yÆgy޼^{IUUU@v%$2 9<& <9M' aH$<=,>ȴV?Ci?_Z>Ovgb2uww֦sBRl9-~ѫ ]`"O:6H/2YhU>˗ljji&YFO۷l/~1ݟb{8JfD K> ](NK͓1o)RYYi+X=",cyOOϖ-[ŋsBR!wܥH&&Ρ&`պ . B t:3WO}jѢE7ox<2dYƺjҥ\ABHPnokvPH`p(z$7mI)N2bϟZB2]@ X!}Ơ!1x7yJpBdC$d7;x@sGm%Zi;soD! P?ȚZ{N Rѡ*d>m(NQʨ 8kZ:BHn˽)֖->lJJʎYr zzhT9USt׶#?}u >j}}B96Q1CӴ]m;>Դp*w-.--TI@0;~xykS׽!{fd&!SVMTL947o~{kkw{{k{:]yE5 CC;ʊ(ʬ9j]y%5N,E:oo{G eVg}Aȱtƛ0\[^z-v{)jf Z.ҡCMN#. Zo_KwSOiYՌ5icO[B2PMT8 PT9 liǡ=,;]ŋ,> lILqBrr@EEZ ﴵuj}[[-+ΓW.(?x`@AAQAAէODC@rLNNTڹwwH~ 8kkm /t@ :Q1#[ps=Mooo:B~EqLVSׁS /8ٽ{-;S])BHFՉ)Ug`> !$ {&#,X9?$jP$72zb!&ɈBBZNNTB0&XWIݬܓ+`bdk)ND6':Smb1+ތ!oNTL9Xj d2r2sQz"YDA̔Iuy<&B AHމSr$z !ɚ8 B2MNTZC$%ЩBA uIzBBA&~ NT@ qˎ-Q"KuUa?~5K'*"Y8S $-j2`B@ľDF! L#~Dm+T!& B&ZdWOTL!`OGIxPM( $y ;)AY!#J{`frCA=6X^TIm?OY'AHw9D*K(VI!DiX,F!֙{ gSDK_+U9E?B,CbCDN~ǐC-"D%! !V>փJR?D.> 2udZlD22BC $eflɻR;(H\!XB}$d`ÔBcrMTAW$6PxHTeV BM$Qސ!(MLE2*)rE}$Pސh,Sщdܸt '&rtWP(Mqi(6d>!rS[MF![P"q҈fkwҘu](*b7Ilj jZd3kkk'~$c|G Yr%Ҳw?`[sݽ~k>>r:Y\y+VLxĘooؐu(ڴi|ܸEUFtsq] y^˸2[`?>i[;/TUYbK/ƽOMLYr婧Os歹z&R( .T:}NWoϿ𷣗,ϛ7&wD___/)$d)!^x᷿w5'NeCb5e.W{z*j^JY3DU> 2ҥVȐO綾^EU}? oZV7kSB4K~Y9E+j s~񙣦=̾O~[mϿƢu1ni}=DRM޿[&S@S|vW׳Bn<ԩM^R:c#[:އkiln+dQ3wg ^z(60D$x)Kx, zso?L!l4~C5L/|@3_s#J\]~'նty{A@Q3(&lz:t}(F* Κ ?̋ߴjB*sﶽ _9e7<6FNBly+Gtg,!ikCNƣZRe꣑bJʾ ʿ-5(s)ݶ΁;.4 H*tnpQ䔻毷'v[ݛ_{ ~׶ɿC{G)f=t"ľPwk&}(K+xW g`]v_]^cZ䔭?:¨/4vjK!7i/Ě?^xOo6ݻ=΂{.:UfǣZֆiDc}lf⌺%j&6X2jB9Ĕ\|>}I>v}pɁk>}m<~Pf/wL{o<~ƮB]<ꊽԟ^+(,_f\d1b"IX3Qw-&Q+ g7ƚ{S6gz}~g?Ř6{liyc{它JLvk{d{y 2!&ntΙpvT~$QT+5EapEz;$- y[}JfVj_ņ‚N jEQLo ɴT=vQm}uR8F{Su!sXG 8Cdǜ M3"E1C%:@DyRɄ|d?) q㎪'@9TigU sCԸ뛲ŕT30dD¬Äd;VTx}Jy{B?h4⒨ދqG?5e>'Ti4P$)dlj~#rgBO+R ,d.ɦ7iWNO#U9E $z+PUk</_}y_~,jiG9E58gunýc=?|pѢdoFe~CC(qcskc!OwG۷UUVVUWϙ=̳u5(eIQOd<(Q3E-OƢEN[ZZ@IDAT&P&G;QLC14. SY~}m)Nd!rĈ}WRpC䂨 F,K3řdjښ= '2*le"ًD"+MF(NY M '2 Yftw~f0g '2Yc0J)Na&ss$dާ8FCd9Q~&tDQH !2}HeBx81(P CʼnIC9DIW!Q23ܐ N;ƆL@9Ȃ W @zH3CD)㰷|UNQ dr 'RLmcCb;v<Z%a@D : N B!īkj\"$3č jlCL` C . :Gi "pﭫ+D{[ISؐQRCdbK`P1.ǡh.`0BWKtv4vg밚Z{N Rѡ*d>m(NQJ 8N+\}`P`@AiH@[ toh[4n+));fY<G 9iV\STN y`_Ʒ˃-tW`˫GB&C66P4hW[Ç5565w8|8sKk*kKKg1U: ~o#{^=u3NN#Lnl9Dssv6@ӕ@QT0Yi9m֕̚WRSY[ZZtPTvzQ3g.([qBo462c[1ywKc.Xxd-/{ޖCUV3Lby˲tPSH-,)--+-((--./)s ¼<SZV5cFM>$!$զ`c!^~ 0#O+p4MYwu击;>ؾq6>kir zÕ(r.dQ~Wz>$!$rcjj}j,+S8_ws:]ť5v0MSQT{ f $ `En_o[0s:3w|!dD؀Cp9\ ĩ:j^s]};q%N}燛1w .ihmk/P7Ls'9>W.IR.sOJӧ$ 56DLKo۾AOOp\%eeeV2i-**vPS^Uqj`uGǡ=w={`&ֽgppv` ,Z8ԕ'BƊ"V`Kx >*-(Z,EVeE2 nWee]Yi5pzg}M͜5WgCsjUt{wE;dB2 E3 !&DrpUPʖWJa_PrpٵnV"Z`S֗Y9'Y5d!@ a $IٙЙt2SSzz&t?CD}Ъ!4#甍ɧߜ=ס(Rkۙqq 7nLxQ'*@V|8FM23x晖.>{3..fKɹfNKA !WCyduuǾ?%H8q2yJ||Zh=7,^{e/ё=kF,7QA5D?ml9hSSƌ*I{|$y5n>fKHL4)ҵ91;E C1r7ػ𥳐_zo`=aFɬ#O<{2bDOn9(Q_ :fϺ@]C_H{wÑ>iҔAEnv6QaAnaAnk_tP}n}Q-\_,C5edd?o&jh8qS)NQ k5=F "X15eYDDXgYxEPC ADd5AEESĝڠbjl-/a݁y,=Ҭ²EEEZYxܷ+2'#Y;mì^&ShAÖ(&8A4p.;`|"S"[B eDDW s>JDD8Ad&Ǣf9 ^QQJz5QTUU08pn*OEEE=E!WXCEGSS,))1X=̟?_SNDOx NѣG9pMƙUCzihhf졥E$mA$I?}>UQ~L7\?@sssJ+D 믿j*t>u*6x̓]gnݺiӦUWWx<(2f Ad>+Vؾ}%K\.W`'+tēO>}vk׮ݳgOPnwDX%۷{ڽ{Nj%^իWiKVXQYY9c '8QLUBmm]wv 'k;uuu>0|xW"I辳sNY?挟uc_ YF҃ P(bZÇϿv猟Gϟww]oynDYVdY{//2cT&O޵`yRR?۔v-[vȑ%q,AfCcGW~a{{i!5=ů<9zuVfx>9.n$SYt;OϺ:GL$&&pcn{׮]k֬vuL8 <(&H~cse$/ܼ"=P~ ˊXuu#%lPRR+z21R]]]}=xyU<(@ק(~OH;xu[/())Y~}JJR^YkWƉ7nwW`zP dPL|zY@P_p($I:p@ ,QEU_,5={|Lff}dB|2YVY[g/Qছnک% 5Q566.5s^PzO~_;K ܧ$OWeœg{N(TlܡًԴ+FKZۚO};;z'_/HWdYV|rɿ[(W~ݗC&YSKN[:{$|*^Uּ UIwȫFHK8*xٯ(~kZO SZDQr)Ig4JBb¸pVîqZx3*t{}Q)wD3` DoEHt_{?OIO5{ϙ^@@qbVřy. 35aIIIYY:@sɅN*̟ubmM\y}o ޓ\&`5Q\.Ltرv\ h=Ȳ%Lqj/zO裏Ǔaj !$^M4x<|,jwr⏋ KŚk֬ѲE2 1yΝ;,|YQdE\'~]NK>jJg~wp:O=TGGG^ YkXnݺ?O/9@-N>I-}I8OKv-{{מqu[/=4>!3'~qo]og˹F/rzzh:8AeZϧN:mÆ =W ,\Psb_tXRVV6a5> />rpl۶mnE>` AMA"͘1gՖmZ%~LE$'x?N'lذaўnXCOUlQVVOXpo[[@!VjժyشiSnn~Pb05E2En ydmzΝ[RRp8IOmڤGZbŋC;08 e"q8҃wRSShRSSЪǏНރ'f*T6O4hegg;ᆱ-((Ж;-IкmHgggOŁ(¼<3_Y]5`DXt)G}^,q݁j5ѣnjrrrƥDqĉ6`ٲeR8A5+WXhQqqԩSC~G/4|hrٳu~Ś( CESyyy~~~UUt:KGdm!322&Mdz4D kH&""}!Hk""(vihె QEEE555D{k}oDDϬM'$ZADT ba:b`rݧnQį!T90t;G-miCD^SM4=Ls2Y(\L 6%P@LI !Pl0`pnξ}޽^vWٲN3v~?~wy3NP\dehsDe475Z $cBql[Xdeέ{:ۣZ$'wA^@a(3"o|=~cɲ! ]qo8dA&3iDPPET+ͦ\Up]ܼ|cSLE ; ̜T,I""b5r 4_%Iʦ]6#{CS7ŅO ܬ}O?itp_'q!5 _^m̪Knu; H'dF|hNO?bP`ȯʊҬծ4w/]uWbŅ{:t8לS/d?G?1C4$lo>pg/|w@)Jr NڻW?{SƖ};V5nohS_ҝ{]T̾|MK~S4tKgL.qsg7[5z?túeSO=\5g6vh!+fm5LI RHkG7O}?ui*SE544[Z`(zGh pȹ>ӯʊ+`AKs1d~;0,cg}iɂQj\>uȝ v:ƭL,Um o 66 B^8?#,+$)d%&+(J#Sno-;UXk6$MзT{((${E1e;ext9\zrؑӃCgu Mc'8Ek({#?Y~oGxEcf4u⿍;1?{Kf>m%e;*'2<)"1yַ!Q;vhř5}ְ~G2iTV]p+N;/~G0b@_6m_1$9,}e,{o[ٳgc3{p踓vVضnzPaGWn,\mxgwxHT𒕍i5LqbY^zT=k~u9k6gci.E}RryC #9J46x7-[}{H߼ر n`XAhޔ̔#C-9]>Us{ Jr7tG@џn 狲7PEfe=Z)D>#H( + x<ɉy[ڻV ,tdaڰ>U>Q q+_@ɵg \tkGU;ZKuҚo_3/~62vWZu^~{A,r#\xۅ;C:tևڢV(^h,ظ[*8RCwhfvaW\uws|ͱ̠wS }/qmk`Y#~DŽxqb寸1>0iLVۜgYr9wO>^k5j⤣K~ |. _٨?{%S="5WN9Tj;~l`>jshJޯtG%-Bشs5]ܳN6no?$I%YVEx=b$Pr^HT2$Z-_Oy~Q{e o2>&)  :Y,\Kgeٷ}@Gy\?n٦+&)cO:}/;_wڵkrkX~ݸ?oj/n?~;o=J<儻-SW58uV 0p_}͟޿lrzsg^zw$| PHhfgU˧NtwfSyY'C,&S ,{#xcj}C}jgs5՛W`9O_4eyRum yE(hS_^}c[~wgwsݴr!EԓWO>Uכ;ʬGC޺-2r -|`y.m r}cJgw+JRL1IVȊI]PL;8o+Jy n2o"iF"27Rۻۊ $I>bP9yWewK ".ߊI#* 0Wཧ~[=1%#vwwIʞ]y{S*oSVY?>~ʕ_O;Ɖ3OIJkGl9w@lݺYW>;v(.2?(e.:yЃ-芉RZ[[F7JK~c£ [x {VTjk?H[a˷̙3|Ǯ8vpp0'P]]ݧ\!{yWK,]tҬO8}\}}`A]]rޖy`nNaq,Xp)_}cU+WqERRw|Sϼa򜟨PUU+M=}71]tb?UŋY;^6 >3g.l,v)pFD[#g$,R0rǝ?_<;;; J0紙sN;h"EZ}~u+Y_(fy3}VT?аJIn4稜biWPshd_+PG - 0VmSǎ5m0~߁O>伛/>@qiaGC;,r48=Ƽ1I+$GcbJ# (bJT1Ibr3$/*-/)\y7g~eE"?Ʃp,+m^ ʺ3=;:; ɽv͖J-{쯟wmϺnYw]5V-%%%xpjGfzSO=5l``ljܣ(xT)ѣGII+V ך-*$+kײ,5#wW_}h /omkO=g}vҨˋb1Y:|05~W!^~}! +;&)ZBm7ܽkoرc/8VWi7o|ǝX 5{8L-%>v''\'sb|€`Ռ~?g$5 ĉKUKfvw]O^1(mW;͛[~V2 UF"A{SQ~꿟G0j7|]ey2I/D)j ְ]9ZVutKP=L9<[;dEdEeI$YrLH"+J#*}>o L13$K=kb]RW^9ᦖHTz=,o}`؀RC6m@c#{z+"A,_wo1O\/Ysؽo~c{]MݣGz$,=o'\W;}6pˆ#ុvy|_6>{}wٺ Vr:::$t幷h1PW95)`ߎU=ǣF3g?Bqih_,?aŧOOɏ}fܳp#{;wrtu9ǔm&#(p–Ҙ$pp{9?s >ޑ E #&q˪=A$eQ=؊</^<~Ĵ;.ضc;"W>2kV^۳?{9zHE-ݽ{m綴}~R,;2{Cڵk_zݫ{ťKu͔aXP0jԨQI*9w^2?أQV8II<;Isv),YCֶ0dYo\Z6oUE?'>߭oϚPl?:l_Qt}+JlٲR&:CGdsv7׵QKѳmE_W Gmv{aЁd5_-Nj੿?6|\^ 3ZX1֦p/iIJ4&XMz:NYIRAQA9x@@3<>w-sCNDDHӢ1ݳvdW$%ԦxDQ4G1C] PQ⧮|3o-8B )s}\W];.Gf,>Y4e25{bѕKx7ҋ6~z릦fLjnwu{X /]uScݡnRQڦ~gM[a; <8&`R}ڨ{/]wyq#gݲ>2+v(+1IjKחkH6׵oݾk)E[n?ÏOͳ4u>_P^xra_]v٥o.2oͶGa{{t5;_{ӭ֌=~\ Oǿ;i%#bV>>܋_|yƜ--ZG2>ko|?|jWutvyw5SaU:o:vL@7装w xDQ޽ReL h_P2WϿ#Ϝ,z(Y__d66GToZ4QO>s(Y) r%e_SkgK_7RAEbmjժ 6 xfkGLbt-f="M+ЖE>JSEQdEeEV@V@EGDhj}]{6BmZwmZ]397X:*KعGcr$"E"wyVmUdvoPK0}^Qa꭭b29 G)"{_Ȼ~>Ēã>Z4dXezwnlp]OٱW`ԤYy%%W\zQ#g:[[jYп=[W.ҾCN>~VVc8+ۺ@hmſ .-z?ee< /KW/+'9;}t^1ļ>U7.UUv0TzAINonox,`̥w­FNollYPT;,۫<)$Czm}`)2x+MAgǖzT}!l_~w(q/- 1e4:#?sU~qOîM^8E=]>b@i#}ӰN:[CDQ1*#}o_^+)tOU6x H2jH_uEޭ/r=yAG,SN48yե٧o=b.bgwd >kvJJBVl8QK>^:|q׍=GP<|JWPhԷI1_wQtXE5UM{btçVM:7q-^Ĝ oci3Zcxfw[L97X㝯=C:{hgK"bGΛ^ }[, @׳G G{=]HTQ֎\\O.ˊNQ.vr=bQ,:}W!~[, 9IʄM|5[[d܄sB_HzR^߱3~WRB5;yޛr_ )WoGF!"=,~W][b(A8< wESβ" ( ( @nڻ"1g69Dy,?}mfEF;BM#-d#1o4ꗢ_P[<_.z8cڶΘE%  v8娲 3nxa:_A_(O,嗃7_DAQȿ%x rJ$F#zM}ɫ~DQ(/<@A`2pտ?CfM*5lo{IV7 b P+-xwl/귬=A*a #7(zJwvk'/'Zkx~~vՓF)*DA,Z^'u_+ E eDwĉXm׿b2Q -QzqAlf_n_G}cVE:Eo=9ǧ 6]+ q 9+mRu"^Uԏ,ɽoR >E"Ȳbȡ7tO~.$2 9ծp8  /F bX Hfe 䁛 H<ljjjΝA]AA$3@ d.x  x=`C@ $k&̔Z~Lvb]Yɴf?-ug\Xcݯg/ȴ5U;Sn=nڊ̏M ,$2F6&ɾBm/|W0;)2zv5t2uN'~ & ;˰Fz讒 ]yڿkkT4H3g0G>f<X(  qaX|a H'/A̠&Uz  +ϝ;7  .z^]AA$3@ dA Q1VAz =V M(N A +mwAz@ C(TjkkϟCEu"aEQR &+ܕJ& 0p?vVn5rHCȦMp,yAq 921 ͠AI}O異 rbEHC$o1# vIXzgF&/,cBp>rO 1x8EA7=b{~L;fӦMfA8qci!-2f-={Bq~raW0^ {" ,\\lb+) d .Nq/'$?"L @}4Dqwv:.:-3:*Aq EGA$3@ dA= BA2@@I(NA`gy@ YupNEa;-]AtW H2U#Bw $9-5Y :3PC84y9Z.F} r\XbٶueV<ϕX(8ҡ뒎JeA7Rhפ q?\xt b:w-f[框Y$9yp"|E1FyHœH~M^ï3Og!JY}9#U,ƶݶjDuAt!A$'hāE29o iz,A$3@ d9&] A\c E.;&x8PyPIFH4ws4{nHɬm} r\~NQکnC}̱2bמR yJrw5*ǭOUۚSUgXl>u^% S6]]A)|2a̭ظ8'JSpbnPQrV>>'HA!4uNsB@B}C› aKtӕP,> rk™;Y[&Tgw qR3*,E u6?ӰkX.`: wy.ؒfNjŇhiR3M{$CCU5%6~ ~:3:SKfDH frEYem 콌8@ֈ<ÁerN@ݭ0suKgj;~C(qv&J)ǏAazy`/.S1d)$Mgtәm<஠%\& =8β0Y (2_T< sw cbnfՔeaȎ+&:3psVCC8Ѧv?;dm^i;gT O}dj9SX81>3 u69t6li3,;+=܁:92IdnN,fa,u6ġ"U[etlE l-T yY*|ll !j)6cVv2cax' 'DH 9EnlW2䶞],[άrⴏdMD8`V j0kdIJ47̾H:Z$ r:V&O[:1[R~a9{8ו7i1 : &gc͊Nk.豒DX-$2Qg`>b@NSHBV^eaC3^%  ql;˙<07Eлa>d CI-Rrܲ8S Zݒaǒ],I!\ldZo98nLJRa}TBJ#ܙ}x9XV"K <:)=V:'FvB9 BA2X Hfϱds Od!X.??f "N!k !I d)aAKgyhvYR$69I5VХ%_M,-'ɤ3pe [C5z_dđqٴ AOZmk,.l+B5[#)WzTJ[7pc.,,Vdadđ\-YXHBm"k,D_^!C 9q rH!>@4#"XΑ*e7Q| yuvk_Ě;{EٵF&$.#jQ/v^cyRCK򚌻fbzSZR챨rƴ=[!!]51ݐ'Oo!)Oޢo3WNs(n#g$dS5 RC RsJ$F18ay*nY-Cic'\l{.2Qg lǬ:kqYv"x2Ml[s[i4z[z +',LO3Pwi  h}):9Hs+wτڍ3/fi<.{,x3  [~Mw# 5-9CĿn;fbV.j*WЋe.$(6;/]m*Ɛ];n~Z $m!!%LayRC9hiU]AX!]u0L#.l!oQJqqeVvjv* m%F[cRP-x!-вdjQ5IDATHZ>7{k[ImzUI9Y$AOR6pW0`kxW'YYK`xZT&J=VzaD6ד(j*܉vBVrEW[$|g#O*f#Ǭ(JqZ 3OV;cг'hqDa@Ea$U+o33b fr8$e*`ȩ2ZA`ɱ]ɐ'{@IYS*r&JZrF|0AMŐߩܵF@ #ʚ܁k?d85~,'N~X`X%:W gVKrYN9`a Zr$+0Ǥb'cc, ٱw =l3R$bl -heqeє|EYBrq, GC25/K?x<RU4$ǵ*[g~R&7*ܩI!y%bbcz}ro\Q";)3!2 Ka924fkc+U3@';[q`1'@2--aX/ FA2XA'k]?CG||lNJ4[29XY& 7=VVQ)gùDF* Rnsw=k I" H:Yp&4QE^f\c"zY1PhBG{ fP[=IN9w;7 2%K/[m39Z|?0$kAԝÅ!F43Ԅ5-)ߠaxM'n'uVCO-[) rJ┩]\gOS܏ܪrCC2lbḖ-}3UGmC$@78?Aet3uniZ_AO^~mӆz>Vq 4+3I˳™Uy$k,K[#H/X.2C/'җ:$L+?n]xNY=,LBca4{AA2ۉ q4%g99.},DLB 1@C!xBc kxd! A c! z,A$3XH29gael}AxS/"m͎JN<&#Q`ؒQ~F*r$̲`BVMOk,2YvC)gِ^gǹuKY\j ZIvt9ˈw -ok2׋5MiJǢ o)t9tCFG1cQYfOBgmD?e3Mj99*c'I8 Hs'ک 'sR>y֐3/Ƚue )ǐ;)'hKpW@=\kX8cewT$N2cbkIbIXǥ?M%S>2uc-Km,8v+-lLCV [N<[z Xq]Cjbz,`oV dXYnSb,mj{,푒Sd--~&֐L帖rEQ5''k9-UrF &o%hJ[`А!؞;u5ӐGHy8dUf.nZ̩?.ZڞbYz kAuQڅ,'ԻY N ӍY$C-= I ; !<$%./P,O]sw !Of !VV|E7-UBľ6‰YO?U20K n1STZs3$;x)9B$ AADul'*S$Vh!L  $ A2pAs,A$3@ dA xAI&= :-A$i BA2X HfRe,A$ ͋4T9  BA2X Hf9A$8XA$ Hf A c! z,A$3@ dA= BA2X Hf A c! z,A$3@ dA= BA2X Hf A c! z,A$3ZARSSLX ˄s.= 2@ bc! .@86PSS3o+x7   ,O# H Hf A c! XƍՆ{>/3A$Dcq+PG$YYIz r( Ȋ"IF=V5> BARc"=V{GL(Gc2n" %19&+M;*(@wTR#  %! HD3:.34  =AnK b%AtIME%A,IENDB`inet/doc/src/tcp/m.bat0000775000175000017500000000020211665100760014340 0ustar dreibhdreibh@echo off call C:\home\omnetpp\setenv-vc71.bat doxygen doxyfile copy *.png ..\..\tcp-tutorial start ..\..\tcp-tutorial\index.html inet/doc/src/tcp/tcp.h0000664000175000017500000004236011665100760014363 0ustar dreibhdreibh/** @mainpage TCP Tutorial for the INET Framework The INET Framework contains a detailed and faithful TCP model. This tutorial explains how you can trace what is going in TCP simulation, how you can use TCP in your models, and finally, we say a few words on how TCP can be extended. It is expected that you have a basic understanding of OMNeT++'s architecture (simple and compound modules, NED files, messages, omnetpp.ini, etc.) and of TCP of course. If you need to brush up your knowledge on the first topic, go through the TicToc tutorial, and read the relevant parts of the Manual. @section contents Contents @ref part1 - @ref sec1 - @ref sec2 - @ref sec3 - @ref sec4 - @ref sec5 @ref part2 - @ref sec6a - @ref sec6b - @ref sec6c - @ref sec6d */ /* TBD next few lines are currently off @ref part3 - @ref sec7 - @ref sec8 - @ref sec9 - @ref sec10 */ /** @page part1 Part 1: Tracing and analysing models using TCP @section sec1 Getting started Launch any network model that contains TCP. Two good ones to start with are the INET/NClients and INET/REDTest example simulations. If you use NClients, we recommend that you set the number of client hosts to just one or two -- that'll make it easier to follow the events. (Find and modify the "*.n=4" line in omnetpp.ini.) To start, run the simulation animated slowly (use the slider to adjust speed) for a while. You should see the familiar SYN, SYN+ACK, ACK packets, parts of the TCP three-way connection setup coming and going, and later you should see data segments and ACKs. If you can catch connection teardown (if you take note once when it occurs, in the next runs you can just "fast-forward" there using the "Run until.." dialog), you should see FIN and ACK packets in both directions. If these words don't ring a bell, you should consider reading about TCP a bit before doing your simulations. @section sec2 Peeking inside TCP packets Restart the simulation, and single-step through it by pressing F4 repeatedly. You can open an inspector for the packet by double-clicking its red icon. However, sometimes that's not easy: animated packets may disappear before you can click them. There are two ways around this. One is to reduce animation speed to the minimum so that you have more time to click the message icons en-route (still you have to be quick). The other way is to find the packet inside the router or host it entered: double-click the icon to see the internals, then check the inside of the ppp[0], ppp[1], interfaces as well. You should see something like this: Once you found the packet, you can double-click it to open an inspector window. You'll find that the message represents the PPP frame. To see the IP datagram header, click the "Encapsulated message" button to open the IPDatagram inspector window. To get to the TCP header, you have to click the "Encapsulated message" button of the datagram's inspector, and select the Fields tab. @section sec3 Tracing the application's listen() and connect() calls The application layer opens a connection by sending a message to TCP. This message is called ActiveOPEN or PassiveOPEN (at least if you use the TCPSocket utility class in the application; see later), and you can catch it if you open the host module (dbl-click) before the application starts, and execute the simulation event-by-event (single-step, F4). You should see something like this: The ActiveOPEN message corresponds to the connect() call, and PassiveOPEN to the listen() call. The OPEN message itself doesn't contain data: all connection parameters are in the "Control Info" structure. You can view it by opening the inspector (double-click on the message) and selecting the Control Info tab. The connId field identifies the connection from the application's point of view. It is only used between the application and TCP, and it is meaningless outside that context; for example, it is not sent in any TCP packet. The connId has to be supplied (as part of the appropriate Control Info object) in every message (data or control) the application sends to TCP, so that TCP knows which connection the application is talking about. Likewise, TCP attaches a Control Info with connId to every message it sends to the application. The other fields are parameters of the OPEN call. Remote address, remote port, local address and local port shouldn't require any further explanation. Fork is only used with passive OPEN (listen()): if set to true, an incoming connection (SYN segment) will cause the connection to fork, always leaving one connection listening for further incoming connections. With fork=false, no connection forking is done, and TCP will refuse futher incoming calls. The rest of the parameters are specific to this TCP model, and will be discussed later. The command type itself (active open, passive open, send, close, etc) is carried in the numeric message kind field, which is displayed on the first page of the inspector window. Likewise, when TCP sends a message up to the application, it sets the message kind to indicate what it is: a notification that the connection was established, notification that the connection was closed by the remote TCP, that it was reset, that it timed out etc; data arriving on the connection is also sent up by TCP, with Control Info attached and message kind set to indicate that the message is data or urgent data. The C++ API defines symbolic constants for message kind values: TCP_C_OPEN_ACTIVE etc are in the TcpCommandCode enum, and TCP_I_ESTABLISHED etc are in the TcpStatusInd enum. @section sec4 How can I "see" my TCP connections The list of TCP connections is kept in the tcpConnMap and tcpAppConnMap data structures inside TCP. The two data structures contain the same connections, only they are indexed in a different way: tcpConnMap is optimized for quickly finding a connection for an incoming TCP segment, while tcpAppConnMap identifies the connection from the applications' point of view, by connId. To inspect these data structures, double-click TCP, select the "Contents" tab and double-click the tcpConnMap or the tcpAppConnMap entries. E.g. tcpConnMap: Currently, information about each connection is printed on a single, very long line which gets wrapped. Later releases may present connection data in a more structured form. @section sec5 And where should I look to find information about open sockets? There isn't such data structure in INET's TCP as "socket" -- the TCPSocket class just stores the connId and offers a few convenience functions to connect, send, close, etc. @ref part2 */ /** @page part2 Part 2: Drawing sequence number charts @section sec6a Recording data into output vectors An established way of visualizing TCP behaviour is via drawing sequence number charts. The TCP module records sequence numbers and other info into OMNeT++ output vectors. OMNeT++ output vectors are basically time series data: every output vector contains an ordered sequence of (time, value) pairs, where time is the simulation time at which value was recorded. All output vectors from a single simulation run are written into an single output vector file, which is usually called omnetpp.vec (or something.vec). Contents of the output vector file can be displayed with the Plove program which is part of OMNeT++, but its contents is textual so you can peek into it and process its contents with the tool of your liking (e.g. awk, perl, octave, matlab, gnuplot, xmgrace, R, spreadsheet programs, etc) Output vectors that record sequence numbers in sent and received TCP segments are the following: - "send seq": sequence number in sent segment - "sent ack": ack number in sent segment - "rcvd seq": sequence number in received segment - "rcvd ack": ack number in received segment Most simulators count in segments. OMNeT++ TCP, being more faithful to the RFC, counts in bytes. In addition, the following are recorded: - "advertised window": the "window" values in received segments - "congestion window": commonly referred to as "cwnd" - "measured RTT": round-trip time measured (time between sending a segment and the arrival of its acknowledgement, only measured if there was no retransmission) - "smoothed RTT": the exponentially weighted average of measured round trip time values (according to Jacobson's algorithm) Sometimes less is more, so you have control over which output vectors get actually recorded into the file, and you can limit the interval as well. For this you have to add a few lines to omnetpp.ini; see the section about configuring output vectors in the OMNeT++ manual. @section sec6b An example: Round-Trip Time plot Let us see an example. Run the REDTest simulation for a while, then stop and exit it. As a result, an omnetpp.vec file should appear in the directory. You can open that in Plove by typing
$ plove omnetpp.vec
at the prompt. The Plove window will appear, and the list of output vector files will be displayed in the left panel. Suppose you want to see the round-trip times. We can plot output vectors from the right panel. You can copy there things by double-clicking vectors in the left panel, or by selecting one or more and using the arrow button in the middle. Then create a plot using the toolbar button. After some zooming and customizing (right-clicking the chart will present you with a context menu for setting line styles, axis labels, etc) you might have something like the following: You can save the plot in Postscript or in GIF, or copy it to the clipboard (Windows) for using it in reports and presentations. @section sec6c Following TCP's operation on a sequence number plot Let us see a sequence number plot from the same simulation: This chart tells a whole story by itself. The horizontal axis is time, and the vertical is TCP sequence numbers. It shows that TCP in "s1" was sending data to "s2". In the beginning, the sequence numbers in sent segments (blue) are growing steadily. These segments also arrive at "s2" after some delay (see red dots by about .1s = 100ms to the right of the corresponding blue dots). These segments get acknowledged by "s2" (green triangles -- they are one MSS = 1024 bytes above the red dots, because red dots represent the first bytes of full-sized (1024 byte) segments that arrived, while the acknowledgements carry the next expected sequence number as ack.) These acknowledgements arrive at "s1" about 30ms later (yellow plus signs). The asymmetry in delays (100ms vs 30ms) is because acks are smaller, which results in smaller queueing delay at bottleneck links. Then a segment gets lost: one red dot at around t=44.81s is missing, meaning that that segment was not received by "s2" -- it was probably dropped in a router. The sender "s1" TCP doesn't know this, so it keeps transmitting until the window lasts. But "s2" keeps sending the same ack number (green triangles become horizontal), saying that it still wants the missing segment. When these acks arrive at "s1", at the 4th ack (3rd duplicate ack) it recognizes that something is wrong, and re-sends the missing segment (solitary blue dot). Finally, after 100ms this segment arrives at "s2" (solitary red dot), but until then "s2" sends further duplicate acks for all the segments that were still in the queue. When the missing segment arrives at "s2", ack numbers sent by "s2" jump up (solitary green triangle at about t=44.93s), signalling that the segment filled in the gap. (This also indicates that received segments above the gap were not discarded by "s2", but rather preserved for the future). When this ack arrives at "s1" (yellow cross under blue dot at t=44.95s), "s1" knows that all is well now, and spits out several segments at same time (blue dots in vertical line). This is because those duplicate acks inflated the congestion window (by indicating that above-sequence segments were received properly by "s2") -- this is the Fast Recovery algorithm. Of course these segments arrive at "s2" one after another (sequence of red dots starting at about t=44.98s is slanting), because they individually have to queue up for transmission. "s1" TCP gets permission to send further segments when further acks arrive (yellow crosses after t=45s). That's all. @section sec6d Other hints for plotting When plotting sequence numbers in Plove, useful filters are the "divide" filter (to translate from byte counts to segments), and "modulo" (to fold continually growing sequence numbers to the same interval, so that it can be displayed conveniently). To apply filters, right-click vectors in panel, and choose Pre-plot filtering... from the context menu. */ /* * <-- TBD FIXME enable this again when it gets reasonably complete. @page part3 Part 3: Using, configuring and programming the TCP model @section sec7 Application models for TCP There are several application or traffic generator models that work over TCP. On the client side, there is TCPBasicClientApp, TCPSessionApp and TelnetApp, and on the server side there is TCPSinkApp TCPEchoApp, TCPGenericSrvApp and TCPSrvHostApp. The most flexible one is TCPBasicClientApp combined with TCPGenericSrvApp. @section sec8 Programming TCP Natively, you talk to the TCP module with messages that have attached TCPCommand object controlInfo. (You've seen that above). A more advanced programming technique to talk to TCP is to use the TCPSocket class, which takes the burden of assembling TCPCommand objects off your shoulder. It also looks at messages arriving from TCP, looks into them, and calls methods in your module such as socketConnected(), socketDataArrived(), etc. You decide what should happen when the socket gets connected, when data arrives, etc. by filling out the body of those methods. A third way is to subclass from one of the application models. @subsection sub1 The Pedestrian Way These commands are represented by the C++ constants TCP_C_OPEN_ACTIVE, TCP_C_OPEN_PASSIVE, TCP_C_SEND, TCP_C_CLOSE, TCP_C_ABORT and TCP_C_STATUS (defined in the TcpCommandCode enum). To send data over TCP, you would.... TCP indications, sent by TCP to the application. TCP will set these // constants as message kind on messages it sends to the application. TcpStatusInd TCP_I_DATA TCP_I_URGENT_DATA TCP_I_ESTABLISHED TCP_I_PEER_CLOSED TCP_I_CLOSED TCP_I_CONNECTION_REFUSED TCP_I_CONNECTION_RESET TCP_I_TIMED_OUT TCP_I_STATUS @subsection sub2 Using the TCPSocket class ... @subsection sub3 Subclassing from Application Base Classes ... @section sec9 Can I listen and connect using the same socket (or port)? Nope. Not just in INET -- with any TCP, be it Linux's socket calls, winsock or anything. You could try with one socket, or two socket (one for listening, one for connecting). With one socket, you'd have to issue listen() and then connect() on the same socket. In theory this is not impossible (the TCP state machine contains a LISTEN --> SYN_SENT transition), but in practice this is probably not supported in most implementations. E.g. on Windows, the connect() call is just ignored. Perhaps you can try on Linux, but I bet it wouldn't work, and the man pages never mention this possibility. If you try to use separate sockets for listening and for connecting, the bind() call for the second socket will return EADDRINUSE (Address already in use). So if you need to both listen and connect, use two sockets, and don't bind() the connecting one (or at least use a different port number). @section sec10 Do you want to transmit read data, or just "dummy bytes"? Real-life TCP's always transmit byte stream. However, in a simulation environment, that's not practical to mirror exactly: if you simulate the transmission of 200 megabytes, would you really want to physically copy 200 megabytes of memory from one module to another? Probably not: if content doesn't matter and only the number of bytes is important, then a TCP segment carrying 4K data in the simulation can just carry an int or long variable byteLength = 4096 -- and there's no need to actually allocate 4K of memory for that. Similarly, the "send queue" in TCP doesn't need to actually store anything, except a queueLength integer variable. Not suprisingly, storing just ints improves simulation performance more than just a little. In other cases, the content matters, and you really want actual bytes to get transmitted. But typically, in OMNeT++ simulations you don't work with byte arrays, but with messages represented as C++ objects. For example, if you simulate HTTP, the header might contain an array of strings... @section sec11 TCP flavours TCP supports several "flavours" of TCP such as Tahoe, Reno and it is extensible with new ones. */ inet/doc/src/tcp/activeopen.png0000664000175000017500000007000211665100760016261 0ustar dreibhdreibhPNG  IHDR瞮 IDATxy|_=B8H !E9hV-_*`PD XjPP9Ԋ|9~h! !@;$dflf|2R4@~-!<*';\ <<$<)$PBHQvZ%Dv Z+ThW Hp) pp9 "'D oəM.}$nҶMΝmx8Hw_ .F ˆ욏"k^Q K^q^4TyU>T՜^(NĶSv&o"TtC.G QV4$&8.z6XS3[\PcFR x mh p:ਗR7!D5**F+BhL"P* Q4X$5VIN5Nt$xAݍJ((%܅]>HօQ s.uܽxDyA;3(89e&wiroeDn~ B,sj^&(Tp>º6h0}Tƒt}fxJPQ7gj+#Ru#WXn^g/z,1 +o\tYz=T( ,dY<|Mn_JǗ^  % Y)oG2ڶEb[BIrDJze<:[EPFV-Xх8xTҊZxE"UH dB,Chureee{{o=>iAN[>OAxRS)WWP AY PH"e* TROT[]QYy~{/ʨ?~P'8xY+׺oݼ4[em+O5JFf؁zq ytPYURNG<]f?,RZwDۦ3(v^u0(GPYL2\ˀnS8PB `A^ D2ze"*\(BqPr}SV 纏7"jEU;1J&QP\pN y1?Sߟ%<(8=8tYY$%r_}4'8 x@7uS@&%)p쌼#S[l?2n'ѧ(zE]:/=G^\ig~!9`qjtw:e;Rg>O* JGCX+s_ës~?V:/ z!P Ro @ P$A/x(PBOξ^ۥt~G)U 4ܨ\?ٱ=$ x88<N(p<OMJ&l ';ןOx+6m7}%xy;4=xߞQmTg/'uֿ=9!/yԷcѫE7컨+?c,,tQW]e=z¿ ~,(|2=M\qp/[Yz^/OOBU=據@z$zת`I~YQD53RT| ]O7ShX_ƘȜ[v`0 JDH2 j! P8  ʕD@)RN>pLDB'uT gMoAԥ aY}ߟcNnOuhB֜/y6mg)F ׍zvɝ\{ŋ?뮸s4\=QzHJ׃0i‹!' ȴ{z;Ҳu=ɫ} w!Dߤ{jp]z) RRjV[VyL?O;SS$@OKӤndq̜]J8]ZDGqߪ 3Hl??8["" BGFƒ8@ NPPL14;+S@E/TH*Qa} Q$" (.\.8 \ hа8% zgN70lx߸G׽^pM$#n(08d-nu+Მy.s8ִ* Ѓ{EˋktÕ[6,BLDgyg/ OmTz>Q=? Qvc H+lt>%Ti"֯@צTmSR/Gj iohJV5䞫Za&U D: \CUI$D)PU'IIp#?Pv͖x2j㞮 GԎ}#7r[ʗph@sL|`qjsG>v@gh):"nx!= >YJ1ӛlx7 DvѥmNV$ JWTq}oeOJ;LϰvO{{JuHOIj HRFTuJW8tO3.hfɛ5(B%D%Eh"DU(Uձ!QA jK/H韛P JZ6n| y7tdJ Ԧa;qvPNlt/nNN{oU5 }dys)s f5 gȔPdJ$ ~1gHP1ˡPQ^u8QןՀBDLlrnz>|L% D C' ;uD6h 'N z{h [i$]QBa?1J9I憎ӆQN BxPjuDCbX]EUH m$dfT՝`0XVT(/"`,n~B[v$g6xO,5ın",jF_GkBZ -qbr7,{a07`>e=Ԫ#Ƨ ؃. aZ2fui`kf2{\`vTO>dKޒ$ZK ~3t% ,6)ϮhJU%ޯ9ZEχv)aC~~n:AC?.˂Hdf"4U+UpeRޯ9!_ gΜcC귛JnO0h( cW7?e^F\4Jskwqg}Gp嗫cǎ/-PM-"t;YǮH&E`0f5*os+Ü9?;hg a͛7o5X͔)S?_ה)ST1;rfjb]| F+YB?X1CGi쳘3%\O?t萖ne߾}]v^qs/'40Z*""FI3w`ư=-a{bՠz]L0aŊgΜ9s̽zs̹[-m̵ _Iƫ:“a$UMi)/7G u?w/ٳg pu׍;Vu뭷;vZ ١VDid c 9o/t9$;έx M}>}Zp4g*enS մ"C v<=7pj-0sG.62s4+qj!0qDT8cC "Hu # {q̑# GpWa80ľܱ㶊 gΜٸqƎ;qDenٿ/a*kZ{P| ҏ3IJ[s1Vy6_EkiH(kp0ȍ1ly v2Gi;բ;vթ$~{ׯɓ o;oBAӓ: vgK><<; ^#UdY裏>䓹UReĉ'Nܱc^Ћwa|&M ;6gh7w}YSѫ-Qm9շvZ@(S@,0ɦđ_M(Xm\f54i^;b0>B#i-51j?n= b1w #`e$u߰0@ߦg6p$ok1ɢ.]VԖ8 kz3 F|4Yˋ`0J6{`Z|:E߃9`04| eFM<371 FDq ?|`0N٨7` %` %`2ڰbM? cpHZ \D(u@CU`~kӳ$FՃvkcgJ4r|FvPI.sdmΣcNlNJ3e6i!U2g GD-EXlĉk׮we6z#J /Zv=*I)8v#ֱ<~{"Tz;z'NTQQK/bG裏\kf п|{"_|DءSJ*`D+%_r-P[A%>E\~CQѱW^yeϞ=[[[[[[ ##gaiE6jȁp YhY %#hH)bQ mtK_w/yϷնW^Ya*1b͏(JMMMiiڜ!˕ȄؿR DpM73p`lPfek>UR۱Z՛6m GjFz2-(6̭6OiZ^`ݻw7&bT袿LMM/sG ] p1^4hd.Gi8g>W{_6C&p)S^/~y"0-Fkqf# ]s[k{#G̝ykڶ@W^y7^رY%(,[6:pU 1>7x#JF#no}EԜzAU2YqDP;t:eYGY /bGi0ƭuM>cm۶iNKYVUgU%};$$$(a6ΝۡC` QjF0dnn-ۗ.?JdyyyIIIqq˵["KD~Uȕ`XB+r>T ]w}w=!]mm? oVyy={(,--ee%e'O1$X52Z9 GP>gΜq^vO@N] ^[[ݩSΝS/x%\%5k~gwZ1GɈ ZTf#ۅ,Yr׵^u}k%ΧE:`Z4 t{]w-ر x;PVV\[[u\7cNErs73go6,-!I3'}Q3bV(/}_\ )))))G:%7ii*kO}[O=#FoKC9kז2TWW7`:J㗼aeΝ&L۷w rM:eY|E6KII1+Po̘1nܹsē'O6B! %#iJRԯA7REfG+**ѷ|Mzzߗ^Z ɓ'O0ߵkW׊hyrq^wء߫N)/**4y;v'7zŊ ɵ扙At:qTaUAVb0"U}1-ɓ'g̘o<\;wN:WuM}{;w}7|uJRQ\cӃqAgJp}sU#)Ν;}`ʔǮnk-ڼys-7Zmƥ>hMu_PI ęP2bV(:u=~A͝;Yʕs6mzo߾ڽ>Wi3o M% PKt%#.Q`*FYYYɳfxIUU7>oޚ.>zf|HM'NMٳgg͚eQM*Qb_;MݻgL{Wϟ~{3%zTyyŘ1F@4}>,a>cژ6?;))9JF\*Qyr5f̄{u[{@rrwp;W-g/GdXԿ\.ۭO4qh(ʹs*++P2bV(aRҒn93ï볲O+[?cIJx^+r A_Ep!Z4 pyӥU7~'o]|q1c/[:b c;##ݻ02HKKy3~i-RE[̙ڥPZZ?Mq5W L,i~'dUPPo߾̈#G f0JdH9}޽;ԕWXoӏq)mk~/Q4̘1cΜ9g^bE߾} _sTr劢L:5g`K.:; nݺN6y̘ڃjOǃE+rĈ3g\zĉN'mXRs,˅Eq֬Ycǎ2LOO߳gO0rÆu`>[!o-#G߿7;;3f 0`͚5("++;5jT$3bsG ͚U߿:RMUnMJ>rwqGd# 1bĈEEEEEEM?] FcgG#GN>uʕ'NWp\7ME;vzƌkEfdd\E> F $Щb:JwuW~֮]HѿY9rd$3b>J#G9HZ86Tl}Fy CqM*ː9Q$9ܜ3aQ\s\ h&EЀcT7)%nDēr1n5J=7b0b[zN,KUk]UR# 7Cey(9O(eXca("Aj~BJ+{5k7.!F G769TԖ8TL5 #tZi%`3`0%`9Js ( #Q2 Fd0 0G`0A``0%`9Jed EX_ h*V9ʸ\aqTa1lBxp(!? FTg!d؆f$ kR7-vӛ9ۘJ=ըwV=A ;$İT`!rL F$ WԶ vö!##lG+B@[ =i6 j;y7ecX+ d,tQPj8eCA"c45?a+GitxqGJ]@jbs63E,kO6tq#ll(PT d9pTkCwZ~gZJϚ irbXCVҟ:uwm>}~aIIIuSLIOO,ğB|jt4YmI O(߿޼y'NHNN^`Aff&TPE}%j$jGQJ7o[oܹsٲeo2]dpjff>ܬt>_P< <+Ip ?l(͜:uj'N={%K\.^E& ̜9sҥ֭_|ŌHKX#9ʆQ!(V2U 5ߝضwn╢_^ŋ7n8{{I $^/^aÆn,b[-i 5 G769F*uj*jPy *L:{/99yA)fTeܹ~|`PFelÆ qܐ!C9E'm]wԩSӛ_Xkæژ 3VQJߌTVV.XvJRJ !7tի-?Vɽ{Ο?k׮w}Ϟv^^y9u-[|K,8p3ڵk͚5ʺ;G 4a^޴J)))>rqU%e˖w>3%!!Aːm̙˗/_~_|E[5k֬^Z圜1cƨhsz<7xW^yG"p6d׮]WNKK۶mxso߾ٳgZ*33aQo|M~ $|^Æ Ӯ>=ygΝ;URHVO%) … ??~BfYԿfffXbҤI֭cB!Z.7|g$/~dyn}U4531!!~TReׯ1BQQQAAANNU*na!C\ܹE 荿JS=%%%3g޳z ;vLHHдRTT`̘1VI5;;;// e$hRcȑA_Ǐ.Ma0wܱc>N}v,>J*I)X_<;iER׫W/.V%k^'h(U3K(s<77>:aܹs#U㘡9hF\%wSnW$qT&P_rnzg̃F`YRR2|InK"be~ŧštKls,iAǸp l֪m.$ G3N:Jj§n65~S&Uچ6kl!_~eMu .4koBHJ*˴>JJinnMt}}Uk:t~ӀTM>PMܰA/^l`{U>Q;Z(U6mڤN8EQ Bm(nY>6Ϸ%%%t=gKg˨m.9JEQ&LЮ];u"57zI}C]}&L6D! ԩ(W]}5LT9hn:X^^_R&'';3fܽgD]}-]>mM2l1(WW\ѫW/ˋ8$IU"O\|ڗ_Dtx衅'LDQ?__08NJSg%PJn3ϼ ^fժGN>}~fsݡC?1Gْ"GI)8.%%E}|ʲo1E#رc82 /r^tq:vh>"nRzA+dtUѶmZӉnjkZGqQEuDVvSǾr hRRRZMAE ;&&?o8WL/<~>ڱcG\r%Z3ѺΝ;lBMݑ4~Ioꪬ,8rEE}Ů].$wL ot8C?~'g$Lw8>i߾z3*(+i˖- kVrkڷor^y{[K^d1tv?QR/aW\qE߾}-/ܹsڨު6lعgk>=AP3ƐF|^CVS]ݳ{Dž &KK}ٳ7n_~hڥKۧNy֭[a+Fݶm7߬ s3굱{{gԷW(mڴQgи^WWףGTî>|xڴi>Al֔A( . ܴ}C+nR>x>$QHp9d]Nzx<\}C:r:W\9dȐ.\uS&Lcegg?999W^y%;;{ƌ!k׮ogΜye͛7>`MHcՃx1Dk*GMHHG8T/[|JeB$$&|РqmݺuڴiWEXlY5l< $ICݽ{w^^W_}]3wo~a߾}jO?׮̂~0`tK>W;*VҮ>lh F}饗UߦteIc.sSNMII1/RO޽r ZÝ9h |?υ\s>##㦛nRE055[o$[njӧSJGxO4gϞ#G\v^v}6}۷l"~kly~.Z4g"^r]ƍ 0=l0Պn *I)}饗Ν{5tyWS-ϗ_~iHo[#G|=NkT/o]v"eG`lPI]7]aޒs$s\Ng7jo1omwk׮޽{kjjZBl$''kbV(fNNNΠA,/ĉ Qi|{:r:爻 QRRO0I,QOu~F~\e|:&K3+g/~I x<'UgJ*2X52Fw]Ϟ=_E}expKnܸOII0i^e6u<z[ת(,G(SSS.]:o޼7x?馛222 J LKc̯[VV̙3)))˖-ȈY7R2h =c=J>&!e_E v= #Caa!h=w_~^{[~}JIJJ&Oll[oi#WLOֶ} m-=蓑UPPo߾̈#G '6w*>>7xc .*GxRT#o߾ܹsrUf̘1gΜٳgXo߾9*|rEQN3-wroUߠꂌ[l>JII۬0bĈ3g^zĉYYYNuo.Y :$YƎͳ5Q2Dzz%Kϟv7.33ny bGVsugڵ8cƌY&??????Edeey督FDp s  8_|7پ]mb-2u 1bĈEEEEEEMژ 3Q2|>lA((dddk @\wdeeEƄ^D3lc ؇Èe?|ߚ]PPm0,!ig_F6lU'k W4%mb*x`[3S#^1 |n7p(_օe`;.!^F+)ʠClކMkoaHaˠX}Bbm^m;]qBz@S̮]֬YXE2ʙk-#O }_:?|3t(k֬Yz,999cƌq\4ǥL$)/////oΜ9f͚1cFNSMӷ]^{B3 ڄ0^G8쳓&MZn],%fė m8vq̜9sҥ֭_|E!"2 Х|vP_].'8phtM4UTܹs#6wڱcfϞs5IRBȼyEٰaƍzh:jw{uOy^ק>ʲ8CWEQ,iLl8KNN^xqPl%ڹs禦~>o_NP${0D0 z(Z0cըw eeenwPlRlBM7sȈ;DE+ɯM;jkvFFa߾}!ȑ#YYY}Ƈ;JM 3fJfq1cg޷oQ˗+2ubyz{wE7$dDg,5.1pz+,RBCw.U-9wZ3RxEtDH-MJ-Ȅy?m{;IOSfz~:Q`W<"Sf&Mp—^zﯮrB!_~H$>cǎŋqx,>͈>زe IlT-A-4ۗiQhxwhvwijssssssN~n-;OGI%AزeL⦛nd!C2CyۭsD̴ChҤI&M:yɓ' flRϚ5kyyyjeń 8{}&J6q3DɾHQFdʰ-2Jѭ ?TȨ {46Dڍ2JNgYY/1QPCu•9c,B;gte7%kw+Inq1zY\7ee]'F2 i[di Ҝen‚"eTFi 炂!Q@FdsU:u< h~gRoۥ-)J}{ƍCF2]f?ZKi.}o&c"1\Njmm8.}ᇪGi-̹' 2JgΜ9p@杠%;7n(-e }dɒ%>\hɓ~ Ҥ[}N:wl~F) a'N,++3p8VaÆuф tnF9t{l:JzOf*F&%Nf4(t~1Ȇ[HD"!e 9m֭+//߾}*Hcb$!"^HID"Yu]s5zb4!v2YGXp8N'{XV42(D8DIihh "(Fe륞(H$"telii'7xC4Tx6DWգO%!@+޽{mۦ/wݪ*gP\%ԩS&LP-,Oߦ+^o0ܳgϞ={N8vUQQQ]]|QqlGAT;r2JܷEn۶Md!nFQZñcLjHFGbEFYdwΉU;vlss_~RF](=:Cj%QROǢ 3f`ʤ2Y)(ƸuY:4"IQnٱc%;d dF&\R.bFu?W(!lĉw ?Qo4-FH2ʰ&Ig7o^("#F p8rmY>iEF)2dH!lA2oHuՈ &dRޱcǶm2q1cH;7JX"%Eɏˈhūmll:u:;;\ay"C~S\R)zO]]SsU3_~]0`=x릦I&z[~įK|lQǏ ?ӧc2JQ_9rM\p<4x ?r12rGϝ;2uTJ>)]v#-2Jl׫:-Q~4J"PZB[kr¨kg_<&"!_%xTUU% GUiFe]0lt ԅXr8.q nőikkLD5G쎇˗˗H]+!'Ov裏^Z63WFH#TݏIeQQ֭[#H;[}ud⢢3f_mꫯ_48IDDѸD*IAAAcccMM;Cx=ܳy˗/ s:d[outt̚55. ~Y":}Uy睺." |" P]_\+uCG:[6m0 @$9LQ{śo{{wԨQC4[e}}utt~ԨQ{`v{S[[X^^~z6 `4Ě\^X9EhȐ!DZDzL ׮]ڲw16l^Qf͚"JZ8rß .|lcYYٱcB\4?J8>YWHJ|3fA+,Ge˖-[Orlʕ+x{ky?8V;?&J>z-χs,G |P:'? ]"D4x.:;ookkN5e@Y%Qd+**ˉhW\ĝъ&&"6lطe˖үbeNJW]IM?W(ɶ\rΜ9DpEə3gdκ:rzIv(ŵ{>2DuYW#Θ1c޽pxʔ)eeej'N]jU]]<Bټ ϣH6FD~_z,dO _jU}}}(j9",{J􅬔lh+%v0'iס2~${-͞={ذaqpÙ8mF?TSeŚsRGٜOv&hd rjΝ{91 `ZvTJ;rj8(C@\.YGK,}b… ?C>|^ _:GiE,GIr:$SZZZYY,[I~Ie7% G}Çk3q-`#("# >؄z8qEOɎ-ZWTTV:T1 ^k׮% {`82J=僉(suݫN %ԔՐ^iÆ ֭#c&0[7pĉc͟?߈S^c֍)L/OQ v ~ADu.[R'"JGܜCTVV.Zhə9 *&O,jgل;svRӜyJ&_ќBz!gف;svTSML'GSAF лdMs>u,T(("!` Yؒ<ɚ҇( H%d=FԳt'QqWXlG "[y^QQU՗mL6.<ԇB%@*Yh&@CCB0 H2JM(ԡ "dI 2JH'A %: BF %H 2(4 q@ɨ^oGO C>e;8"+@: G p>J (aV$@2J" @J( @: Q!Qh@F vYA %d`k=Qݡ Q}!(]Y>oC =(t^d`YBC%ݠ2J#+(N~(4 [(4 [Go0i@F v!HQ ۩BĄ^AF v7 2JDI-d`/>d"H r%DIH2J DIH(p"Q%Fjoo߸qݻ;:: ١r>Pqq)S͛WZZj!(Uc%%>[t3gWXQVVZ-e/dѨ㑕'Nضm֭[8f͚1cdR"Q(xz٧H$Yd~ZMv…?|CCCmmk'MeTF>J0ƍ{%#E|,,Yزefe7Ν;QITGכ[,ѢEΝ;x`mFz Zb|>q{$ TN3hʒM b0^|EC m@%NYYY0|۷%k_do#HIIVYD¨7S0$NN"wk^ JL&Ewjz]BF SPP5l9KDs5@<}IR(t۱c+Ν[sD(\X"ADH<^ <q<=_xRPN{-nQGlIN׹u!&\4t&71.pn+.po:p)smȌADBVJ6N-#|qq"*78  K*r _<(;N4P(-t ! ΅d?ߗhx@qHroCHMDådF"QI)ϓ-('vt QQOs#(t늖 ЫDJ0#Rhߘ r9Dvx'|V~sbBPWG Fߞ[ٽb$=zzwbp=G #P%O>A)k"3Mo0ϳŋٴ!<'JЄLG`N {3/xL!up FtXFܬrֳIm5&Eӻ$a䨷@ ++rzt9z{ge@Sނp2J0A_B')/G/yqwBQ3h t Dٙxt8(ܝҧM$>J0#q~Ϲs@ p қCDzA2#ܾ}{GG3q-`(\jjjMV^ l R>cV(Yd͛7{@'?I.`.%%%k֬YtMv0x<.)ʛ5<{lSSSGGGqq5kJKSQo01cƼ7nܹsgCCCRTT4sy!J&d`F%%%K.]tiUUUҒS;3*D%XF4`,J,edF C +0#2J0KH-llGT>(jaB$}0Nڬ5ٖdnbcYR."a"JG 9O^H0(4 `TF>J ٌ[bH{-$`r^Hq0Gze%ư82J0;=BF 0@3JAȈ, }G %dQh@F %dp14V FFH9LC%Q ]r/]QB>A JuϷ^I%X\G\D4t%01$:B%[7w`k5e5s3CF QL9`MUnr_DF v?HIR`#XYC`/,Vꏒ@ 6b`G]@%T(ydB5Äs+ՠ=՟yf3WyqHWY t=%J*ӈKgCӺh1CCF\@)u%J ť4~ _(u~(QpF\YY(]'*54P%J Vf=Deʭ[^NqB{DKո:1Pn-/nGF%L)R"Odg"P%J )2VCO%J(L(e%J(X H?E%J(XKy[DQD2e@)G{DdqIuI'%J 93< %J f Awd(Qt^\JGo\1%J.ӈKJD*\hr]ܠ5rO]nDD/((\hbF