%!PS %%Title: Guide pratique du maintien de connexion TCP %%Creator: html2ps version 1.0 beta5 %%EndComments save 2000 dict begin /d {bind def} bind def /D {def} d /t true D /f false D /FL [/Times-Roman /Times-Italic /Times-Bold /Times-BoldItalic /Courier /Courier-Oblique /Courier-Bold /Courier-BoldOblique /Helvetica /Helvetica-Oblique /Helvetica-Bold /Helvetica-BoldOblique] D /WF t D /WI 0 D /F 1 D /IW 454 F div D /IL 672 F div D /PS 842 D /EF [0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 2 2] D /EZ [11 9 19 17 15 13 12 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 8 8] D /Ey [0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] D /EG [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1] D /Tm [1 1 0.8 0.8 0.8 0.8 0.8 0.8 0 0 0 0 0 0 0.5 1 1 1 1 0 0 1.3 0 0] D /Bm [1 1 0.5 0.5 0.5 0.5 0.5 0.5 0 0 0 0 0 0 0.5 1 1 1 1 0 0 1 0 0] D /Lm [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 0 0 2 0 0 0] D /Rm [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0] D /EU [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0] D /NO f D /YY [[{()}1][{()}0][{()}2]] D /ZZ [[{()}1][{()}0][{()}2]] D /Ts EZ 0 get D /TU f D /Xp t D /AU f D /SN 0 D /Cf f D /Tp f D /Fe f D /TI 1 Ts mul D /Fm 14 D /xL 71 D /xR 71 D /yL 757 D /yR 757 D /Wl 454 F div D /Wr 454 F div D /hL 672 F div D /hR 672 F div D /FE {newpath Fm neg Fm M CP BB IW Fm add Fm L IW Fm add IL Fm add neg L CP BB Fm neg IL Fm add neg L closepath} D /LA {PM 0 eq{/IW Wl D /IL hL D}{/IW Wr D /IL hR D}ie /W IW D /LL W D /LS W D TU PM 0 eq and{IW 56 F div add SA{Sf div}if 0 translate} {PM 0 eq{xL yL}{xR yR}ie translate F SA{Sf mul}if dup scale CS CF FS Cf{CA CL get VC}if /Bb f D}ie 0 0 M TF not Tc or {Cf{gsave SA{1 Sf div dup scale}if Cb VC FE fill grestore}if}if}D /Pi 0 Ts mul D /SG [0.8 1 1] D /Ab 15 D /J 0 D /Tc f D /NH 6 D /Nf f D /Pa f D /LH 1.2 D /XR f D /Xr {/pN E D ( [p ) WB pN WB (] )WB} D /Db [16#FF 16#FF 16#FF] D /Dt [16#00 16#00 16#00] D /eA f D /Fi f D /bT f D /Lc t D /Dl [16#00 16#00 16#00] D /LX f D /Br 0.25 D /IA ([IMAGE]) D /DS {/PF f D()WB NL NP()pop RC ZF} D /Gb f D /Mb t D /Hc [16#00 16#00 16#00] D /Bl 3 D /MI -15.2 D /DX (DRAFT) D /Di 0 D /Tt 113.385826771654 D /Th {()2 Al()BR ( ) 0 1 -1 H()4 FZ Ti ES()EH ( ) 0 2 -1 H() ME 0 get join EH()Ea()BR()} D /tH {()0 1 -1 H (Table of Contents) EH()} D /FD 2 D /Dy 2 D /cD [16#F0 16#F0 16#F0] D /FW 0.6 D /FU [16#00 16#00 16#00] D /ET {/RM f D /A0 0 D /PN SN D /OU t D /Ou t D /W IW D /LL W D D1 Ms not TP and{Ip}if /TF f D} D %-- End of variable part -- /MySymbol 10 dict dup begin /FontType 3 D /FontMatrix [.001 0 0 .001 0 0 ] D /FontBBox [25 -10 600 600] D /Encoding 256 array D 0 1 255{Encoding exch /.notdef put}for Encoding (e) 0 get /euro put /Metrics 2 dict D Metrics begin /.notdef 0 D /euro 651 D end /BBox 2 dict D BBox begin /.notdef [0 0 0 0] D /euro [25 -10 600 600] D end /CharacterDefs 2 dict D CharacterDefs begin /.notdef {} D /euro{newpath 114 600 moveto 631 600 lineto 464 200 lineto 573 200 lineto 573 0 lineto -94 0 lineto 31 300 lineto -10 300 lineto closepath clip 50 setlinewidth newpath 656 300 moveto 381 300 275 0 360 arc stroke -19 350 moveto 600 0 rlineto -19 250 moveto 600 0 rlineto stroke}d end /BuildChar{0 begin /char E D /fontdict E D /charname fontdict /Encoding get char get D fontdict begin Metrics charname get 0 BBox charname get aload pop setcachedevice CharacterDefs charname get exec end end}D /BuildChar load 0 3 dict put /UniqueID 1 D end definefont pop /Cd {aload length 2 idiv dup dict begin {D} repeat currentdict end} D /EX {EC cvx exec} D /DU {} d /BB {pop pop}d /ie {ifelse} d /E {exch} d /M {moveto} d /R {rmoveto} d /L {lineto} d /RL {rlineto} d /CP {currentpoint} d /SW {stringwidth} d /GI {getinterval} d /PI {putinterval} d /Sg {setgray} d /LW {setlinewidth} d /S {dup () ne OU and{0 Co R AT 3 eq LB and HF not and A1 0 ne A2 0 ne or and {A2 0 32 A1 0 6 -1 roll awidthshow}{show}ie 0 Co neg R}{pop}ie OU PH 3 eq or{/Ms t D}if} D /U {OU{gsave CP currentfont /FontInfo get /UnderlinePosition get 0 E currentfont /FontMatrix get dtransform E pop add newpath M dup SW pop CJ 0 RL stroke grestore}if} D /B {OU Br 0 gt and{CP Ts neg Ts .33 mul R gsave 0 Sg CP newpath Ts Br mul 0 360 arc closepath UI 2 mod 0 eq{stroke}{fill}ie grestore M CP E Ts Br 1 add mul sub E BB /Ms t D}if}D /NP {Ms TP not or PA and OU and{TP{OR}if f1{mF k2 /mF E D /YC 0 D}if TP TU not PM 0 eq or and{showpage}if DU Ip TE not{LA}if 0.6 LW /CI 0 D /TP t D /Hs f D /hl 6 D /Hv 6 D /HI hi D /Ms f D}if Bs XO BO M} D /Np {LE sub CP E pop gt PL 0 eq and{NP}if}D /Ip {/PN PN 1 add D /Pn RM{1}{4}ie PN Ns D /PM PN SN sub 2 mod D} D /GP {E dup 3 -1 roll get PN 1 add 2 mod get dup type /integertype eq {get 0 get}{E pop}ie}d /Fc {dup 2 GP exec SW pop /S1 E D dup 1 GP exec SW pop /S2 E D 0 GP exec SW pop /S3 E D S1 0 gt{S2 2 mul S1 add S3 2 mul S1 add 2 copy lt{E}if pop}{0}ie S2 S3 add 2 copy lt{E}if pop IW .9 mul div dup 1 gt{1 E div}{pop 1}ie}D /OR {Df{Sd}if tp not{gsave SA{1 Sf div dup scale}if Fe{Cf{FU VC}if FW LW 1 setlinejoin FE stroke}if /YO {60 F div dup 40 gt{pop 40}if}D /cs CS D /cf CF D /CF 0 D /pf PF D /PF f D /Fn FN D /At AT D /AT 0 D /FN EF Hf 1 add get D Fz Fs FS ZZ Fc Fz mul Fs FS EU Hf 1 add get dup type /arraytype eq Cf and{VC}{pop 0 Sg}ie IW IL neg YO sub M ZZ 1 GP exec dup SW pop neg 0 R Sh 0 IL neg YO sub M ZZ 0 GP exec Sh ZZ 2 GP exec dup SW pop IW E sub 2 div IL neg YO sub M Sh Fz Fs FS NO{/AW IW Pn SW pop sub D AW 2 div IL neg YO sub S1 0 gt S2 AW .45 mul gt or S3 AW .45 mul gt or{Fz 2 mul sub}if M Pn Sh}if EU Hf get dup type /arraytype eq Cf and{VC}{pop 0 Sg}ie YY Fc /FN EF Hf get D Hz mul HS FS IW YO M YY 1 GP exec dup SW pop neg 0 R Sh 0 YO M YY 0 GP exec Sh YY 2 GP exec dup SW pop IW E sub 2 div YO M Sh /FN Fn D /AT At D t Pb XO SZ SL get neg R /PF pf D grestore /CF 0 D cs cf FS}if}D /Sh {dup () ne{CP Hz 4 div sub BB show CP CS add BB}{pop}ie}D /Pb {/OU E D /Ou OU D /PB t D 0 0 M Ba{/Sa save D /BP t D /Fl t D RC /PL 0 D /PH 0 D /W IW D /LE IL .7 mul D /EO 0 D SI ZF /YA 0 D /BO 0 D /C1 () D BA 0 Ts neg R Bb{Xl Yl Xh Yh}if Bb CP Sa restore M {/Yh E D /Xh E D /Yl E D /Xl E D}if /Fl t D}if BL /OU t D /HM f D /Ou t D /PB f D} D /Bs {/BP Ba not D}D /reencodeISO { dup dup findfont dup length dict begin{1 index /FID ne{D}{pop pop}ie}forall /Encoding ISOLatin1Encoding D currentdict end definefont} D /ISOLatin1Encoding [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon /less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N /O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright /asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m /n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/space/exclamdown/cent/sterling/currency/yen/brokenbar /section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot /hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior /acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine /guillemotright/onequarter/onehalf/threequarters/questiondown /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex /Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis /multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute /Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis /aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave /iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex /otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis /yacute/thorn/ydieresis ] D [128/backslash 129/parenleft 130/parenright 141/circumflex 142/tilde 143/perthousand 144/dagger 145/daggerdbl 146/Ydieresis 147/scaron 148/Scaron 149/oe 150/OE 151/guilsinglleft 152/guilsinglright 153/quotesinglbase 154/quotedblbase 155/quotedblleft 156/quotedblright 157/endash 158/emdash 159/trademark] aload length 2 idiv 1 1 3 -1 roll{pop ISOLatin1Encoding 3 1 roll put}for /colorimage where{pop}{ /colorimage { pop pop /Pr E D {/Cv Pr D /Gr Cv length 3 idiv string D 0 1 Gr length 1 sub {Gr E dup /i E 3 mul D Cv i get 0.299 mul Cv i 1 add get 0.587 mul add Cv i 2 add get 0.114 mul add cvi put}for Gr} image} D }ie /pdfmark where{pop}{userdict /pdfmark /cleartomark load put}ie WF{FL{reencodeISO D}forall}{4 1 FL length 1 sub{FL E get reencodeISO D}for}ie /Symbol dup dup findfont dup length dict begin {1 index /FID ne{D}{pop pop}ie}forall /Encoding [Encoding aload pop] dup 128 /therefore put D currentdict end definefont D /SF {/CS E D SZ SL CS put FO SL FN put /YI CS LH neg mul D dup ST cvs ( ) join CS ST cvs join C1 E join ( NF ) join /C1 E D CS NF /Wf WF FN 0 gt or D /BW Wf{( ) SW pop}{0}ie D}D /NF {/cS E D /cF E D cF 0 ge{FL cF get}{cF -1 eq{/Symbol}{/MySymbol}ie}ie findfont cS scalefont setfont} D /FS {CF or /CF E D FR SL CF put CF CF 0 ge{FN 4 mul add}if E SF} D /PC {SH /BP f D fin not GL not and{NL}if /HM t D /LL LS D} D /BS {/TX E D Wf{/fin f D /CW 0 D /LK 0 D /SC 0 D /RT TX D {RT ( ) search{/NW E D pop /RT E D /WH NW SW pop D CW WH add LL gt {TX SC LK SC sub 1 sub NN GI GL{SH cF cS OC 2 copy cS ne E cF ne or{NF}{pop pop}ie}{PC /CW WH BW add D}ie /SC LK D} {GL{JC}if /CW CW WH add BW add D /HM t D}ie /GL f D /Ph f D /LK LK NW length 1 add add D}{pop exit}ie}loop /fin t D TX SC LK SC sub GI SH RT () ne{GL not{CC}if}if /LC TX length D /WH RT SW pop D CW WH add Hy{HC SW pop add}if LL gt {RT GL{SH cF cS OC 2 copy cS ne E cF ne or{NF}{pop pop}ie Hy{/Ph t D}if /LL LS D}{NL /LL LS D SH}ie} {RT PC Hy{CC}if /Ph Ph Hy or D}ie RT () ne{/GL t D /HM t D}if} {TX SW pop LL le{TX SH}{/NW () D 0 2 TX length 1 sub {/CW E D TX 0 CW GI dup SW pop LL gt{pop NW SH /HM t D NL/LL W XO sub MR sub D /CW CW 2 sub NN D /TX TX CW TX length CW sub GI D TX BS exit} {/NW E D}ie}for}ie}ie /HM t D}D /CC {C0 length 0 gt{JC}if /C0 [C1 L1 YA YB Mf NS NB TB AF Bw] D /C1 () D /L0 L1 D /YA 0 D /YB 0 D /Mf 0 D /NS 0 D /NB 0 D}D /JC {C0 aload length 0 gt{pop pop pop NB add /NB E D NS add /NS E D dup Mf gt{/Mf E D}{pop}ie dup YB gt{/YB E D}{pop}ie dup YA gt{/YA E D}{pop}ie pop C1 join /C1 E D /C0 [] D}if}D /OC {C0 length 0 gt{C1 L1 L0 sub YA YB Mf NS NB TB AF Bw GL C0 aload pop /Bw E D /AF E D /TB E D /NB E D /NS E D /Mf E D /YB E D /YA E D /C0 [] D /L1 E D /C1 E D Ph{HC SH}if NL /GL E D /Bw E D /AF E D /TB E D /NB E D /NS E D /Mf E D /YB E D /YA E D /L1 E D /LL W L1 sub XO sub MR sub WH sub D /CW 0 D C1 E join /C1 E D}if}D /BT {/LB t D dup length string copy RS dup dup () ne E ( ) ne and {/CI 0 D /LS LL D /LL W L1 sub XO sub MR sub D BS} {dup ( ) eq{/GL f D}if dup () eq L1 0 eq or{pop}{SH /BP f D /Ph f D}ie}ie /LB f D} D /BL {CP E pop XO E M} D /NL {JC /GL f D /SK W XO sub MR sub L1 sub TB{Bw add}if D /YA LF{Mf HM Fl not and PF or{LH mul}if}{0 /LF t D}ie YA 2 copy lt{E}if pop D C1 () ne{/FB YB Mf SA{Sf mul}if 4 div 2 copy lt{E}if pop D}if Fl{/Ya YA D}if CP E pop YA sub YB sub LE neg lt Fl not and PB not and{NP}if NT TL BL OU PF not and PB or{/RE L1 TB{Bw sub}if W XO sub MR sub div YA YB add LE BO add div 2 copy lt{E}if pop D RE 1 gt{BL 1 RE div dup scale}if}if AT 2 le{SK AT mul 2 div YA neg R}if AT 3 eq{0 YA neg R TB{/NB NB 1 sub D /NS NS 1 sub D}if /NB NB 1 sub NN D /A3 NS 6 mul NB add D NS NB add 0 eq {/A1 0 D /A2 0 D} {NS 0 eq{/A1 SK NB div dup J gt{pop 0}if D /A2 0 D}{J A3 mul SK lt {/A1 J D /A2 SK J NB mul sub NS div dup Ab gt{/A1 0 D pop 0}if D} {/A1 SK A3 div D /A2 A1 6 mul D}ie}ie}ie /A1 A1 NN D /A2 A2 NN D}if AT 4 eq{0 YA neg R PH 2 le{PD 0 lt{/PD L1 D}if PD M1 gt{/M1 PD D}if L1 PD sub M2 gt{/M2 L1 PD sub D}if}{DV ID 1 sub get 0 ge{Lo 0 R}if}ie}if F0 cF ne Cs cS ne or{F0 Cs NF}if /ms Ms D /Ms f D CP FB sub C1 cvx exec XO EO sub L1 add TB{BW sub}if dup LM gt{/LM E D}{pop}ie PH 0 eq PH 4 eq or Ms and{HF not{/PO t D /AH t D}if BB CP YA add E AT 3 eq LB and{A1 sub}if TB{BW sub}if E BB} {pop pop}ie Ms HM PH 3 eq and or{/BP f D /Fl f D}if /Lo 0 D /L1 0 D /F0 cF D /Cs cS D BP not{0 YB NN neg R}if OU f1 and mF not and{k2 /f1 f D}if OU PF not and PB or{RE 1 gt{RE dup scale}if}if /Ms ms Ms or D /C1 AF{(Cp )}{()}ie D /YA 0 D /YB 0 D BL AT 4 eq LB not and PH 3 ge and {ID DV length lt{DV ID get dup 0 ge{DO E sub /Lo E D /L1 Lo D}{pop}ie /ID ID 1 add D}if}if /T t D CD{/LN LN 1 add D PD}if /PD -1 D /NS 0 D /NB 0 D /TB f D /Ph f D /Mf 0 D /HM f D} D /RS {/TM E D /CN 0 D TM{10 eq{TM CN ( ) PI}if /CN CN 1 add D}forall /CN 0 D /BK HM EN and{0}{1}ie D TM {dup 32 ne{TM CN 3 2 roll put /CN CN 1 add D /BK 0 D} {pop BK 0 eq{TM CN 32 put /CN CN 1 add D}if /BK 1 D}ie}forall TM 0 CN GI dup dup () ne E ( ) ne and {dup CN 1 sub get 32 eq{/EN f D}{/EN t D}ie}if} D /join {2 copy length E length add string dup 4 2 roll 2 index 0 3 index PI E length E PI}d /WR {(\n) search{dup () ne BP not or {Li 4 le CP E pop YI Li mul add LE add 0 lt and PL 0 eq and{NP}if SH NL pop /Li Li 1 sub D WR}{pop pop WR}ie}{SH}ie /CI 0 D /BP f D} D /SH {dup dup () ne E ( ) ne and PF or CS Mf gt and{/Mf CS D}if T not Wf and{( ) E join /T t D}if dup BP{/MF CS D}if AT 3 eq{2 copy length dup 0 gt{/NB E NB add D {( ) search{/NS NS 1 add D pop pop}{pop exit}ie}loop}{pop pop}ie}if CD PD 0 lt and{dup DC search{SW pop /PD E L1 add D pop pop}{pop}ie}if 0 Np dup SW pop L1 add /L1 E D dup () ne {C1 (\() join E join (\)) join AU AF and UF or Wf and{( U ) join}if sF{( s ) join}if ( S ) join /C1 E D dup length 1 sub get 32 eq /TB E D /Bw BW D}{pop pop}ie} D /BG {AI LG BC add add 0 eq} D /ON {OU{Ty AR AI NN get dup 1 add Ln Ns Ty 2 mod 0 eq{(. )}{(\) )}ie join dup SW pop neg 0 R CP E 0 lt{0 E M}{pop}ie CP BB show /Ms t D}if} D /Ln {AR AI 3 -1 roll put}D /SP {dup CI lt BP not and{dup CI sub 0 E R /CI E D}{pop}ie} D /BN {PF{WR /HM f D}{BT NL}ie} D /NN {dup 0 lt{pop 0}if} D /h {(h) HI ST cvs join cvx exec dup 1 get E Nf{0 get E join}{pop}ie} D /H {/fn FN D /Hi E 1 add D 1 sub /HL E D /H2 HL 2 add D /GS EZ H2 get D E Tm H2 get GS mul BE dup 0 gt{1 sub}{pop EG H2 get dup 0 lt{pop AT}if}ie NA WW Np /SL SL 1 add D /FN EF H2 get D GS Ey H2 get FS EU H2 get Sc Hs not HL Hl lt and Hs HL hl lt and or Hi 0 eq or {/HI Hi D /Hs t D /hl HL D /Hv HL D}if HL Hl lt{/hi Hi D}if Nf HI 0 gt and{(h) Hi ST cvs join cvx exec 0 get WB}if /HF t D /AH f D /PO f D} D /EH {Bm H2 get GS mul BE OA /SL SL 1 sub NN D /CF 0 D /FN fn D SZ SL get FR SL get FS /HF f D /GS Ts D ()Ec} D /P {E PF{WR}{PO{EP}{BN}ie Ts 4 mul Np AE not{Tm 0 get Ts mul neg SP}if dup 0 ge AH and{Pi Pd}if}ie 1 sub dup 0 lt{pop AV AL get}if /AT E D /PO t D} D /EP {PF{WR}{BN Ts 4 mul Np}ie AE not{Bm 0 get Ts mul neg SP}if /AT AV AL get D /PO f D} D /BE {E PO{EP}{BN}ie Ts 4 mul Np neg SP} D /HR {/Aw W EO sub D /RW E dup 0 gt{Aw mul}{neg}ie dup Aw gt{pop Aw}if D /RZ E D E BN Ts neg SP 1 sub 2 div Aw RW sub mul EO add CP E pop M PF{0 Ps neg R}if 0 Np OU{gsave RZ LW Cf{Hc VC}{0 Sg}ie CP BB RW 0 RL CP BB stroke grestore}if /CI 0 D /BP f D PF not{Ts neg SP}if /Ms t D} D /AD {I NL EG 14 get dup 0 lt{pop AT}if NA /AE t D Tm 14 get Ts mul neg SP Cf{EU 14 get dup -1 eq{pop CA CL get}if Sc}if} D /DA {BN ()ES OA /AE f D ()Ec Bm 14 get Ts mul neg SP} D /PR {/MW E D /Li E D Tm 1 get Ps mul BE 0 NA /FN Fp D /PF t D SI /SL SL 1 add D /CF 0 D Ps CS mul Ts div MW WC mul CS mul Ts div dup LL gt PL 0 eq and {LL div div}{pop}ie Ey 1 get FS CP E pop LE add YI neg div cvi dup Li lt AH and{4 lt YI Li mul 5 mul LE add 0 gt or PL 0 eq and{NP}if}{pop}ie EU 1 get Sc /GS Ps D}D /RP {WR NL () /PF f D SI /FN 0 D ES Bm 1 get Ps mul neg SP OA /GS Ts D} D /SI {/XO Lm 15 get BC NN mul Lm 16 get AI UI sub NN mul add Lm 17 get UI NN mul add Lm 20 get LG NN mul add Ts mul PF{Lm 1 get Ps mul add}if EO add D /MR Rm 15 get BC NN mul Rm 16 get AI UI sub NN mul add Rm 17 get UI NN mul add Rm 20 get LG NN mul add Ts mul PF{Rm 1 get Ps mul add}if D /LL W XO sub MR sub D} D /DT {/cC E D BN /LG LG 1 sub D SI /LG LG 1 add D WW 2 div Np BL} D /DD {WB Cc 0 eq cC 0 eq and L1 0 eq or Lm 20 get Ts mul L1 sub TB{BW add}if Ts 2 div lt or NL /LF E D SI BL /cC 0 D} D /DL {Dc LG Cc put /Cc E D BG{Tm 18 get Ts mul BE}{BN}ie /LG LG 1 add D BL} D /LD {BN LG 0 gt{/LG LG 1 sub D}if /Cc Dc LG get D SI BG{()Bm 18 get Ts mul BE}if BL} D /UL {BG{Tm 17 get Ts mul BE}{BN}ie NR AI NN 0 put /UI UI 1 add D /AI AI 1 add D SI BL} D /LU {BN /UI UI 1 sub D /AI AI 1 sub D SI BG{()Bm 17 get Ts mul BE}if BL} D /OL {E BG{Tm 16 get Ts mul BE}{BN}ie TR AI NN Ty put /Ty E D NR AI NN 1 put /AI AI 1 add D SI BL 1 Ln} D /LO {BN /AI AI 1 sub D /Ty TR AI get D SI BG{()Bm 16 get Ts mul BE}if BL} D /LI {E BN -1 SP /BP f D /CI 0 D 0 Np NR AI 1 sub NN get 1 eq {dup dup 0 gt E 4 le and{/Ty E D}{pop}ie /L1 L1 Ty AR AI NN get Ns SW pop XO sub dup 0 lt{pop 0}if add D ( ON )} {pop ( B )}ie C1 E join /C1 E D CS Mf gt{/Mf CS D}if BL} D /BQ {Tm 15 get Ts mul BE /BC BC 1 add D SI BL} D /QB {Bm 15 get Ts mul BE /BC BC 1 sub D SI BL} D /Al {E EP 1 sub dup 0 lt{pop AV AL get}if NA} D /Ea {EP OA} D /WB {PF{WR}{BT}ie} D /F1 {WB /FN 0 D CS 0 FS} D /F2 {WB /FN WI D CS 0 FS} D /HY {/Hy t D WB /Hy f D} D /YH {WB} D /A {/LT E D LT 1 eq{/RN E D}if /Lh E D WB /C1 C1 ( Cp ) join D Lc AF not and{Cl Sc}if /AF t D} D /EA {Lc AF and{Ec}{WB}ie TL Pa AF and Lh 0 ne and {( \() Lh join (\)) join /AF f D WB}if /AF f D} D /TL {C1 ( Tl ) apa /C1 E D} d /apa {AF OU and Lh 0 ne LT 1 eq or and{LT 1 eq{RN ( /) E ST cvs join} {(\() Lh join (\)) join}ie E join join}{pop}ie} d /Cp {/Xc CP /Yc E D D} D /SS {Cf{dup 0 ge{EU E get dup -1 eq{pop CA CL get}if}{pop CA CL get}ie Sc} {pop}ie SZ SL get /SL SL 1 add D} D /I {WB 8 SS 1 FS} D /EM {WB 8 SS /CF CF 1 xor D 0 FS} D /BD {WB 9 SS 2 FS} D /TT {WB 10 SS /FN Fp D 0 FS} D /KB {WB 11 SS /FN Fp D 2 FS} D /CT {WB 12 SS 1 FS} D /SM {WB 13 SS /FN Fp D 0 FS} D /Q {/QL QL 1 add D QO QL 2 mod get La get join WB} D /EQ {QC QL 2 mod get La get join WB /QL QL 1 sub D} D /RO {WB -1 SS /CF 0 D 0 FS} D /SY {WB -1 SS -1 FS} D /MY {WB -1 SS -2 FS} D /ES {WB /SL SL 1 sub NN D /CF 0 D /FN FO SL get D SZ SL get FR SL get FS ()Ec}D /FZ {3 sub 1.2 E exp GS mul E WB TL /C1 C1 ( Cp ) join D /SL SL 1 add D 0 FS} D /Ef {WB TL ()ES /C1 C1 ( Cp ) join D} D /BZ {dup /Bf E D FZ}D /Sc {dup -1 ne Cf and{/CL CL 1 add D dup 0 eq{pop [0 0 0]}if dup CA E CL E put VS ( VC ) join C1 E join /C1 E D}{pop}ie} D /Ec {WB Cf{/CL CL 1 sub NN D CA CL get VS ( VC ) join C1 E join /C1 E D}if} D /VS {dup type /arraytype eq{([) E {ST cvs join ( ) join}forall (]) join}if} D /VC {{255 div}forall setrgbcolor} D /Sl {dup type /integertype ne{Ds}if /La E D WB}d /UN {WB /UF t D} D /NU {WB /UF f D} D /SE {WB /sF t D} D /XE {WB /sF f D} D /sM {/C1 C1 ( k1 ) join D}d /eM {/C1 C1 ( k2 ) join D}d /k1 {/YC CP E pop Ts add D /mF t D /f1 t D}d /k2 {gsave 3 LW -9 CP E pop Ts 0.2 mul sub M -9 YC L stroke grestore /mF f D}d /Ac {/AC E D WB}d /Ca {eA{( \()join AC join(\) )join}if WB}d /s {OU{gsave 0 CS .25 mul R dup SW pop CJ 0 RL stroke grestore}if}D /CJ {AT 3 eq LB and{E dup dup length 1 sub A1 mul E {( ) search{pop pop E A2 add E}{pop exit}ie}loop 3 -1 roll add W CP pop sub 2 copy gt{E}if pop}if}D /So {/Co E D} D /SO {C1 Yo ST cvs join ( So ) join /C1 E D (j) SW pop 2 div Pd} D /Se {E WB CS E div Pd}D /Pd {dup type /stringtype eq{SW pop}if dup /L1 E L1 add D ST cvs ( 0 R ) join C1 E join /C1 E D} D /Sp {0.35 CO} D /Sb {-0.2 CO} D /CO {OV Io Yo put /Yo E CS mul Yo add D /Io Io 1 add D -1.5 Io mul 3 add FZ SO CS Yo add dup YA gt{/YA E D}{pop}ie Yo neg dup YB gt{/YB E D}{pop}ie} D /Es {ES /Io Io 1 sub NN D /Yo OV Io get D SO} D /SB {/N2 0 D 0 1 NI{/N E D{IX N2 get 0 lt{/N2 N2 1 add D}{exit}ie}loop /K WS N get FC N get mul D /NY AY N2 get D /BV NY array D 0 1 NY 1 sub{/TM K string D currentfile TM readhexstring pop pop BV E TM put} for BM N BV put /N2 N2 1 add D}for} D /IC [{/MA E D /MB 0 D}{2 div /MA E D /MB MA D}{/MB E CS sub D /MA CS D} {pop /MA YS AB mul D /MB 1 AB sub YS mul D}{pop /MA 0 D /MB 0 D}] D /IP {BV N get /N N 1 add D} D /II {/K E D IX K get 0 lt{/EC E D}if /TY E D TY 4 eq{/Y E D /X E D}if TY 3 eq{/AB E D}if /XW AX K get D /YW AY K get D /IS SG IT K get get D /XS XW IS mul D /YS YW IS mul D YS IC TY get exec /MA MA Fl not{3 add}if D} D /IM {II /ty TY D /xs XS D /ys YS D /ya YA D /yb YB D /ma MA D /mb MB D /k K D /ec EC D /BP f D /CI 0 D WB TL L1 xs add dup XO add MR add W gt {pop /ma ma Fl{3 add}if D NL /YA ma D /YB mb D /YS ys D /L1 xs D} {/L1 E D ma YA gt{/YA ma D}if mb YB gt{/YB mb D}if}ie /TB f D OU{CP E pop YS sub LE neg lt Fl not and PB not and{NP /YA ma D /YB mb D}if /BP f D ty ST cvs ( ) join IX k get 0 lt{(\() join ec join (\) ) join}if k ST cvs join ty 3 eq{AB ST cvs ( ) join E join}if ty 4 eq{X ST cvs ( ) join Y ST cvs join ( ) join E join}if C1 E join ( DI ) join FP 2 eq FP 1 eq AF and or{( FM ) join}if ( Il Cp ) apa /C1 E D /EN f D}if /HM t D /T f D} D /DI {II /Xc CP /Yc E D D /YN YW neg D /HM t D /CI 0 D /K2 IX K get D gsave TY 4 eq{OX X IS mul add OY FY add YS sub Y IS mul sub} {/FY YS D CP MB sub 2 copy /OY E D /OX E D}ie translate K2 0 ge{/DP AZ K2 get D /BV BM K2 get D XS YS scale /N 0 D XW YW DP [XW 0 0 YN 0 YW] {IP} FC K2 get 1 eq{image}{f 3 colorimage}ie} {EX}ie grestore XS 0 R /Ms t D} D /FM {gsave 0 Sg CP MB sub translate XS neg 0 M 0 YS RL XS 0 RL 0 YS neg RL XS neg 0 RL stroke grestore} D /NA {/AT E D /AL AL 1 add D AV AL AT put} D /OA {AL 0 gt{/AL AL 1 sub D /AT AV AL get D}if} D /D1 {/BR {CP E pop E BN Mb{CP E pop eq{0 YI R}if}{pop}ie} D /Sn {OU{C1 E ST cvs join ( Ld ) join /C1 E D}{pop}ie} D} D /D1 {/BR {BN} D /Sn {OU {C1 E ST cvs join ( Ld ) join /C1 E D} {pop} ie} D} D /TC {/TF t D /ML 0 D HN{SW pop dup ML gt{/ML E D}{pop}ie}forall NP /RM RM not D RC /OU Tc D Ep /PN 0 D Ms not TP and{Ip}if /W IW ML sub Ts sub D /A0 0 D TH{/BR {( ) join BT} D /Sn {pop} D /Au () D}if} D /TN {0 eq{E EA PF HF or not XR and{HN E get Xr}{pop}ie} {OU{Tn 0 ge{() BN}if /Tn E D}{pop}ie WB}ie} D /NT {OU LB not and Tn 0 ge and{PL 0 eq{Ms not{CS CF FS}if CP dup /y E YA sub D W 9 sub CS -1.8 mul XO L1 add 2 add{y M (.) show}for HN Tn get dup SW pop IW E sub y M show CP BB M}if /Tn -1 D}if} D /Ld {/DN E D HN DN Pn put [/View [/XYZ -4 Fl{PS}{CP YA add US E pop}ie null] /Dest DN ST cvs cvn /DEST pdfmark} D /C {ND 1 eq{1 sub}if TI mul /XO E D NL Nf not{pop()}if 0 3 -1 roll 1 A} D /OP {BP not{NP}if PN 2 mod 0 eq{/Ms t D NP}if}D /Ep {Xp PN 2 mod 0 eq and OU and{/Pn (-) D showpage /PM 1 D LA}if}D /Dg [73 86 88 76 67 68 77] D /Rd [0 [1 1 0][2 1 0][3 1 0][2 1 1][1 1 1][2 2 1][3 3 1][4 4 1][2 1 2]] D /Ns {/m E D /c E 32 mul D /j m 1000 idiv D /p j 12 add string D c 96 le m 0 gt and{c 32 le {/i 0 D /d 77 D /l 100 D /m m j 1000 mul sub D j -1 1 {pop p i d c add put /i i 1 add D}for 4 -2 0 {/j E D /n m l idiv D /m m n l mul sub D /d Dg j get D n 0 gt {/x Rd n get D x 0 get -1 1 {pop p i d c add put /i i 1 add D}for p i x 1 get sub Dg x 2 get j add get c add put}if /l l 10 idiv D }for p 0 i GI} {/i ST length 1 sub D m {1 sub dup 0 ge{dup 26 mod c add 1 add ST i 3 -1 roll put 26 idiv dup 0 eq{pop exit}if}if /i i 1 sub D}loop ST i ST length i sub GI}ie} {m p cvs}ie} D /US {matrix currentmatrix matrix defaultmatrix matrix invertmatrix matrix concatmatrix transform} D /GB {Gb{US}if}D /Tl {/Rn E D Xc CP pop ne{ [/Rect [Xc 1 sub Yc cS 0.25 mul sub GB CP E 1 add E cS 0.85 mul add GB] /Subtype /Link /Border [0 0 Cf Lc and LX and AU or{0}{1}ie] Rn type /nametype eq {/Dest Rn}{/Action [/Subtype /URI /URI Rn] Cd}ie /ANN pdfmark}if} D /Il {/Rn E D [/Rect [Xc Yc GB Xc XS add Yc YS add GB] /Subtype /Link /Border [0 0 0] Rn type /nametype eq{/Dest Rn} {/Action [/Subtype /URI /URI Rn] Cd}ie /ANN pdfmark} D /XP {[{/Z Bz 2 div D Z 0 R Z Z RL Z neg Z RL Z neg Z neg RL Z Z neg RL Fi cH 1 eq and{fill}if} {Bz 0 RL 0 Bz RL Bz neg 0 RL 0 Bz neg RL Fi cH 1 eq and{fill}if} {0 -5 R Bz 0 RL 0 21 RL Bz neg 0 RL 0 -21 RL}]} D /MS {/Sm E D WB}D /O {BN()0 Sm BX} D /BX {/Bt E D Bt 2 lt{/Ch E D CS 0.8 mul}{11 mul}ie W XO sub MR sub 2 copy gt{E}if pop /HZ E D Bt 2 eq{Fi not{pop()}if ( )E join /Ft E D TT /PF t D /MW 1 D /Li 1 D /Fw Ft SW pop D Fw HZ gt{/HZ Fw 8 add D}if HZ ST cvs( )join}{WB Ch ST cvs( )join}ie L1 HZ add XO add MR add W gt{NL}if Bt 2 eq{Ft ES Fw neg HM{CS sub}if Pd}if Bt ST cvs join( Bx )join Bt 2 eq HM and{CS Pd}if C1 E join /C1 E D /L1 L1 HZ add D /T f D ( ) Pd /PF f D Bt 2 lt{YA CS .8 mul lt{/YA CS .8 mul D}if} {YB 5 lt{/YB 5 D}if YA 21 lt{/YA 21 D}if}ie /CI 0 D} D /Bx {dup 2 eq{E /Bz E D}{E /cH E D /Bz CS .8 mul D}ie OU {gsave 0 Sg XP E get exec stroke grestore}{pop}ie Bz 0 R /Ms t D}D /SD {FD 4 mul Dy add DZ NF newpath 0 0 M DX t charpath pathbbox 3 -1 roll sub /DY E D E dup /X1 E D sub WM mul WX DY mul add WM DG mul E div /DF E D /DR WX DF mul DY mul WM div 2 div D} d /Sd {gsave 0 IL Di mul neg translate IL IW atan Di 0 eq{neg}if rotate FD 4 mul Dy add DZ NF DR X1 sub DY 2 div neg M cD VC DX show grestore} d /Pt {/tp t D Tp{NP /Pn (TP) D 0 Tt neg R Th BN NP Ep ET RC ZF}if /tp f D} D /RC {/AI 0 D /LG 0 D /BC 0 D /UI 0 D /PF f D /Cc 0 D /cC 0 D /Dc 10 array D /NR [0 1 9{pop 0}for] D /La Ds D /AR 10 array D /TR 10 array D /AV 30 array D SI /AL -1 D /AT A0 D AT NA /OV 9 array D /Yo 0 D /Co 0 D /Io 0 D /Hy f D /Ph f D /CL -1 D Ct Sc}D /ZF {/FR [0 1 30{pop 0}for] D /SZ [0 1 30{pop 0}for] D /FO [0 1 30{pop 0}for] D /SL 0 D /CF 0 D /FN 0 D 0 Ts SF}D /QO [[(\234)(\233)(\253\240)(\232)(\273)(\253)][(')(`)(\253\240)(\231)(\273)(\253)]] D /QC [[(\234)(\234)(\240\273)(\233)(\253)(\273)][(')(')(\240\273)(`)(\253)(\273)]] D /Hf EF length 2 sub D /Hz EZ Hf get D /HS Ey Hf get D /Fz EZ Hf 1 add get D /Fs Ey Hf 1 add get D /LE IL D /Ps EZ 1 get D /Fp EF 1 get D /XO 0 D /YI 0 D /CI 0 D /FP 0 D /WW Ts 7 mul D /Mf 0 D /YA 0 D /YB 0 D /Cs Ts D /GS Ts D /F0 0 D /NS 0 D /NB 0 D /N 0 D /C0 [] D /C1 () D /Lo 0 D /L1 0 D /LM 0 D /PH 0 D /EC 0 D /Lh 0 D /LT 0 D /CH 1 string D /ST 16 string D /CA 9 array D /HC (\255) D /HM f D /PF f D /EN f D /TB f D /UF f D /sF f D /AE f D /AF f D /BP t D /CD f D /PA t D /GL f D /T t D /HF f D /AH f D /SA f D /PB f D /f1 f D /mF f D /OX 0 D /OY 0 D /FY 0 D /EO 0 D /FB 0 D /PL 0 D /Bw 0 D /PD -1 D /TP f D /tp f D /TH t D /Ty 4 D /Tn -1 D /Fl t D /LB t D /PM 1 D /Ms f D /Ba f D /Bb f D /Hl 3 D /hl 6 D /Hv 6 D /Hs f D /HI 0 D /hi 0 D /PO t D /TE f D /LF t D /BO 0 D /Sm 1 D /Bf 3 D /A1 0 D /A2 0 D /Ds 1 D /QL -1 D /Cb Db D /Ct Dt D /Cl Dl D [/Creator (html2ps version 1.0 beta5) /Author () /Keywords () /Subject () /Title (Guide pratique du maintien de connexion TCP) /DOCINFO pdfmark /ND 1 D /HN [1 1 54{pop (??)}for] D /h0 [()(Table of Contents)] D /h1 [(0.1\240\240)(Guide pratique du maintien de connexion TCP)] D /h2 [(0.1.1\240\240)( Version fran\347aise du TCP Keepalive HOWTO. )] D /h3 [(0.1.2\240\240)(Fabio Busatto)] D /h4 [(0.1.3\240\240)(Laurent Gauthier)] D /h5 [(0.1.4\240\240)(Eric Deschamps)] D /h6 [(0.1.5\240\240)(Jean-Philippe Gu\351rard)] D /h7 [(0.2\240\240)(1.\240Introduction)] D /h8 [(0.2.1\240\240)(1.1.\240Droits d'utilisation)] D /h9 [(0.2.2\240\240)(1.2.\240Avertissement)] D /h10 [(0.2.3\240\240)(1.3.\240Remerciements et contributions)] D /h11 [(0.2.4\240\240)(1.4.\240Commentaires et corrections)] D /h12 [(0.2.5\240\240)(1.5.\240Traductions)] D /h13 [(0.3\240\240)(2.\240Aper\347u de TCP keepalive)] D /h14 [(0.3.1\240\240)(2.1.\240Qu'est-ce que TCP keepalive ?)] D /h15 [(0.3.2\240\240)(2.2.\240Pourquoi utiliser TCP keepalive ?)] D /h16 [(0.3.3\240\240)(2.3.\240V\351rifier les h\364tes injoignables)] D /h17 [(0.3.4\240\240)(2.4.\240\311viter une d\351connexion due \340 une inactivit\351 r\351seau.)] D /h18 [(0.4\240\240)(3.\240Utiliser TCP keepalive sous Linux)] D /h19 [(0.4.1\240\240)(3.1.\240Configurer le noyau)] D /h20 [(0.4.1.1\240\240)(3.1.1.\240L'interfaceprocfs)] D /h21 [(0.4.1.2\240\240)(3.1.2.\240L'interfacesysctl)] D /h22 [(0.4.2\240\240)(3.2.\240Rendre les modifications persistantes au red\351marrage)] D /h23 [(0.5\240\240)(4.\240Programmer des applications)] D /h24 [(0.5.1\240\240)(4.1.\240Quand votre code requiert keepalive)] D /h25 [(0.5.2\240\240)(4.2.\240L'appel de fonction setsockopt)] D /h26 [(0.5.3\240\240)(4.3.\240Exemples de code)] D /h27 [(0.6\240\240)(5.\240Impl\351menter keepalive sur une application tierce)] D /h28 [(0.6.1\240\240)(5.1.\240Modifier le code source)] D /h29 [(0.6.2\240\240)(5.2.\240libkeepalive: pr\351chargement de biblioth\350que)] D /Hr [-25 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53]D /HV [1 2 3 3 3 3 3 2 3 3 3 3 3 2 3 3 3 3 2 3 4 4 3 2 3 3 3 2 3 3]D /Cn [6 5 0 0 0 0 0 5 0 0 0 0 0 4 0 0 0 0 2 2 0 0 0 3 0 0 0 2 0 0]D Hr length 0 gt{[/PageMode /UseOutlines /DOCVIEW pdfmark}if /Hn 1 D 0 1 Hr length 1 sub{ /Bn E D [Cn Bn get dup 0 gt{/Count E HV Bn get Bl ge{neg}if}{pop}ie /Dest Hr Bn get dup abs ST cvs cvn E 0 ge{(h)Hn ST cvs join cvx exec dup 1 get E Nf{0 get E join}{pop}ie /Hn Hn 1 add D}{()}ie /Title E dup length 255 gt{0 255 getinterval}if /OUT pdfmark}for ZF /FN Fp D Ps 0 FS /WC Wf{( )}{}ie SW pop D ET RC ZF /Df f D /R1 (http://www.gnu.org/licenses/licenses.fr.html#FDL) D /R2 (http://www.gnu.org/licenses/licenses.fr.html#GPL) D /R3 (http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/) D /R4 (http://www.traduc.org/docs/howto/lecture/TCP-Keepalive-HOWTO.html) D /R5 (http://libkeepalive.sourceforge.net/) D /TS { tables E get /table E D table aload pop /rdesc E D /cdesc E D /tdesc E D tdesc aload pop /capalg E D /caption E D /rules E D /frame E D /nfoot E D /nhead E D /ncol E D /nrow E D /border E D /twid E D /units E D /talign E D /flow E D /clear E D /tclass E D pop pop /w W D /eps 0.1 D /OU f D /PL 1 D /FN EF 21 get D EZ 21 get Ey 21 get FS 0 1 1{ /pass E D 0 1 nrow{ /irow E D /cells rdesc irow get 6 get D 0 1 ncol{ /icol E D /cell cells icol get D cell 0 ne{ cell aload pop /ang E D /CB E D pop pop pop /DV E D /bot E D /top E D /right E D /left E D /nowrap E D /valign E D /dp E D /align E D /rspan E D /cspan E D /cclass E D /ctype E D /cmax E D /cmin E D /proc E D rspan 0 eq{/rspan nrow irow sub 1 add D}if cspan 0 eq{/cspan ncol icol sub 1 add D}if pass 0 eq cspan 1 eq and pass 1 eq cspan 1 gt and or{ /W 1e5 D /LL W D /PH 1 D ctype 1 eq{() BD}if RC align NA AT 4 eq{/CD t D /DC dp D /LN 0 D /M1 0 D /M2 0 D}{/CD f D}ie 0 0 M /LM 0 D proc exec BN AT 4 eq{ LN array astore cell 15 3 -1 roll put cdesc icol get dup dup 5 get M1 lt{5 M1 put}{5 get /M1 E D}ie dup 6 get M2 lt{6 M2 put}{6 get /M2 E D}ie /LM M1 M2 add D }if /CD f D ang 0 ne{/LM CP E pop neg D}if /thiswid LM left add right add eps add D /oldmin 0 D /oldmax 0 D 0 1 cspan 1 sub{ icol add cdesc E get dup 2 get /oldmax E oldmax add D 1 get /oldmin E oldmin add D }for thiswid oldmax ge{ 0 1 cspan 1 sub{ icol add cdesc E get dup 2 E 2 get oldmax 0 eq {pop thiswid cspan div}{thiswid mul oldmax div}ie put }for }if nowrap 1 eq{ thiswid oldmin ge{ 0 1 cspan 1 sub{ icol add cdesc E get dup 1 E 1 get oldmin 0 eq {pop thiswid cspan div}{thiswid mul oldmin div}ie put }for }if }{ /W 0 D /LL W D /PH 2 D ctype 1 eq{() ES () BD}if 0 0 M /LM 0 D RC proc exec BN /thiswid LM left add right add eps add D thiswid oldmin ge{ 0 1 cspan 1 sub{ icol add cdesc E get dup 1 E 1 get oldmin 0 eq {pop thiswid cspan div}{thiswid mul oldmin div}ie put }for }if }ie ctype 1 eq{() ES}if }if }if }for }for }for /tmin 0 D /tmax 0 D 0 1 ncol{ cdesc E get dup 1 get E 2 get 2 copy gt{pop dup}if tmax add /tmax E D tmin add /tmin E D }for twid 0 lt{twid neg IW gt{IW neg}{twid}ie /twid E D}if tdesc 0 twid neg tmin 2 copy lt{E}if pop put tdesc 1 twid neg tmax 2 copy lt{E}if pop put /W w D /LL W D /OU t D /PH 0 D /PL 0 D } D /PT { /PL PL 1 add D tables E get /table E D Tm 21 get Ts mul BE PL 2 ge{save}if /SL SL 1 add D /FN EF 21 get D EZ 21 get Ey 21 get FS table aload pop /rdesc E D /cdesc E D /tdesc E D tdesc aload pop /capalg E D /caption E D /rules E D /frame E D /nfoot E D /nhead E D /ncol E D /nrow E D /border E D /twid E D /units E D /talign E D /flow E D /clear E D /tclass E D /tmax E D /tmin E D /w W D /xo XO D /mr MR D /ll LL D /lg LG D /ai AI D /bc BC D /nr NR D /ar AR D /tr TR D /ui UI D /ph PH D /a0 A0 D /pf PF D /at AT D /av AV D /al AL D /Le LE D /la La D talign 0 lt{/talign AL 0 gt{AV AL get}{A0 2 le{A0}{0}ie}ie D}if ph 1 eq ph 2 eq or{ NL ph 1 eq{tmax}{tmin}ie dup XO add LM gt{/LM E XO add D}{pop}ie LM E }{ /PH 3 D /LE 1e5 D RC %ZF border 0 gt{/border 1 D}if /twidth 0 D /avail W xo sub D twid 0 eq{0 1 ncol{cdesc E get dup 2 get E 3 get dup 0 gt{div neg dup twid lt {/twid E D}{pop}ie}{pop pop}ie}for}if /twid twid dup 0 lt{neg avail 2 copy gt{E}if pop}{avail mul}ie D /OK t D 0 1 ncol{cdesc E get dup 1 get E 3 get twid mul gt{/OK f D}if}for 0 1 ncol{ cdesc E get dup 1 get /colmin E D dup 3 get /cwid E twid mul D dup tmax avail le{2 get}if tmin avail le tmax avail gt and{ dup 2 get E 1 get dup 3 1 roll sub avail tmin sub mul tmax tmin sub div add }if tmin avail gt{1 get}if 0 E colmin cwid lt OK and{pop cwid}if dup /twidth E twidth add D put }for /OU f D CP tmin twid le{ 0 1 ncol{cdesc E get dup 0 get twidth div twid mul 0 E put}for /twidth twid D }if CP printcap CP E pop sub /caphig E D pop 0 1 1{ /pass E D 0 1 nrow{ /irow E D /cells rdesc irow get 6 get D 0 1 ncol{ /icol E D /cell cells icol get D cell 0 ne{ cell aload pop /ang E D /CB E D pop pop pop /DV E D /bot E D /top E D /right E D /left E D /nowrap E D /valign E D /dp E D /align E D /rspan E D /cspan E D /cclass E D /ctype E D /cmax E D /cmin E D /proc E D rspan 0 eq{/rspan nrow irow sub 1 add D}if cspan 0 eq{/cspan ncol icol sub 1 add D}if /W 0 D 0 1 cspan 1 sub{icol add cdesc E get 0 get /W E W add D}for pass 0 eq rspan 1 eq and pass 1 eq rspan 1 gt and or{ ctype 1 eq{() BD}if /W W left sub right sub D /XO 0 D /EO 0 D SI /A0 align D RC align NA AT 4 eq{ /DC dp D /DO 0 D /ID 1 D 0 1 DV length 1 sub{DV E get dup DO gt{/DO E D}{pop}ie}for /Lo DO DV 0 get sub D /L1 Lo D }if 0 0 M /BP t D /Fl t D /MF 0 D /FB 0 D proc exec T not{/CI 0 D}if BN 0 FB neg R MF 0 eq{/MF CS D}if CP /thishig E neg bot add top add CI add D pop ang 0 ne{/thishig LM bot add top add D}if cell 16 MF put cell 17 Ya put cell 18 thishig put valign 4 eq{ /below thishig Ya sub D rdesc irow get dup dup 4 get Ya lt {4 Ya put}{4 get /Ya E D}ie dup 5 get below lt{5 below put}{5 get /below E D}ie /thishig Ya below add D }if ctype 1 eq{()ES}if /oldhig 0 D 0 1 rspan 1 sub{ irow add rdesc E get 0 get /oldhig E oldhig add D }for thishig oldhig ge{ 0 1 rspan 1 sub{ irow add rdesc E get dup 0 E 0 get oldhig 0 eq {pop thishig rspan div}{thishig mul oldhig div}ie put }for }if }if }if }for }for }for M RC %ZF /thight 0 D /racc 0 D /maxh 0 D /brk 0 D /rbeg nhead nfoot add D 0 1 nrow{ rdesc E get dup 0 get dup /thight E thight add D brk 0 eq{/racc E D}{/racc E racc add D}ie racc maxh gt{/maxh racc D}if 2 get /brk E D }for ph 3 ge{thight caphig add E}if ph 0 eq ph 4 eq or{ /PH 4 D /LE Le D /OU Ou D /yoff 0 D /headsz 0 D 0 1 nhead 1 sub{rdesc E get 0 get headsz add /headsz E D}for /footsz 0 D 0 1 nfoot 1 sub{rdesc E nhead add get 0 get footsz add /footsz E D}for /ahig LE BO add MI add D /maxh maxh headsz add footsz add D /thight thight headsz add footsz add D tmin avail gt maxh ahig gt or {/Sf avail tmin div dup ahig maxh div gt{pop ahig maxh div}if D /SA t D} {/Sf 1 D}ie tclass 1 eq thight LE 15 sub gt and {/SA t D LE 15 sub thight div dup Sf lt{/Sf E D}{pop}ie}if SA{Sf Sf scale /ll ll Sf div D /xo xo Sf div D /LE LE Sf div D /mr mr Sf div D /BO BO Sf div D /ahig ahig Sf div D}if nhead nfoot add getwid LE CP E pop add capalg 0 eq{caphig sub}if bT{f}{dup thight lt thight ahig lt and}ie E headsz sub footsz sub rwid lt or{NP}if capalg 0 eq{printcap -8 SP}if CP /ycur E D pop printhead rbeg 1 nrow{/row E D row getwid ycur yoff add rwid sub footsz sub LE add 0 lt {nfoot 0 gt{printfoot}if Tf NP /rbeg irow1 D Ba{MI /MI MI SA{Sf div}if D MI SP /MI E D}if CP /ycur E D pop /yoff 0 D printhead}if irow1 printrow }for printfoot /row row 1 add D Tf 0 ycur yoff add M capalg 1 eq{/EO 0 D SI -3 SP printcap}if Sf 1 lt{1 Sf div dup scale /ll ll Sf mul D /xo xo Sf mul D /LE LE Sf mul D /mr mr Sf mul D /BO BO Sf mul D /SA f D}if /EO 0 D }if }ie /W w D /XO xo D /MR mr D /LL ll D /LG lg D /AI ai D /BC bc D /NR nr D /AR ar D /TR tr D /UI ui D /PH ph D /A0 a0 D /PF pf D /AT at D /AV av D /AL al D /La la D /SL SL 1 sub NN D /CF 0 D /FN 0 D SZ SL get FR SL get FS Wf not{()F2}if PL 2 ge{Ms E restore Ms or /Ms E D PH 1 eq PH 2 eq or {/LM E D}if PH 3 ge{/CI 0 D NL 0 E neg R}if }if /PL PL 1 sub D /CI 0 D /BP f D /PO f D () Bm 21 get Ts mul BE BL %CF CS SF } D /printcap{ capalg 0 ge{ SA{/W w Sf div D} {talign 1 eq{/XO xo ll twidth sub 2 div add D}if talign 2 eq{/XO xo ll twidth sub add D}if /W XO twidth add D }ie /XO xo D /LL W XO sub MR sub D /PA f D /Fl capalg 0 eq D 1 NA BL caption exec BN OA /PA t D }if } D /getwid{ /irow1 E D /irow2 irow1 D /rwid 0 D {rdesc irow2 get dup 0 get rwid add /rwid E D 2 get 0 eq {exit}{/irow2 irow2 1 add D}ie }loop } D /printrow{ /xoff ll twidth PL 2 ge{Sf div}if sub talign mul 2 div D /xleft xoff xo add D /irow E D /cells rdesc irow get 6 get D 0 1 ncol{ /icol E D /cell cells icol get D cell 0 ne{ cell aload pop /ang E D /CB E D /cvsize E D /above E D /fontsz E D /DV E D /bot E D /top E D /right E D /left E D /nowrap E D /valign E D /dp E D /align E D /rspan E D /cspan E D /cclass E D /ctype E D /cmax E D /cmin E D /proc E D rspan 0 eq{/rspan nrow irow sub 1 add D}if cspan 0 eq{/cspan ncol icol sub 1 add D}if /width 0 D 0 1 cspan 1 sub{icol add cdesc E get 0 get /width E width add D}for /rhight rdesc irow get 0 get D /hight rhight D 1 1 rspan 1 sub{irow add rdesc E get 0 get /hight E hight add D}for /W xo xoff add width add right sub D ang 0 ne{/W xo xoff add hight add right sub D}if /EO xo xoff add left add D SI Cf{ gsave CB VC xo xoff add ycur yoff add M 0 hight neg RL width 0 RL 0 hight RL width neg 0 RL fill grestore }if ctype 1 eq{() BD}if /A0 align D RC AT 4 eq{ /DC dp D /ID 1 D /DO cdesc icol get 5 get D /Lo DO DV 0 get sub D /L1 Lo D }if ang 0 ne{ gsave ang 90 eq {xoff ycur add hight cvsize sub 2 div sub ycur hight sub xoff sub} {xoff ycur sub width add hight cvsize sub 2 div add ycur xoff add}ie translate ang rotate }if valign 3 le{0 ycur yoff add top sub hight cvsize sub valign 1 sub mul 2 div sub M} {0 ycur yoff add top sub above add rdesc irow get 4 get sub M}ie /PA f D /BP t D /Fl t D BL proc exec BN ang 0 ne{grestore}if /PA t D ctype 1 eq{() ES}if }if /xoff xoff cdesc icol get 0 get add D }for /yoff yoff rhight sub D } D /printhead {0 1 nhead 1 sub{printrow}for} D /printfoot {nhead 1 nhead nfoot add 1 sub{printrow}for} D /Tf { OU{rules 2 ge{/yoff 0 D gsave 0 Sg [0 1 nhead 1 sub{}for rbeg 1 row 1 sub{}for nhead 1 nhead nfoot add 1 sub{}for]{ /irow E D /xoff ll twidth PL 2 ge{Sf div}if sub talign mul 2 div D /cells rdesc irow get 6 get D 0 1 ncol{ /icol E D /cell cells icol get D cell 0 ne{ /rspan cell 6 get D /cspan cell 5 get D rspan 0 eq{/rspan nrow irow sub 1 add D}if cspan 0 eq{/cspan ncol icol sub 1 add D}if /width 0 D 0 1 cspan 1 sub{icol add cdesc E get 0 get /width E width add D}for /rhight rdesc irow get 0 get D /hight rhight D 1 1 rspan 1 sub{irow add rdesc E get 0 get /hight E hight add D}for xo xoff add width add ycur yoff add M 0 hight neg icol cspan add 1 sub ncol lt {cdesc icol 1 add get 4 get dup rules 3 le{1 eq}{pop t}ie {1 eq{0.8}{0.3}ie LW RL CP stroke M}{pop R}ie}{R}ie irow nhead nfoot add 1 sub ne nfoot 0 eq or {irow rspan add 1 sub nrow lt {rdesc irow rspan add get 3 get}{nfoot 0 eq{0}{1}ie}ie dup rules 2 mod 0 eq{1 eq}{pop t}ie {1 eq irow rspan add nhead eq or irow rspan add row eq nfoot 0 gt and or {0.8}{0.3}ie LW width neg 0 RL CP stroke M}{pop}ie}if }if /xoff xoff cdesc icol get 0 get add D }for /yoff yoff rhight sub D }forall grestore /Ms t D }if frame 1 gt{ gsave 1 LW 0 Sg xleft ycur M CP BB 0 yoff frame 5 eq frame 7 ge or{RL}{R}ie twidth 0 frame 3 eq frame 4 eq or frame 8 ge or{RL}{R}ie CP BB 0 yoff neg frame 6 ge{RL}{R}ie twidth neg 0 frame 2 eq frame 4 eq or frame 8 ge or{RL}{R}ie closepath stroke grestore /Ms t D }if }if } D /tables [[[0 0 0 0 0 -1 0 1 1 4 2 0 0 9 5 {()} -1] [[0 0 0 0 0 0 0][0 0 0 0 0 0 0][0 0 0 0 0 0 0]] [[0 0 0 0 0 0 [[{()2 Sl()WB()BD(Histo)HY(rique)YH( des versions)ES()} 0 0 1 0 3 1 0 (.) 1 0 4 4 2 6 0 0 0 0 Db 0 ] 0 0 ]] [0 0 0 0 0 0 [[{()2 Sl()WB(Version 1.0.fr.1.0)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] [{()2 Sl()WB(2008-05-02)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] [{()2 Sl()WB(LG, ED, JPG)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] ]] [0 0 0 0 0 0 [[{()2 Sl()WB( Premi\350re adap)HY(ta)HY(tion)YH( fran\347aise. )} 0 0 0 0 3 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] 0 0 ]] [0 0 0 0 0 0 [[{()2 Sl()WB(Version 1.0)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] [{()2 Sl()WB(2007-05-04)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] [{()2 Sl()WB(FB)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] ]] [0 0 0 0 0 0 [[{()2 Sl()WB( Premi\350re \351dition, r\351vis\351e par TM. )} 0 0 0 0 3 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] 0 0 ]] ]] ] D 0 1 0{TS}for RC ZF /Ba f D /BO 0 D Bs /UR (TCP-Keepalive-HOWTO.html.iso-8859-1) D /Ti (Guide pratique du maintien de connexion TCP) D /Au () D /Df f D /ME [()] D /Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc Pt /Ba f D /BO 0 D Bs /UR (TCP-Keepalive-HOWTO.html.iso-8859-1) D /Ti (Guide pratique du maintien de connexion TCP) D /Au () D /Df f D /ME [()] D NP RC ZF ()1 Sl()WB 0 Sn()2 Sl()BR()BR()BR()BR()0 2 0 H(Guide)WB 25 Sn()WB 1 Sn( pratique du main)HY(tien)YH( de connexion TCP)EH()BR()BR()0 3 1 H()WB 26 Sn()I( Version fran\347aise du )EM(TCP Keepa)HY(live)YH( HOWTO)ES(. )ES()EH()BR()BR()BR()0 3 2 H(Fabio)WB 27 Sn( Busatto)EH()BR()BR()0 P()SM(<)0 2 A(fabio.busatto@siku)HY(rezza)YH(.org)EA(>)ES()EP()BR()BR()BR()BR()BR()BR()0 3 3 H(Laurent)WB 28 Sn( Gauthier)EH(Adap)HY(ta)HY(tion)YH( fran\347aise\240)SM(<)0 2 A(laurent POINT mail CHEZ gmail POINT com)EA(>)ES()BR()BR()BR()BR()0 3 4 H(Eric)WB 29 Sn( Deschamps)EH(Relec)HY(ture)YH( de la version fran\347aise\240)SM(<)0 2 A(erdesc CHEZ free POINT fr)EA(>)ES()BR()BR()BR()BR()0 3 5 H(Jean-Philippe)WB 30 Sn( Gu\351rard)EH(Pr\351pa)HY(ra)HY(tion)YH( de la publi)HY(ca)HY(tion)YH( de la v.f.\240)SM(<)0 2 A(fevrier CHEZ tigre)HY(raye)YH( POINT org)EA(>)ES()BR()BR()BR()0 P(Version\240: 1.0.fr.1.0)EP()BR()BR()0 P(2007-05-04)EP()BR()BR()BR()0 PT()BR()BR()BR()BR()0 P()BD(R\351sum\351)ES()EP()0 P( Ce docu)HY(ment)YH( d\351crit l'impl\351)HY(men)HY(ta)HY(tion)YH( du TCP keepa)HY(live)YH( dans le noyau linux, pr\351sente le concept global et d\351taille \340 la fois la confi)HY(gu)HY(ra)HY(tion)YH( syst\350me et le d\351ve)HY(lop)HY(pe)HY(ment)YH( d'appli)HY(ca)HY(tion)YH(. )EP()BR()BR()BR()2 0.6 1 HR()BR()BR()0 P()BD(Table des mati\350res)ES()EP()0 DL()0 DT()0 2 1 A(1. Intro)HY(duc)HY(tion)YH()2 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 3 1 A(1.1. Droits d'utili)HY(sa)HY(tion)YH()3 0 TN TL()Ec /AF f D()0 DT()0 4 1 A(1.2. Aver)HY(tis)HY(se)HY(ment)YH()4 0 TN TL()Ec /AF f D()0 DT()0 5 1 A(1.3. Remer)HY(cie)HY(ments)YH( et contri)HY(bu)HY(tions)YH()5 0 TN TL()Ec /AF f D()0 DT()0 6 1 A(1.4. Commen)HY(taires)YH( et correc)HY(tions)YH()6 0 TN TL()Ec /AF f D()0 DT()0 7 1 A(1.5. Traduc)HY(tions)YH()7 0 TN TL()Ec /AF f D()LD()0 DT()0 8 1 A(2. Aper\347u de TCP keepa)HY(live)YH()8 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 9 1 A(2.1. Qu'est-ce que TCP keepa)HY(live)YH( ?)9 0 TN TL()Ec /AF f D()0 DT()0 10 1 A(2.2. Pourquoi utili)HY(ser)YH( TCP keepa)HY(live)YH( ?)10 0 TN TL()Ec /AF f D()0 DT()0 11 1 A(2.3. V\351ri)HY(fier)YH( les h\364tes injoi)HY(gnables)YH()11 0 TN TL()Ec /AF f D()0 DT()0 12 1 A(2.4. \311viter une d\351con)HY(nexion)YH( due \340 une inac)HY(ti)HY(vit\351)YH( r\351seau.)12 0 TN TL()Ec /AF f D()LD()0 DT()0 13 1 A(3. Utili)HY(ser)YH( TCP keepa)HY(live)YH( sous Linux)13 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 14 1 A(3.1. Confi)HY(gu)HY(rer)YH( le noyau)14 0 TN TL()Ec /AF f D()0 DT()0 17 1 A(3.2. Rendre les modi)HY(fi)HY(ca)HY(tions)YH( persis)HY(tantes)YH( au red\351)HY(mar)HY(rage)YH()17 0 TN TL()Ec /AF f D()LD()0 DT()0 18 1 A(4. Program)HY(mer)YH( des appli)HY(ca)HY(tions)YH()18 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 19 1 A(4.1. Quand votre code requiert keepa)HY(live)YH()19 0 TN TL()Ec /AF f D()0 DT()0 20 1 A(4.2. L'appel de fonc)HY(tion)YH( )SM(setso)HY(ckopt)YH()ES()20 0 TN TL()Ec /AF f D()0 DT()0 21 1 A(4.3. Exemples de code)21 0 TN TL()Ec /AF f D()LD()0 DT()0 22 1 A(5. Impl\351)HY(men)HY(ter)YH( keepa)HY(live)YH( sur une appli)HY(ca)HY(tion)YH( tierce)22 0 TN TL()Ec /AF f D()DD()0 DL()0 DT()0 23 1 A(5.1. Modi)HY(fier)YH( le code source)23 0 TN TL()Ec /AF f D()0 DT()0 24 1 A(5.2. libkee)HY(pa)HY(live)YH(: pr\351char)HY(ge)HY(ment)YH( de biblio)HY(th\350que)YH()24 0 TN TL()Ec /AF f D()LD()LD()BR()2 Sl()BR()BR()BR()BR()0 2 6 H(1.\240Intro)WB 31 Sn()HY(duc)HY(tion)YH()WB 2 Sn()EH()BR()BR()BR()0 P( Comprendre TCP keepa)HY(live)YH( n'est pas indis)HY(pen)HY(sable)YH( dans la plupart des cas, mais cela peut \352tre tr\350s utile dans certaines circons)HY(tances)YH(. Il vous faudra poss\351)HY(der)YH( quelques notions de base des r\351seaux TCP/IP et de la program)HY(ma)HY(tion)YH( en langage C pour comprendre toutes les sections de ce docu)HY(ment)YH(. )EP()0 P( Le prin)HY(ci)HY(pal)YH( objec)HY(tif)YH( de ce tuto)HY(riel)YH( \201HOWTO\202 est de d\351crire en d\351tail le TCP keepa)HY(live)YH( et de pr\351sen)HY(ter)YH( diff\351)HY(rents)YH( cas d'appli)HY(ca)HY(tion)YH(. Apr\350s avoir d\351but\351 avec un peu de th\351orie, le propos se concentre sur l'impl\351)HY(men)HY(ta)HY(tion)YH( des routines TCP keepa)HY(live)YH( dans les noyaux Linux actuels \2012.4.x, 2.6.x\202, et sur les moyens dont les admi)HY(nis)HY(tra)HY(teurs)YH( syst\350me peuvent tirer parti de ces routines, avec des exemples de confi)HY(gu)HY(ra)HY(tion)YH( pr\351cis et des astuces. )EP()0 P( La seconde partie de ce tuto)HY(riel)YH( met en jeu l'inter)HY(face)YH( de program)HY(ma)HY(tion)YH( propo)HY(s\351e)YH( par le noyau Linux, et le mode d'\351cri)HY(ture)YH( des appli)HY(ca)HY(tions)YH( qui impl\351)HY(mentent)YH( le TCP keepa)HY(live)YH( en langage C. Des exemples pratiques sont pr\351sen)HY(t\351s)YH(, et une approche du projet )SM(libkee)HY(pa)HY(live)YH()ES( est amorc\351e, permet)HY(tant)YH( aux appli)HY(ca)HY(tions)YH( de b\351n\351)HY(fi)HY(cier)YH( par h\351ri)HY(tage)YH( du keepa)HY(live)YH( sans modi)HY(fi)HY(ca)HY(tion)YH( de code. )EP()2 Sl()BR()BR()BR()BR()0 3 7 H(1.1.\240Droits)WB 32 Sn()WB 3 Sn( d'utili)HY(sa)HY(tion)YH()EH()BR()BR()BR()0 P( Les droits de ce docu)HY(ment)YH(, TCP Keepa)HY(live)YH( HOWTO, sont d\351pos\351s sous copy)HY(right)YH( \201c\202 2007 par Fabio Busatto. Il est permis de copier, distri)HY(buer)YH( et/ou modi)HY(fier)YH( ce docu)HY(ment)YH( dans le cadre de la Licence de Docu)HY(men)HY(ta)HY(tion)YH( Libre GNU, Version 1.1 ou ult\351)HY(rieure)YH( publi\351e par la Free Soft)HY(ware)YH( Foun)HY(da)HY(tion)YH(; aucune section inva)HY(riable)YH(, pas de texte de couver)HY(ture)YH(. Un exem)HY(plaire)YH( de la licence est dispo)HY(nible)YH( \340 l'adresse )R1 2 A( http://www.gnu.org/licenses/licenses.fr.html#GPL)EA(. )EP()0 P( Le code source inclus dans ce docu)HY(ment)YH( rel\350ve de la licence publique g\351n\351)HY(rale)YH( \201GPL\202 GNU General Public License, Version 2 ou ult\351)HY(rieure)YH( publi\351e par la Free Soft)HY(ware)YH( Foun)HY(da)HY(tion)YH(. Un exem)HY(plaire)YH( de la licence est dispo)HY(nible)YH( \340 l'adresse )R2 2 A( http://www.gnu.org/licenses/licenses.fr.html#GPL)EA(. )EP()0 P( Linux est une marque d\351pos\351e de Linus Torvalds. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 8 H(1.2.\240Aver)WB 33 Sn()HY(tis)HY(se)HY(ment)YH()WB 4 Sn()EH()BR()BR()BR()0 P( Aucune respon)HY(sa)HY(bi)HY(lit\351)YH( rela)HY(tive)YH( au contenu du pr\351sent docu)HY(ment)YH( ne sera endos)HY(s\351e)YH(. L'utili)HY(sa)HY(tion)YH( des concepts, exemples et infor)HY(ma)HY(tions)YH( est \340 vos propres risques. Des erreurs ou impr\351)HY(ci)HY(sions)YH( peuvent endom)HY(ma)HY(ger)YH( votre syst\350me. Agissez avec pr\351cau)HY(tion)YH(, et m\352me si cela est peu commun, l'auteur n'endosse aucune respon)HY(sa)HY(bi)HY(lit\351)YH( \201NdT : le traduc)HY(teur)YH( non plus\202. )EP()0 P( Tous les droits sont d\351tenus par leurs propri\351)HY(taires)YH( respec)HY(tifs)YH(, sauf mention parti)HY(cu)HY(li\350re)YH(. L'utili)HY(sa)HY(tion)YH( de termes de ce docu)HY(ment)YH( ne doit pas \352tre consi)HY(d\351)HY(r\351e)YH( comme une atteinte \340 la vali)HY(dit\351)YH( d'une marque d\351pos\351e ou marque de service. Citer un produit ou une marque ne devrait pas \352tre consi)HY(d\351r\351)YH( comme r\351pr\351)HY(hen)HY(sible)YH(. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 9 H(1.3.\240Remer)WB 34 Sn()HY(cie)HY(ments)YH()WB 5 Sn( et contri)HY(bu)HY(tions)YH()EH()BR()BR()BR()0 P( Ce travail ne doit \340 personne que je devrais remer)HY(cier)YH(. Mais il doit \340 ma vie, et \340 mon savoir aussi: donc, merci \340 chacun m'ayant soutenu, avant ma nais)HY(sance)YH(, actuel)HY(le)HY(ment)YH(, ou dans le futur. Sinc\350)HY(re)HY(ment)YH(. )EP()0 P( Un merci tout sp\351cial \340 Tabatha, la femme patiente qui a lu mon travail et fait les correc)HY(tions)YH( n\351ces)HY(saires)YH(. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 10 H(1.4.\240Commen)WB 35 Sn()HY(taires)YH()WB 6 Sn( et correc)HY(tions)YH()EH()BR()BR()BR()0 P( Vos retours sur ce docu)HY(ment)YH( seront les bien)HY(ve)HY(nus)YH(. Adres)HY(sez)YH( vos ajouts, commen)HY(taires)YH( et remarques \340 l'auteur \340 l'adresse mail suivante : )SM(<)0 2 A(fabio.busatto@siku)HY(rezza)YH(.org)EA(>)ES(. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 11 H(1.5.\240Traduc)WB 36 Sn()HY(tions)YH()WB 7 Sn()EH()BR()BR()BR()0 P( Si vous \352tes int\351)HY(ress\351)YH( par la traduc)HY(tion)YH( de ce HOWTO en d'autres langues, n'h\351sitez pas \340 me contac)HY(ter)YH(. Votre contri)HY(bu)HY(tion)YH( sera la bien)HY(ve)HY(nue)YH(. )EP()0 P( Langues dispo)HY(nibles)YH( : )BR()UL()0 P()-1 LI( )R3 2 A( anglais \201docu)HY(ment)YH( original\202 )EA( )EP()0 P()-1 LI( )R4 2 A( fran\347ais )EA( )EP()LU()BR( )EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 12 H(2.\240Aper\347u)WB 37 Sn()WB 8 Sn( de TCP keepa)HY(live)YH()EH()BR()BR()BR()0 P( Afin de comprendre ce que fait TCP keepa)HY(live)YH( \201que nous appel)HY(le)HY(rons)YH( 'keepa)HY(live)YH('\202, vous n'avez besoin que d'en lire le nom : keep TCP alive \201main)HY(te)HY(nir)YH( TCP en vie\202, c'est \340 dire conser)HY(ver)YH( la connexion TCP. Cela signi)HY(fie)YH( que vous serez en mesure de v\351ri)HY(fier)YH( l'\351tat de votre socket de connexion \201appel\351e aussi socket TCP\202, et de d\351ter)HY(mi)HY(ner)YH( si la connexion est toujours \351tablie ou si elle est rompue. )EP()2 Sl()BR()BR()BR()BR()0 3 13 H(2.1.\240Qu'est-ce)WB 38 Sn()WB 9 Sn( que TCP keepa)HY(live)YH( ?)EH()BR()BR()BR()0 P( Le concept du keepa)HY(live)YH( est tr\350s simple: lorsque vous initiez une connexion TCP, vous y asso)HY(ciez)YH( un jeu de chro)HY(no)HY(m\350tres)YH(. Certains de ces chro)HY(no)HY(m\350tres)YH( ont trait \340 la proc\351)HY(dure)YH( du keepa)HY(live)YH(. Quand la dur\351e maxi)HY(male)YH( du keepa)HY(live)YH( est atteinte, vous adres)HY(sez)YH( \340 l'h\364te distant un paquet sonde de keepa)HY(live)YH( ne conte)HY(nant)YH( aucune donn\351e, avec le bit ACK posi)HY(tionn\351)YH(. Cela est possible gr\342ce aux parti)HY(cu)HY(la)HY(ri)HY(t\351s)YH( de TCP/IP, une sorte de ACK doubl\351, et l'h\364te distant n'aura aucun argu)HY(ment)YH(, puisque TCP est un proto)HY(cole)YH( orient\351 flux. En retour vous aurez une r\351ponse de l'h\364te distant \201qui n'a nul besoin d'impl\351)HY(men)HY(ter)YH( le keepa)HY(live)YH(, mais seule)HY(ment)YH( TCP/IP\202, sans donn\351e, et le ACK posi)HY(tionn\351)YH(. )EP()0 P( Si vous recevez une r\351ponse \340 votre sonde keepa)HY(live)YH(, vous pouvez \352tre certain que la connexion est toujours \351tablie et active sans inqui\351)HY(tude)YH( pour le niveau appli)HY(ca)HY(tif)YH(. Concr\350)HY(te)HY(ment)YH(, TCP permet de main)HY(te)HY(nir)YH( un flux, sans paquet, donc un paquet de longueur z\351ro n'est pas dange)HY(reux)YH( pour le programme utili)HY(sa)HY(teur)YH(. )EP()0 P( Cette m\351thode est utile car si les autres points distants perdent leurs connexions \201en raison d'un red\351)HY(mar)HY(rage)YH( par exemple\202 vous d\351tec)HY(te)HY(rez)YH( que la connexion est rompue, m\352me sans avoir de flux de donn\351e. Si les sondes keepa)HY(live)YH( n'obtiennent pas de r\351ponse, vous pouvez certi)HY(fier)YH( que la connexion ne peut plus \352tre consi)HY(d\351)HY(r\351e)YH( comme valide et agir en cons\351quence. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 14 H(2.2.\240Pourquoi)WB 39 Sn()WB 10 Sn( utili)HY(ser)YH( TCP keepa)HY(live)YH( ?)EH()BR()BR()BR()0 P( Vous pouvez vivre plut\364t heureux sans keepa)HY(live)YH(, donc si vous lisez ces lignes, soit vous essayez de comprendre si keepa)HY(live)YH( est une r\351ponse possible \340 vos probl\350mes, soit vous n'avez rien de plus int\351)HY(res)HY(sant)YH( \340 faire et c'est bien aussi. :\202 )EP()0 P( Keepa)HY(live)YH( est non invasif, et dans la plupart des cas, si vous avez un doute, vous pouvez l'activer sans risque d'erreur. mais souve)HY(nez)YH( vous que c'est g\351n\351)HY(ra)HY(teur)YH( de flux suppl\351)HY(men)HY(taire)YH(, ce qui peut avoir un impact sur les routeurs et les pare-feu. )EP()0 P( En r\351sum\351, utili)HY(sez)YH( vos m\351ninges et soyez prudent. )EP()0 P( Dans la section suivante nous distin)HY(gue)HY(rons)YH( les deux objec)HY(tifs)YH( de keepa)HY(live)YH(: )BR()UL()0 P()-1 LI(S'assurer qu'un h\364te distant n'est pas injoi)HY(gnable)YH()EP()0 P()-1 LI(\311viter une d\351con)HY(nexion)YH( due \340 une inac)HY(ti)HY(vit\351)YH( r\351seau.)EP()LU()BR( )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 15 H(2.3.\240V\351ri)WB 40 Sn()HY(fier)YH()WB 11 Sn( les h\364tes injoi)HY(gnables)YH()EH()BR()BR()BR()0 P( Keepa)HY(live)YH( peut \352tre utilis\351 pour \352tre averti que l'h\364te distant est mort avant qu'il soit capable de vous le noti)HY(fier)YH(. Cela pour)HY(rait)YH( se produire en diff\351)HY(rentes)YH( circons)HY(tances)YH(, une panique noyau ou une inter)HY(rup)HY(tion)YH( soudaine du proces)HY(sus)YH( main)HY(te)HY(nant)YH( la connexion par exemple. Un autre cas justi)HY(fiant)YH( keepa)HY(live)YH( pour d\351tec)HY(ter)YH( que l'h\364te distant n'est pas joignable est la d\351faillance du r\351seau. Dans ce cas, si le r\351seau n'est pas \340 nouveau op\351ra)HY(tion)HY(nel)YH(, vous \352tes dans la m\352me situa)HY(tion)YH( que pour la mort de l'h\364te distant. C'est dans ces cas de figure que les m\351ca)HY(nismes)YH( TCP clas)HY(siques)YH( ne permettent pas de s'assurer de l'\351tat d'une connexion. )EP()0 P( Songez \340 une simple connexion TCP entre l'h\364te A et l'h\364te B: il y a la poign\351e de main initiale en trois phases, le paquet SYN de A vers B, le SYN/ACK en retour de B vers A, et le ACK final de A vers B. A ce stade, nous sommes dans une situa)HY(tion)YH( stable : la connexion est \351tablie, et les donn\351es peuvent donc \352tre envoy\351es sur ce lien. Mais le probl\350me survient : d\351bran)HY(chez)YH( l'alimen)HY(ta)HY(tion)YH( de B et instan)HY(ta)HY(n\351)HY(ment)YH( il s'\351teint, sans rien envoyer sur le r\351seau pour noti)HY(fier)YH( A que la connexion va \352tre inter)HY(rom)HY(pue)YH(. A, de son c\364t\351, est pr\352t \340 envoyer des donn\351es, et n'imagine pas que B est muet. Main)HY(te)HY(nant)YH( rebran)HY(chez)YH( l'alimen)HY(ta)HY(tion)YH( de B et atten)HY(dez)YH( que le syst\350me red\351)HY(marre)YH(. A et B sont de retour, mais A pr\351sente une connexion toujours active vers B, alors que B l'ignore. La situa)HY(tion)YH( se r\351sout d'elle-m\352me lorsque A tente d'envoyer des donn\351es \340 B sur une connexion morte, et que B r\351pond par un paquet RST, for\347ant A \340 fina)HY(le)HY(ment)YH( mettre fin \340 la connexion. )EP()0 P( Keepa)HY(live)YH( peut vous noti)HY(fier)YH( quand un desti)HY(na)HY(taire)YH( devient injoi)HY(gnable)YH( sans risque de faux positif. En fait, si le probl\350me tient au r\351seau entre les deux h\364tes, le r\364le du keepa)HY(live)YH( est d'attendre un temps pour tenter \340 nouveau, adres)HY(sant)YH( le paquet keepa)HY(live)YH( avant de noti)HY(fier)YH( de la rupture du lien. )EP()0 P( ) 16 65 PR( _____ _____ | | | | | A | | B | |_____| |_____| ^ ^ |--->--->--->-------------- SYN -------------->--->--->---| |---<---<---<------------ SYN/ACK ------------<---<---<---| |--->--->--->-------------- ACK -------------->--->--->---| | | | le syst\350me meurt ---> X | | le syst\350me red\351marre ---> ^ | | |--->--->--->-------------- PSH -------------->--->--->---| |---<---<---<-------------- RST --------------<---<---<---| | |)RP( )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 16 H(2.4.\240\311viter)WB 41 Sn()WB 12 Sn( une d\351con)HY(nexion)YH( due \340 une inac)HY(ti)HY(vit\351)YH( r\351seau.)EH()BR()BR()BR()0 P( L'autre objec)HY(tif)YH( utile de keepa)HY(live)YH( est d'\351viter que l'inac)HY(ti)HY(vit\351)YH( ne provoque une d\351con)HY(nexion)YH(. C'est un cas fr\351quent d'\352tre d\351con)HY(nect\351)YH( sans raison lorsque vous vous trouvez derri\350re un proxy NAT ou un pare-feu. Ce compor)HY(te)HY(ment)YH( est d\373 aux proc\351)HY(dures)YH( de surveillance des connexions des proxies et pare-feu, qui tiennent un inven)HY(taire)YH( des connexions qui les traverse. En raison des limites physiques de leurs ressources, ces machines ne peuvent conser)HY(ver)YH( en m\351moire qu'un nombre d\351ter)HY(min\351)YH( de connexions. La r\350gle la plus courante et la plus logique est de main)HY(te)HY(nir)YH( les connexions les plus r\351centes et de mettre d'abord fin aux connexions les plus anciennes ou inac)HY(tives)YH(. )EP()0 P( Pour revenir \340 nos h\364tes A et B, recon)HY(nec)HY(tons)YH( les. Une fois le lien \351tabli, atten)HY(dons)YH( qu'un \351v\350ne)HY(ment)YH( se produise pour le trans)HY(mettre)YH( \340 l'h\364te distant. Qu'en est-il si cet \351v\350ne)HY(ment)YH( se produit apr\350s un long moment ? Notre connexion a sa propre dur\351e, qui est incon)HY(nue)YH( du proxy. Lorsque nous finis)HY(sons)YH( par trans)HY(mettre)YH( des donn\351es, le proxy n'est plus capable de les traiter correc)HY(te)HY(ment)YH(, et la connexion est rompue. )EP()0 P( Puisque le fonc)HY(tion)HY(ne)HY(ment)YH( normal est de mettre en t\352te de liste la connexion par laquelle tran)HY(sitent)YH( des paquets, et de choisir la derni\350re connexion de la file quand il faut en suppri)HY(mer)YH( une, le fait d'envoyer p\351rio)HY(dique)HY(ment)YH( des paquets sur le r\351seau est un bon moyen pour toujours rester en phase avec un risque minime de suppres)HY(sion)YH(. )EP()0 P() 13 65 PR( _____ _____ _____ | | | | | | | A | | NAT | | B | |_____| |_____| |_____| ^ ^ ^ |--->--->--->---|----------- SYN ------------->--->--->---| |---<---<---<---|--------- SYN/ACK -----------<---<---<---| |--->--->--->---|----------- ACK ------------->--->--->---| | | | | | <--- connexion supprim\351e de la table | | | | |--->- PSH ->---| <--- connexion invalide | | | |)RP( )EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 17 H(3.\240Utili)WB 42 Sn()HY(ser)YH()WB 13 Sn( TCP keepa)HY(live)YH( sous Linux)EH()BR()BR()BR()0 P( Linux int\350gre nati)HY(ve)HY(ment)YH( le keepa)HY(live)YH(. Vous devez activer le r\351seau TCP/IP pour pouvoir l'utili)HY(ser)YH(. Vous avez aussi besoin du support de )SM(procfs)ES( et de )SM(sysctl)ES( pour pouvoir confi)HY(gu)HY(rer)YH( les para)HY(m\350tre)YH( noyau au lance)HY(ment)YH(. )EP()0 P( Les fonc)HY(tions)YH( impliquant keepa)HY(live)YH( utilisent trois variables mani)HY(pu)HY(l\351es)YH( par l'utili)HY(sa)HY(teur)YH( : )BR()0 DL()0 DT( )SM(tcp_keepa)HY(live)YH(_time)ES( )DD()0 P( inter)HY(valle)YH( entre le dernier envoi de paquet \201le simple ACK n'\351tant pas consi)HY(d\351r\351)YH( comme de la donn\351e\202 et la premi\350re sonde keepa)HY(live)YH(; apr\350s que la connexion ait \351t\351 marqu\351e comme requ\351)HY(rant)YH( un keepa)HY(live)YH(, ce comp)HY(teur)YH( n'est plus utilis\351. )EP()0 DT( )SM(tcp_keepa)HY(live)YH(_intvl)ES( )DD()0 P( inter)HY(valle)YH( entre deux sondes keepa)HY(live)YH(, ind\351)HY(pen)HY(dam)HY(ment)YH( de ce qui est \351chang\351 sur la connexion dans l'inter)HY(valle)YH( )EP()0 DT( )SM(tcp_keepa)HY(live)YH(_probes)ES( )DD()0 P( nombre de sondes non acquit)HY(t\351es)YH( \340 envoyer avant de consi)HY(d\351)HY(rer)YH( la connexion perdue et de noti)HY(fier)YH( la couche appli)HY(ca)HY(tive)YH(. )EP()LD()BR( )EP()0 P( Rappe)HY(lez)YH(-vous que le support du keepa)HY(live)YH(, m\352me s'il est confi)HY(gur\351)YH( dans le noyau, n'est pas le compor)HY(te)HY(ment)YH( par d\351faut de Linux. Les programmes doivent requ\351)HY(rir)YH( le contr\364le du keepa)HY(live)YH( pour que ses sockets puissent utili)HY(ser)YH( l'inter)HY(face)YH( )SM(setso)HY(ckopt)YH()ES(. Rela)HY(ti)HY(ve)HY(ment)YH( peu de programmes impl\351)HY(mentent)YH( keepa)HY(live)YH(, mais vous pouvez faci)HY(le)HY(ment)YH( ajouter le support du keepa)HY(live)YH( pour la plupart d'entre eux en suivant les instruc)HY(tions)YH( d\351taill\351es plus avant dans ce docu)HY(ment)YH(. )EP()2 Sl()BR()BR()BR()BR()0 3 18 H(3.1.\240Confi)WB 43 Sn()HY(gu)HY(rer)YH()WB 14 Sn( le noyau)EH()BR()BR()BR()0 P( Il existe deux moyens de confi)HY(gu)HY(rer)YH( les para)HY(m\350tres)YH( keepa)HY(live)YH( du noyau au travers de commandes utili)HY(sa)HY(teur)YH(: )BR()UL()0 P()-1 LI(l'inter)HY(face)YH( )SM(procfs)ES()EP()0 P()-1 LI(l'inter)HY(face)YH( )SM(sysctl)ES()EP()LU()BR( )EP()0 P( Nous abor)HY(de)HY(rons)YH( essen)HY(tiel)HY(le)HY(ment)YH( comment proc\351)HY(der)YH( au travers de l'inter)HY(face)YH( procfs car elle est la plus utili)HY(s\351e)YH(, recom)HY(man)HY(d\351e)YH( et la plus simple \340 appr\351)HY(hen)HY(der)YH(. L'inter)HY(face)YH( sysctl, parti)HY(cu)HY(li\350)HY(re)HY(ment)YH( sous l'aspect de l'appel syst\350me \201syscall\202 )SM(sysctl)ES(\2012\202 et non de l'outil )BD( sysctl)ES(\2018\202, n'est l\340 qu'\340 titre infor)HY(ma)HY(tif)YH(. )EP()2 Sl()BR()BR()BR()BR()0 4 19 H(3.1.1.\240L'inter)WB 44 Sn()HY(face)YH()WB 15 Sn()SM(procfs)ES()EH()BR()BR()BR()0 P( Cette inter)HY(face)YH( n\351ces)HY(site)YH( que)SM(sysctl)ES( et )SM( procfs)ES( soient inclus au noayu, et que )SM(procfs )ES( soit mont\351 quelque part dans le syst\350me de fichiers \201habi)HY(tuel)HY(le)HY(ment)YH( )SM(/proc)ES(, comme dans l'exemple ci-dessous\202. Vous pouvez lire les valeurs des para)HY(m\350tres)YH( actuels en listant avec la commande \253\240cat\240\273 les fichiers du r\351per)HY(toire)YH( )SM(/proc/sys/net/ipv4/)ES( : )BR() 8 47 PR( )SM(# )ES()BD()SM(cat /proc/sys/net/ipv4/tcp_keepalive_time)ES()ES( )SM(7200)ES( )SM(# )ES()BD()SM(cat /proc/sys/net/ipv4/tcp_keepalive_intvl)ES()ES( )SM(75)ES( )SM(# )ES()BD()SM(cat /proc/sys/net/ipv4/tcp_keepalive_probes)ES()ES( )SM(9)ES()RP()BR( )EP()0 P( Les deux premiers para)HY(m\350tres)YH( sont expri)HY(m\351s)YH( en secondes, et le dernier est un nombre simple. Cela signi)HY(fie)YH( que les routines keepa)HY(live)YH( attendent deux heures \2017200 secs\202 avant d'adres)HY(ser)YH( la premi\350re sonde keepa)HY(live)YH(, et en adressent une nouvelle toutes les 75 secondes. Si aucune r\351ponse ACK n'est re\347ue apr\350s neuf tenta)HY(tives)YH( cons\351)HY(cu)HY(tives)YH(, la connexion est consi)HY(d\351)HY(r\351e)YH( comme rompue. )EP()0 P( La modi)HY(fi)HY(ca)HY(tion)YH( de ces valeurs est directe : il faut \351crire de nouvelles valeurs dans les fichiers. Suppo)HY(sons)YH( que souhai)HY(tiez)YH( confi)HY(gu)HY(rer)YH( la machine pour que le keepa)HY(live)YH( d\351bute apr\350s dix minutes d'inac)HY(ti)HY(vit\351)YH( sur le lien, et que des sondes soient envoy\351es chaque minute. En raison de l'insta)HY(bi)HY(lit\351)YH( de ce brin de votre r\351seau et de la faible valeur de l'inter)HY(valle)YH(, suppo)HY(sons)YH( que vous vouliez augmen)HY(ter)YH( le nombre de tenta)HY(tives)YH( \340 20. )EP()0 P( Voici comment para)HY(m\351)HY(trer)YH( ces valeurs : )BR() 5 53 PR( )SM(# )ES()BD()SM(echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time)ES()ES( )SM(# )ES()BD()SM(echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl)ES()ES( )SM(# )ES()BD()SM(echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes)ES()ES()RP()BR( )EP()0 P( Pour confir)HY(mer)YH( la prise en compte des nouvelles valeurs, affi)HY(chez)YH( \340 nouveau le contenu des fichiers pour v\351ri)HY(fier)YH( qu'ils pr\351sentent bien les valeurs souhai)HY(t\351es)YH(. )EP()0 P( Il faut garder pr\351sent \340 l'esprit que )SM(procfs)ES( mani)HY(pule)YH( des fichiers sp\351ciaux, et vous ne pouvez pas tout faire sur ces fichiers qui ne sont qu'une inter)HY(face)YH( vers l'envi)HY(ron)HY(ne)HY(ment)YH( du noyau, non de v\351ri)HY(tables)YH( fichiers. Testez vos scripts avant de les utili)HY(ser)YH( et faites en sorte d'utili)HY(ser)YH( des modes d'acc\350s simples comme dans les exemples ci-dessus. )EP()0 P( Vous pouvez acc\351der \340 l'inter)HY(face)YH( gr\342ce \340 l'outil )BD(sysctl)ES(\2018\202, en pr\351ci)HY(sant)YH( ce que vos voulez lire ou \351crire. )BR() 7 36 PR( )SM(# )ES()BD()SM(sysctl \200)ES()ES( )SM(> )ES()BD()SM(net.ipv4.tcp_keepalive_time \200)ES()ES( )SM(> )ES()BD()SM(net.ipv4.tcp_keepalive_intvl \200)ES()ES( )SM(> )ES()BD()SM(net.ipv4.tcp_keepalive_probes)ES()ES( )SM(net.ipv4.tcp_keepalive_time = 7200 net.ipv4.tcp_keepalive_intvl = 75 net.ipv4.tcp_keepalive_probes = 9)ES()RP()BR( )EP()0 P( Remarquez que les noms )SM(sysctl)ES( sont proches des chemins )SM(procfs)ES(. L'\351cri)HY(ture)YH( se fait gr\342ce \340 l'option )SM(-w)ES( de )BD(sysctl)ES( \2018\202: )BR() 7 37 PR( )SM(# )ES()BD()SM(sysctl -w \200)ES()ES( )SM(> )ES()BD()SM(net.ipv4.tcp_keepalive_time=600 \200)ES()ES( )SM(> )ES()BD()SM(net.ipv4.tcp_keepalive_intvl=60 \200)ES()ES( )SM(> )ES()BD()SM(net.ipv4.tcp_keepalive_probes=20)ES()ES( )SM(net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 60 net.ipv4.tcp_keepalive_probes = 20)ES()RP()BR( )EP()0 P( Remarquez que )BD(sysctl)ES( \2018\202 n'utilise pas l'appel syst\350me \201syscall\202)SM(sysctl)ES(\2012\202, mais lit et \351crit direc)HY(te)HY(ment)YH( dans l'arbo)HY(res)HY(cence)YH( )SM(procfs)ES(, donc )SM(procfs)ES( devra \352tre activ\351 dans le noyau et mont\351 dans le syst\350me de fichiers, comme si vous acc\351)HY(diez)YH( direc)HY(te)HY(ment)YH( aux fichiers via l'inter)HY(face)YH( )SM(procfs)ES(. )BD(Sysctl)ES(\2018\202 n'est qu'un moyen diff\351)HY(rent)YH( de faire la m\352me chose. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 4 20 H(3.1.2.\240L'inter)WB 45 Sn()HY(face)YH()WB 16 Sn()SM(sysctl)ES()EH()BR()BR()BR()0 P( Il existe un autre moyen d'acc\351der aux variables du noyau : l'appel syst\350me )SM(sysctl)ES( \2012\202. Cela peut \352tre utile lorque )SM(procfs)ES( n'est pas dispo)HY(nible)YH( du fait que la commu)HY(ni)HY(ca)HY(tion)YH( avec le noyau est r\351ali)HY(s\351e)YH( direc)HY(te)HY(ment)YH( via syscall et pas au travers de l'arbo)HY(res)HY(cence)YH( )SM(procfs)ES( . Il n'existe actuel)HY(le)HY(ment)YH( aucun programme qui impl\351)HY(mente)YH( l'appel syscall \201souve)HY(nez)YH(-vous que )BD( sysctl)ES(\2018\202 ne l'utilise pas\202. )EP()0 P( Pour une utili)HY(sa)HY(tion)YH( d\351taill\351 de )SM( sysctl)ES(\2012\202 repor)HY(tez)YH( vous au manuel \201man\202. )EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 21 H(3.2.\240Rendre)WB 46 Sn()WB 17 Sn( les modi)HY(fi)HY(ca)HY(tions)YH( persis)HY(tantes)YH( au red\351)HY(mar)HY(rage)YH()EH()BR()BR()BR()0 P( Il existe diff\351)HY(rents)YH( moyens de para)HY(m\351)HY(trer)YH( le syst\350me \340 chaque d\351mar)HY(rage)YH(. Tout d'abord, souve)HY(nez)YH( vous que chaque distri)HY(bu)HY(tion)YH( Linux poss\350de son propre jeu de scripts d'initia)HY(li)HY(sa)HY(tion)YH( appel\351 par )BD(init)ES( \2018\202. Les confi)HY(gu)HY(ra)HY(tions)YH( les plus courantes incluent soit le r\351per)HY(toire)YH( )SM(/etc/rc.d/)ES( , soit )SM(/etc/init.d/)ES( . Dans ce cas vous pouvez posi)HY(tion)HY(ner)YH( les para)HY(m\350tres)YH( dans un script de d\351mar)HY(rage)YH( quel)HY(conque)YH(, keepa)HY(live)YH( reli)HY(sant)YH( les valeurs \340 chaque fois que ses routines en ont besoin. Donc si vous changez la valeur de )SM(tcp_keepa)HY(live)YH(_intvl)ES( alors que la connexion est encore active, le noyau utili)HY(sera)YH( la nouvelle valeur pour conti)HY(nuer)YH(. )EP()0 P( Les commandes d'initia)HY(li)HY(sa)HY(tion)YH( peuvent logique)HY(ment)YH( \352tre plac\351es en trois endroits diff\351)HY(rents)YH( : le premier est dans la confi)HY(gu)HY(ra)HY(tion)YH( r\351seau, le second dans le script )SM(rc.local)ES( , habi)HY(tuel)HY(le)HY(ment)YH( inclus dans toutes les distri)HY(bu)HY(tions)YH(, et connu comme \351tant le point de confi)HY(gu)HY(ra)HY(tion)YH( utili)HY(sa)HY(teur)YH( au d\351mar)HY(rage)YH(. Le troi)HY(si\350me)YH( point existe peut-\352tre d\351j\340 sur votre syst\350me. En reve)HY(nant)YH( \340 l'outil )BD(sysctl)ES( \2018\202 , vous pouvez voir que l'option )SM(-p)ES( charge les para)HY(m\350tres)YH( du fichier de confi)HY(gu)HY(ra)HY(tion)YH( )SM(/etc/sysctl.conf)ES( . Il est fr\351quent que votre script d'initia)HY(li)HY(sa)HY(tion)YH( ex\351cute d\351j\340 )BD(sysctl)ES( )SM(-p)ES( \201un \253\240grep\240\273 sur le r\351per)HY(toire)YH( de confi)HY(gu)HY(ra)HY(tion)YH( le confir)HY(mera)YH(\202, et vous n'avez alors qu'\340 ajouter les lignes dans )SM( /etc/sysctl.conf)ES( pour qu'elles soient prises en compte \340 chaque d\351mar)HY(rage)YH(. Pour davan)HY(tage)YH( d'infor)HY(ma)HY(tions)YH( sur la syntaxe de )SM(sysctl.conf)ES( \2015\202, repor)HY(tez)YH( vous au manuel. )EP()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 22 H(4.\240Program)WB 47 Sn()HY(mer)YH()WB 18 Sn( des appli)HY(ca)HY(tions)YH()EH()BR()BR()BR()0 P( Cette section aborde le code n\351ces)HY(saire)YH( \340 l'\351cri)HY(ture)YH( d'une appli)HY(ca)HY(tion)YH( utili)HY(sant)YH( keepa)HY(live)YH(. Ce n'est pas un manuel de program)HY(ma)HY(tion)YH(, et il requiert d'avoir une connais)HY(sance)YH( du langage C et des concepts r\351seau. Je consi)HY(d\350re)YH( que la notion de socket vous est fami)HY(li\350re)YH(, de m\352me que tous les aspects g\351n\351)HY(raux)YH( de votre appli)HY(ca)HY(tion)YH(. )EP()2 Sl()BR()BR()BR()BR()0 3 23 H(4.1.\240Quand)WB 48 Sn()WB 19 Sn( votre code requiert keepa)HY(live)YH()EH()BR()BR()BR()0 P( Les appli)HY(ca)HY(tions)YH( r\351seau ne requi\350rent pas toutes l'aide du keepa)HY(live)YH(. Souve)HY(nez)YH( vous qu'il s'agit de TCP keepa)HY(live)YH(. Comme vous pouvez le deviner, seules les sockets TCP peuvent en tirer parti. )EP()0 P( La plus belle chose que vous puis)HY(siez)YH( faire en \351cri)HY(vant)YH( une appli)HY(ca)HY(tion)YH( est de la rendre aussi para)HY(m\351)HY(trable)YH( que possible, et de ne pas en forcer les choix. Si vous voulez prendre en compte le bonheur de vos utili)HY(sa)HY(teurs)YH(, vous devriez impl\351)HY(men)HY(ter)YH( keepa)HY(live)YH( et laisser les utili)HY(sa)HY(teurs)YH( d\351cider s'ils veulent ou non l'utili)HY(ser)YH( en pr\351voyant un para)HY(m\350tre)YH( de confi)HY(gu)HY(ra)HY(tion)YH( ou une option de ligne de commande. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 24 H(4.2.\240L'appel)WB 49 Sn()WB 20 Sn( de fonc)HY(tion)YH( )SM(setso)HY(ckopt)YH()ES()EH()BR()BR()BR()0 P( Tout ce dont vous avez besoin pour que keepa)HY(live)YH( soit activ\351 sur une socket parti)HY(cu)HY(li\350re)YH( est de posi)HY(tion)HY(ner)YH( l'option sur cette socket. Le proto)HY(type)YH( de fonc)HY(tion)YH( est le suivant: ) 2 54 PR( int )SM(setsockopt)ES(\201int s, int level, int optname, const void *optval, socklen_t optlen\202)RP( )EP()0 P( Le premier para)HY(m\350tre)YH( est la socket, pr\351a)HY(la)HY(ble)HY(ment)YH( cr\351\351e avec )SM(socket)ES(\2012\202; le second doit \352tre )SM( SOL_SOCKET)ES(, et le troi)HY(si\350me)YH( )SM(SO_KEEPA)HY(LIVE)YH( )ES(. Le quatri\350me doit \352tre un entier boole\351en, indiquant que l'option est active, alors que le dernier est la taille de la valeur pass\351e pr\351c\351)HY(dem)HY(ment)YH(. )EP()0 P( Confor)HY(m\351)HY(ment)YH( au manuel, le code retour 0 indique le succ\350s, -1 est la valeur d'erreur \201et )SM(errno)ES( est correc)HY(te)HY(ment)YH( rensei)HY(gn\351e)YH(\202. )EP()0 P( Il existe aussi trois autres options de socket qu'il est possible de rensei)HY(gner)YH( en \351cri)HY(vant)YH( votre appli)HY(ca)HY(tion)YH(. Toutes utilisent le niveau )SM(SOL_TCP)ES( au lieu de )SM(SOL_SOCKET)ES(, et elles prennent le pas sur les variables syst\350me pour la socket courante. Si vous lisez avant d'\351crire, les para)HY(m\350tres)YH( syst\350me seront retour)HY(n\351s)YH(. )EP()BR()UL()0 P()-1 LI()SM(TCP_KEEPCNT)ES( : prend le pas sur )SM( tcp_keepa)HY(live)YH(_probes)ES()EP()0 P()-1 LI()SM(TCP_KEEPIDLE)ES( : prend le pas sur )SM( tcp_keepa)HY(live)YH(_time)ES()EP()0 P()-1 LI()SM(TCP_KEEPINTVL)ES( : prend le pas sur )SM( tcp_keepa)HY(live)YH(_intvl)ES()EP()LU()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 25 H(4.3.\240Exemples)WB 50 Sn()WB 21 Sn( de code)EH()BR()BR()BR()0 P( Voici un petit exemple qui cr\351e une socket, montre que keepa)HY(live)YH( est d\351sac)HY(tiv\351)YH(, puis l'active et v\351rifie que l'option est r\351el)HY(le)HY(ment)YH( posi)HY(tion)HY(n\351e)YH(. )EP()BR() 55 70 PR( /* --- d\351but du programme de test KEEPALIVE --- */ #include #include #include #include #include #include int main\201void\202; int main\201\202 { int s; int optval; socklen_t optlen = sizeof\201optval\202; /* Creation de la socket */ if\201\201s = socket\201PF_INET, SOCK_STREAM, IPPROTO_TCP\202\202 < 0\202 { perror\201"socket\201\202"\202; exit\201EXIT_FAILURE\202; } /* Verifie l'etat de l'option keepalive */ if\201getsockopt\201s, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen\202 < 0\202 { perror\201"getsockopt\201\202"\202; close\201s\202; exit\201EXIT_FAILURE\202; } printf\201"SO_KEEPALIVE is %s\200n", \201optval ? "ON" : "OFF"\202\202; )WR( /* Rend l'option active */ optval = 1; optlen = sizeof\201optval\202; if\201setsockopt\201s, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen\202 < 0\202 { perror\201"setsockopt\201\202"\202; close\201s\202; exit\201EXIT_FAILURE\202; } printf\201"SO_KEEPALIVE set on socket\200n"\202; /* Verifie a nouveau son etat */ if\201getsockopt\201s, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen\202 < 0\202 { perror\201"getsockopt\201\202"\202; close\201s\202; exit\201EXIT_FAILURE\202; } printf\201"SO_KEEPALIVE is %s\200n", \201optval ? "ON" : "OFF"\202\202; close\201s\202; exit\201EXIT_SUCCESS\202; } /* --- fin du programme de test KEEPALIVE --- */)RP()BR()2 Sl()BR()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 2 26 H(5.\240Impl\351)WB 51 Sn()HY(men)HY(ter)YH()WB 22 Sn( keepa)HY(live)YH( sur une appli)HY(ca)HY(tion)YH( tierce)EH()BR()BR()BR()0 P( Tout le monde n'est pas d\351ve)HY(lop)HY(peur)YH( d'appli)HY(ca)HY(tion)YH(, et tout le monde ne r\351\351crira pas enti\350)HY(re)HY(ment)YH( une appli)HY(ca)HY(tion)YH( pour combler le manque d'une fonc)HY(tion)HY(na)HY(lit\351)YH(. Peut-\352tre souhai)HY(tez)YH( vous ajouter keepa)HY(live)YH( \340 une appli)HY(ca)HY(tion)YH( exis)HY(tante)YH(, et m\352me si son auteur n'a pas consi)HY(d\351r\351)YH( cela impor)HY(tant)YH(, vous pensez que ce sera utile. )EP()0 P( Tout d'abord, souve)HY(nez)YH( vous de ce qui a \351t\351 dit pr\351c\351)HY(dem)HY(ment)YH( \340 propos des cas o\371 keepa)HY(live)YH( est n\351ces)HY(saire)YH(. Ensuite vous devrez affec)HY(ter)YH( les sockets TCP orien)HY(t\351es)YH( connexion. )EP()0 P( Comme Linux ne fournit pas la possi)HY(bi)HY(lit\351)YH( d'activer le support keepa)HY(live)YH( via le noyau \201les OS de type BSD le permettent souvent\202, le seul moyen est d'appeler )SM(setso)HY(ckopt)YH( )ES(\2012\202 apr\350s la cr\351a)HY(tion)YH( de la socket. Il y a deux solu)HY(tions)YH(: )BR()UL()0 P()-1 LI(modi)HY(fi)HY(ca)HY(tion)YH( du code source du programme original)EP()0 P()-1 LI(injec)HY(tion)YH( )SM(setso)HY(ckopt)YH()ES( \2012\202 en utili)HY(sant)YH( la tech)HY(nique)YH( de pr\351char)HY(ge)HY(ment)YH( de biblio)HY(th\350que)YH()EP()LU()BR( )EP()2 Sl()BR()BR()BR()BR()0 3 27 H(5.1.\240Modi)WB 52 Sn()HY(fier)YH()WB 23 Sn( le code source)EH()BR()BR()BR()0 P( Souve)HY(nez)YH(-vous que keepa)HY(live)YH( n'est pas orient\351 programme, mais orient\351 socket, donc si vous avez de multiples sockets, vous pouvez g\351rer keepa)HY(live)YH( s\351pa)HY(r\351)HY(ment)YH( pour chacune d'entre elles. La premi\350re \351tape consiste \340 comprendre ce que fait le programme, la seconde \340 recher)HY(cher)YH( le code pour chaque socket dans le programme. Cela peut \352tre fait en utili)HY(sant)YH( )BD(grep)ES(\2011\202, comme suit: ) 1 24 PR( )SM(# )ES()BD()SM(grep 'socket *\201' *.c)ES()ES()RP( )EP()0 P( Cela vous montrera \340 peu pr\350s toutes les sockets du code. L'\351tape suivante consiste \340 choisir les bonnes : vous ciblez les sockets TCP, donc recher)HY(chez)YH( )SM(PF_INET)ES( \201ou )SM(AF_INET)ES(\202, )SM(SOCK_STREAM)ES( et )SM(IPPROTO_TCP)ES( \201ou plus commu)HY(n\351)HY(ment)YH(, )SM(0)ES(\202 dans les para)HY(m\350tres)YH( de votre liste de sockets, et enlevez celles qui ne corres)HY(pondent)YH( pas. )EP()0 P( Il existe un autre moyen de cr\351er une socket au travers de )SM(accept)ES(\2012\202. En ce ce cas, suivez les sockets TCP iden)HY(ti)HY(fi\351es)YH( et v\351ri)HY(fiez)YH( si certaines sont en \351coute : si c'est le cas, gardez \340 l'esprit que )SM(accept)ES(\2012\202 retourne un descrip)HY(teur)YH( de socket, qui doit \352tre ajout\351 \340 votre liste de sockets. )EP()0 P( Une fois les sockets iden)HY(ti)HY(fi\351es)YH(, vous pouvez proc\351)HY(der)YH( aux modi)HY(fi)HY(ca)HY(tions)YH(. Le patch le plus 'fast & furious' peut consis)HY(ter)YH( \340 simple)HY(ment)YH( ajouter la fonc)HY(tion)YH( )SM(setso)HY(ckopt)YH()ES(\2012 \202 juste apr\350s le bloc de cr\351a)HY(tion)YH( de la socket. \311ven)HY(tuel)HY(le)HY(ment)YH(, vous pouvez ajouter des appels suppl\351)HY(men)HY(taires)YH( pour modi)HY(fier)YH( les para)HY(m\350tres)YH( syst\350mes par d\351faut de keepa)HY(live)YH(. Surtout soyez atten)HY(tif)YH( au posi)HY(tion)HY(ne)HY(ment)YH( des v\351ri)HY(fi)HY(ca)HY(tions)YH( d'erreurs et des hand)HY(lers)YH( de la fonc)HY(tion)YH(, peut-\352tre en reco)HY(piant)YH( le style du code alen)HY(tour)YH(. Songez \340 affec)HY(ter)YH( \340 )SM(optval)ES( une valeur non nulle et \340 initia)HY(li)HY(ser)YH( )SM(optlen)ES( avant d'appeler la fonc)HY(tion)YH(. )EP()0 P( Si vous en avez le temps ou pensez que ce serait plus \351l\351gant, essayez d'impl\351)HY(men)HY(ter)YH( compl\350)HY(te)HY(ment)YH( le keepa)HY(live)YH( \340 votre programme, en incluant une option de ligne de commande ou un para)HY(m\350tre)YH( de confi)HY(gu)HY(ra)HY(tion)YH( pour laisser \340 l'utili)HY(sa)HY(teur)YH( la libert\351 d'utili)HY(ser)YH( ou non keepa)HY(live)YH(. )EP()2 Sl()BR()2 Sl()BR()BR()BR()BR()0 3 28 H(5.2.\240)WB 53 Sn()WB 24 Sn(libkee)HY(pa)HY(live)YH(: pr\351char)HY(ge)HY(ment)YH( de biblio)HY(th\350que)YH()EH()BR()BR()BR()0 P( Dans de nombreux cas vous n'avez pas la possi)HY(bi)HY(lit\351)YH( de modi)HY(fier)YH( le code source d'une appli)HY(ca)HY(tion)YH(, ou bien lorsque vous devez activer keepa)HY(live)YH( pour tous vos programmes, tout patcher et tout recom)HY(pi)HY(ler)YH( n'est pas recom)HY(mand\351)YH(. )EP()0 P( Le projet libkee)HY(pa)HY(live)YH( a vu le jour pour faci)HY(li)HY(ter)YH( l'impl\351)HY(men)HY(ta)HY(tion)YH( du keepa)HY(live)YH( au sein des appli)HY(ca)HY(tions)YH( puisque le noyau Linux ne permet pas de le faire nati)HY(ve)HY(ment)YH( \201comme le fait BSD\202. La page d'accueil du projet libkee)HY(pa)HY(live)YH( est dispo)HY(nible)YH( \340 l'adresse )R5 2 A( http://libkee)HY(pa)HY(live)YH(.sour)HY(ce)HY(forge)YH(.net/)EA( )EP()0 P( Il consiste en une biblio)HY(th\350que)YH( parta)HY(g\351e)YH( qui outre)HY(passe)YH( l'appel syst\350me socket de la plupart des ex\351cu)HY(tables)YH(, sans aucun besoin de les recom)HY(pi)HY(ler)YH( ni de les modi)HY(fier)YH(. La tech)HY(nique)YH( repose sur la fonc)HY(tion)HY(na)HY(lit\351)YH( de pr\351-char)HY(ge)HY(ment)YH( \201)EM(preloa)HY(ding)YH()ES(\202 de )BD(ld.so)ES(\2018\202, char)HY(geur)YH( inclus dans Linux, qui qui permet le char)HY(ge)HY(ment)YH( de biblio)HY(th\350ques)YH( parta)HY(g\351es)YH( avec une prio)HY(rit\351)YH( sup\351)HY(rieure)YH( \340 la normale. Les programmes utilisent habi)HY(tuel)HY(le)HY(ment)YH( l'appel de fonc)HY(tion)YH( )SM(socket)ES( \2012\202 situ\351 dans la )SM(glibc)ES(, librai)HY(rie)YH( parta)HY(g\351e)YH(; avec libkee)HY(pa)HY(live)YH( il est possible d'encap)HY(su)HY(ler)YH( la fonc)HY(tion)YH( )SM(setso)HY(ckopt)YH()ES(\2012\202 juste apr\350s la cr\351a)HY(tion)YH(, retour)HY(nant)YH( au programme prin)HY(ci)HY(pal)YH( une socket avec keepa)HY(live)YH( d\351j\340 posi)HY(tionn\351)YH(. En raison des m\351ca)HY(nismes)YH( utili)HY(s\351s)YH( pour r\351ali)HY(ser)YH( l'appel syst\350me, ce proc\351d\351 ne fonc)HY(tionne)YH( pas lorsque la fonc)HY(tion)YH( socket est compi)HY(l\351e)YH( statique)HY(ment)YH( dans le binaire, comme dans le cas d'un programme li\351 par l'option )SM(-static)ES( de )BD(gcc)ES(\2011 \202. )EP()0 P( Apr\350s avoir t\351l\351)HY(charg\351)YH( et install\351 libkee)HY(pa)HY(live)YH(, vous serez en mesure d'ajouter le support de keepa)HY(live)YH( \340 vos programmes sans \352tre )SM(root)ES( au pr\351a)HY(lable)YH(, simple)HY(ment)YH( en initia)HY(li)HY(sant)YH( la variable d'envi)HY(ron)HY(ne)HY(ment)YH( )SM(LD_PRELOAD)ES( avant d'ex\351cu)HY(ter)YH( le programme. Au fait, le super utili)HY(sa)HY(teur)YH( peut aussi forcer la pr\351-char)HY(ge)HY(ment)YH( au travers d'une confi)HY(gu)HY(ra)HY(tion)YH( globale, et les utili)HY(sa)HY(teurs)YH( peuvent choisir de le d\351sac)HY(ti)HY(ver)YH( en posi)HY(tion)HY(nant)YH( la variable d'envi)HY(ron)HY(ne)HY(ment)YH( )SM(KEEPA)HY(LIVE)YH()ES( \340 )SM(off)ES(. )EP()0 P( L'envi)HY(ron)HY(ne)HY(ment)YH( est aussi utilis\351 pour posi)HY(tion)HY(ner)YH( des valeurs sp\351ci)HY(fiques)YH( pour les para)HY(m\350tres)YH( de keepa)HY(live)YH(, vous avez donc la possi)HY(bi)HY(lit\351)YH( de g\351rer chaque programme de fa\347on distincte, en initia)HY(li)HY(sant)YH( )SM(KEEPCNT)ES(, )SM(KEEPIDLE)ES( et )SM(KEEPINTVL)ES( avant de lancer l'appli)HY(ca)HY(tion)YH(. )EP()0 P( Voici un exemple d'utili)HY(sa)HY(tion)YH( de libkee)HY(pa)HY(live)YH( : )BR() 12 32 PR( )SM($ )ES()BD()SM(test)ES()ES( )SM(SO_KEEPALIVE is OFF)ES( )SM($ )ES()BD()SM(LD_PRELOAD=libkeepalive.so \200)ES()ES( )SM(> )ES()BD()SM(KEEPCNT=20 \200)ES()ES( )SM(> )ES()BD()SM(KEEPIDLE=180 \200)ES()ES( )SM(> )ES()BD()SM(KEEPINTVL=60 \200)ES()ES( )SM(> )ES()BD()SM(test)ES()ES( )SM(SO_KEEPALIVE is ON TCP_KEEPCNT = 20 TCP_KEEPIDLE = 180 TCP_KEEPINTVL = 60)ES()RP()BR( )EP()0 P( Et vous pouvez utili)HY(ser)YH( )BD(strace)ES( \2011\202 pour comprendre ce qui se passe: )EP()BR() 38 55 PR( )SM($ )ES()BD()SM(strace test)ES()ES( )SM(execve\201"test", ["test"], [/* 26 vars */]\202 = 0 [..] open\201"/lib/libc.so.6", O_RDONLY\202 = 3 [..] socket\201PF_INET, SOCK_STREAM, IPPROTO_TCP\202 = 3 getsockopt\2013, SOL_SOCKET, SO_KEEPALIVE, [0], [4]\202 = 0 close\2013\202 = 0 [..] _exit\2010\202 = ?)ES( )SM($ )ES()BD()SM(LD_PRELOAD=libkeepalive.so \200)ES()ES( )SM(> )ES()BD()SM(strace test)ES()ES( )SM(execve\201"test", ["test"], [/* 27 vars */]\202 = 0 [..] open\201"/usr/local/lib/libkeepalive.so", O_RDONLY\202 = 3 [..] open\201"/lib/libc.so.6", O_RDONLY\202 = 3 [..] open\201"/lib/libdl.so.2", O_RDONLY\202 = 3 [..] socket\201PF_INET, SOCK_STREAM, IPPROTO_TCP\202 = 3 setsockopt\2013, SOL_SOCKET, SO_KEEPALIVE, [1], 4\202 = 0 setsockopt\2013, SOL_TCP, TCP_KEEPCNT, [20], 4\202 = 0 setsockopt\2013, SOL_TCP, TCP_KEEPIDLE, [180], 4\202 = 0 setsockopt\2013, SOL_TCP, TCP_KEEPINTVL, [60], 4\202 = 0 [..] getsockopt\2013, SOL_SOCKET, SO_KEEPALIVE, [1], [4]\202 = 0 [..] getsockopt\2013, SOL_TCP, TCP_KEEPCNT, [20], [4]\202 = 0 [..])WR( getsockopt\2013, SOL_TCP, TCP_KEEPIDLE, [180], [4]\202 = 0 [..] getsockopt\2013, SOL_TCP, TCP_KEEPINTVL, [60], [4]\202 = 0 [..] close\2013\202 = 0 [..] _exit\2010\202 = ?)ES()RP()BR()0 P( Pour d'autres infor)HY(ma)HY(tions)YH(, visitez la page d'accueil du projet libkee)HY(pa)HY(live)YH( : )R5 2 A( http://libkee)HY(pa)HY(live)YH(.sour)HY(ce)HY(forge)YH(.net/)EA( )EP()2 Sl()BR()2 Sl()BR()1 Sl()BR()WB NL /BO 0 D TC /Ba f D Bs /AU f D /UR () D RC ZF tH WB ND 1 gt{Ts 3 mul Np 0()0 C()BD(Guide pratique du maintien de connexion TCP)ES()0 1 TN()EA()BN}if 2 NH le{25(0.1\240\240)2 C(Guide)WB 1 Sn( pratique du main)HY(tien)YH( de connexion TCP)25 1 TN()EA()BN}if 3 NH le{26(0.1.1\240\240)3 C()I( Version fran\347aise du )EM(TCP Keepa)HY(live)YH( HOWTO)ES(. )ES()26 1 TN()EA()BN}if 3 NH le{27(0.1.2\240\240)3 C(Fabio Busatto)27 1 TN()EA()BN}if 3 NH le{28(0.1.3\240\240)3 C(Laurent Gauthier)28 1 TN()EA()BN}if 3 NH le{29(0.1.4\240\240)3 C(Eric Deschamps)29 1 TN()EA()BN}if 3 NH le{30(0.1.5\240\240)3 C(Jean-Philippe Gu\351rard)30 1 TN()EA()BN}if 2 NH le{31(0.2\240\240)2 C(1.\240Intro)HY(duc)HY(tion)YH()WB 2 Sn()31 1 TN()EA()BN}if 3 NH le{32(0.2.1\240\240)3 C(1.1.\240Droits)WB 3 Sn( d'utili)HY(sa)HY(tion)YH()32 1 TN()EA()BN}if 3 NH le{33(0.2.2\240\240)3 C(1.2.\240Aver)HY(tis)HY(se)HY(ment)YH()WB 4 Sn()33 1 TN()EA()BN}if 3 NH le{34(0.2.3\240\240)3 C(1.3.\240Remer)HY(cie)HY(ments)YH()WB 5 Sn( et contri)HY(bu)HY(tions)YH()34 1 TN()EA()BN}if 3 NH le{35(0.2.4\240\240)3 C(1.4.\240Commen)HY(taires)YH()WB 6 Sn( et correc)HY(tions)YH()35 1 TN()EA()BN}if 3 NH le{36(0.2.5\240\240)3 C(1.5.\240Traduc)HY(tions)YH()WB 7 Sn()36 1 TN()EA()BN}if 2 NH le{37(0.3\240\240)2 C(2.\240Aper\347u)WB 8 Sn( de TCP keepa)HY(live)YH()37 1 TN()EA()BN}if 3 NH le{38(0.3.1\240\240)3 C(2.1.\240Qu'est-ce)WB 9 Sn( que TCP keepa)HY(live)YH( ?)38 1 TN()EA()BN}if 3 NH le{39(0.3.2\240\240)3 C(2.2.\240Pourquoi)WB 10 Sn( utili)HY(ser)YH( TCP keepa)HY(live)YH( ?)39 1 TN()EA()BN}if 3 NH le{40(0.3.3\240\240)3 C(2.3.\240V\351ri)HY(fier)YH()WB 11 Sn( les h\364tes injoi)HY(gnables)YH()40 1 TN()EA()BN}if 3 NH le{41(0.3.4\240\240)3 C(2.4.\240\311viter)WB 12 Sn( une d\351con)HY(nexion)YH( due \340 une inac)HY(ti)HY(vit\351)YH( r\351seau.)41 1 TN()EA()BN}if 2 NH le{42(0.4\240\240)2 C(3.\240Utili)HY(ser)YH()WB 13 Sn( TCP keepa)HY(live)YH( sous Linux)42 1 TN()EA()BN}if 3 NH le{43(0.4.1\240\240)3 C(3.1.\240Confi)HY(gu)HY(rer)YH()WB 14 Sn( le noyau)43 1 TN()EA()BN}if 4 NH le{44(0.4.1.1\240\240)4 C(3.1.1.\240L'inter)HY(face)YH()WB 15 Sn()SM(procfs)ES()44 1 TN()EA()BN}if 4 NH le{45(0.4.1.2\240\240)4 C(3.1.2.\240L'inter)HY(face)YH()WB 16 Sn()SM(sysctl)ES()45 1 TN()EA()BN}if 3 NH le{46(0.4.2\240\240)3 C(3.2.\240Rendre)WB 17 Sn( les modi)HY(fi)HY(ca)HY(tions)YH( persis)HY(tantes)YH( au red\351)HY(mar)HY(rage)YH()46 1 TN()EA()BN}if 2 NH le{47(0.5\240\240)2 C(4.\240Program)HY(mer)YH()WB 18 Sn( des appli)HY(ca)HY(tions)YH()47 1 TN()EA()BN}if 3 NH le{48(0.5.1\240\240)3 C(4.1.\240Quand)WB 19 Sn( votre code requiert keepa)HY(live)YH()48 1 TN()EA()BN}if 3 NH le{49(0.5.2\240\240)3 C(4.2.\240L'appel)WB 20 Sn( de fonc)HY(tion)YH( )SM(setso)HY(ckopt)YH()ES()49 1 TN()EA()BN}if 3 NH le{50(0.5.3\240\240)3 C(4.3.\240Exemples)WB 21 Sn( de code)50 1 TN()EA()BN}if 2 NH le{51(0.6\240\240)2 C(5.\240Impl\351)HY(men)HY(ter)YH()WB 22 Sn( keepa)HY(live)YH( sur une appli)HY(ca)HY(tion)YH( tierce)51 1 TN()EA()BN}if 3 NH le{52(0.6.1\240\240)3 C(5.1.\240Modi)HY(fier)YH()WB 23 Sn( le code source)52 1 TN()EA()BN}if 3 NH le{53(0.6.2\240\240)3 C(5.2.\240)WB 24 Sn(libkee)HY(pa)HY(live)YH(: pr\351char)HY(ge)HY(ment)YH( de biblio)HY(th\350que)YH()53 1 TN()EA()BN}if /TE t D NP TU PM 0 eq and{/Pn () D showpage}if end restore .