This file is indexed.

/usr/share/doc/HOWTO/fr-html/ADSL-Bandwidth-Management-HOWTO.html is in doc-linux-fr-html 2013.01-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 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
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Guide pratique de la gestion de bande passante d'une ligne ADSL</title><link rel="stylesheet" type="text/css" href="style.css"/><meta name="generator" content="DocBook XSL Stylesheets V1.78.1"/><meta name="description" content="Ce document décrit la configuration d'un routeur Linux pour gérer efficacement le trafic sortant à destination d'un modem ADSL ou de tout autre équipement de bande passante similaire (modem câble, RNIS, etc). Un accent particulier est apporté à la diminution de latence pour le trafic de type interactif et ce même durant les périodes de congestion."/></head><body><div xml:lang="fr" class="article"><div class="titlepage"><div><div><h2 class="title"><a id="ADSL-Bandwidth-Management-HOWTO"/>Guide pratique de la gestion de bande passante d'une ligne ADSL</h2></div><div><h3 class="subtitle"><em>Version française du <span class="foreignphrase"><em class="foreignphrase">ADSL Bandwidth Management
      HOWTO</em></span></em></h3></div><div><div class="author"><h3 class="author"><span class="firstname">Dan</span> <span class="surname">Singletary</span></h3><div class="affiliation"><div class="address"><p><code class="email">&lt;<a class="email" href="mailto:dvsing CHEZ sonicspike POINT net">dvsing CHEZ sonicspike POINT net</a>&gt;</code></p></div></div></div></div><div><p class="othercredit"><span class="contrib">Adaptation française</span> : <span class="firstname">François</span> <span class="surname">Romieu</span>, <span class="firstname">Guillaume</span> <span class="surname">Lelarge</span></p></div><div/><div><p class="releaseinfo">Version : 1.3.fr.1.0</p></div><div><p class="pubdate">16 juillet 2004</p></div><div><div class="revhistory"><table summary="Historique des versions"><tr><th align="left" valign="top" colspan="3"><strong>Historique des versions</strong></th></tr><tr><td align="left">Version 1.3.fr.1.0</td><td align="left">2004-07-16</td><td align="left">GL</td></tr><tr><td align="left" colspan="3">Mise à jour de la traduction française.</td></tr><tr><td align="left">Version 1.3</td><td align="left">2003-04-07</td><td align="left">DS</td></tr><tr><td align="left" colspan="3">
          Ajout d'une section de liens (<span class="emphasis"><em>Added <a class="link" href="#links" title="7. Liens">links</a> section</em></span>).
        </td></tr><tr><td align="left">Version 1.2.fr.1.0</td><td align="left">2003-03-01</td><td align="left">FR, GL, JPG</td></tr><tr><td align="left" colspan="3">Première traduction française.</td></tr><tr><td align="left">Version 1.2</td><td align="left">2002-09-26</td><td align="left">DS</td></tr><tr><td align="left" colspan="3">
          Ajout d'un <a class="link" href="#emaillist" title="1.2. Liste de diffusion">lien</a> vers la nouvelle
	  liste de diffusion.
	  Ajout d'une petite information dans la section d'avertissement
	  concernant la nouvelle QoS améliorée pour Linux, créée spécifiquement
	  pour l'ADSL et bientôt disponible (<span class="emphasis"><em>Added <a class="link" href="#emaillist" title="1.2. Liste de diffusion">link</a> to new Email Discussion List.
          Added small teaser to caveat section regarding new and improved
          QoS for Linux designed specifically for ADSL to be released soon</em></span>).
        </td></tr><tr><td align="left">Version 1.1</td><td align="left">26-08-2002</td><td align="left">DS</td></tr><tr><td align="left" colspan="3">
          Quelques corrections (merci au nombreuses personnes m'ayant montré les
	  problèmes!). Ajout d'une information dans la section d'implémentation.
          (<span class="emphasis"><em>A few corrections (Thanks to the many that pointed
          them out!).  Added informational caveat to implementation
          section.</em></span>)
        </td></tr><tr><td align="left">Version 1.0</td><td align="left">21-08-2002</td><td align="left">DS</td></tr><tr><td align="left" colspan="3">
	  Meilleur contrôle au niveau de la bande passante, plus de théorie,
	  mise à jour pour les noyaux 2.4. (<span class="emphasis"><em>Better control over bandwidth,
          more theory, updated for 2.4 kernels</em></span>)
	</td></tr><tr><td align="left">Version 0.1</td><td align="left">06-08-2002</td><td align="left">DS</td></tr><tr><td align="left" colspan="3">Première publication (<span class="emphasis"><em>Initial publication</em></span>)</td></tr></table></div></div><div><div class="abstract"><p class="title"><strong>Résumé</strong></p><p>
        Ce document décrit la configuration d'un routeur Linux pour
        gérer efficacement le trafic sortant à destination d'un modem
        ADSL ou de tout autre équipement de bande passante similaire
        (modem câble, RNIS, etc). Un accent particulier est apporté à
        la diminution de latence pour le trafic de type interactif et ce
        même durant les périodes de congestion.
    </p></div></div></div><hr/></div><div class="toc"><p><strong>Table des matières</strong></p><dl class="toc"><dt><span class="sect1"><a href="#intro">1. Introduction</a></span></dt><dd><dl><dt><span class="sect2"><a href="#d0e146">1.1. Mises à jour du document</a></span></dt><dt><span class="sect2"><a href="#emaillist">1.2. Liste de diffusion</a></span></dt><dt><span class="sect2"><a href="#d0e167">1.3. Avertissement</a></span></dt><dt><span class="sect2"><a href="#copyright_en">1.4. Copyright</a></span></dt><dt><span class="sect2"><a href="#copyright_fr">1.5. Droits d'utilisation</a></span></dt><dt><span class="sect2"><a href="#d0e200">1.6. Retours d'expérience et corrections</a></span></dt></dl></dd><dt><span class="sect1"><a href="#background">2. Cadre d'utilisation</a></span></dt><dd><dl><dt><span class="sect2"><a href="#d0e216">2.1. Prérequis</a></span></dt><dt><span class="sect2"><a href="#d0e253">2.2. Organisation</a></span></dt><dt><span class="sect2"><a href="#d0e260">2.3. Files d'attente des paquets</a></span></dt></dl></dd><dt><span class="sect1"><a href="#how-it-works">3. Fonctionnement</a></span></dt><dd><dl><dt><span class="sect2"><a href="#d0e303">3.1. Limitation du trafic sortant avec HTB Linux</a></span></dt><dt><span class="sect2"><a href="#d0e310">3.2. Gestion des files de priorité avec HTB</a></span></dt><dt><span class="sect2"><a href="#d0e322">3.3. Classification des paquets sortant avec iptables</a></span></dt><dt><span class="sect2"><a href="#d0e352">3.4. Des réglages supplémentaires...</a></span></dt><dt><span class="sect2"><a href="#d0e359">3.5. Une tentative de limitation du trafic entrant</a></span></dt></dl></dd><dt><span class="sect1"><a href="#implementation">4. Réalisation</a></span></dt><dd><dl><dt><span class="sect2"><a href="#d0e382">4.1. Avertissements</a></span></dt><dt><span class="sect2"><a href="#d0e391">4.2. Script: mon_limiteur</a></span></dt></dl></dd><dt><span class="sect1"><a href="#testing">5. Test</a></span></dt><dt><span class="sect1"><a href="#onward">6. Ça fonctionne. Et maintenant ?</a></span></dt><dt><span class="sect1"><a href="#links">7. Liens</a></span></dt></dl></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title"><a id="intro"/>1. Introduction</h2></div></div></div><p>
      Ce document suggère une méthode de gestion de la bande passante pour
      le trafic sortant avec une connexion ADSL (ou modem câble) à Internet.
      Le problème provient du fait que de nombreuses lignes ADSL sont bridées
      aux environs de 128 kbps pour le trafic montant. La situation s'aggrave
      lorsque la file d'attente du modem ADSL demande de deux à trois secondes pour
      se libérer quand elle est pleine. Lorsque la bande passante dans le
      sens montant est saturée, une trame peut mettre jusqu'à trois secondes
      pour atteindre Internet. Les applications interactives comme telnet et
      les jeux en réseau sont dégradées.
    </p><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="d0e146"/>1.1. Mises à jour du document</h3></div></div></div><p>
        La dernière version de ce document se trouve sur l'Internet à l'adresse:
        <a class="ulink" href="http://www.tldp.org" target="_top">http://www.tldp.org</a>.
      </p><p>
        Les mises à jours seront reproduites dans divers sites web et ftp Linux
        tels que le LDP:
        <a class="ulink" href="http://www.tldp.org" target="_top">http://www.tldp.org</a>.
      </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="emaillist"/>1.2. Liste de diffusion</h3></div></div></div><p>
        Inscrivez-vous à la liste de diffusion de gestion de la bande passante
        pour l'ADSL
        <a class="ulink" href="http://jared.sonicspike.net/mailman/listinfo/adsl-qos" target="_top">
        http://jared.sonicspike.net/mailman/listinfo/adsl-qos</a> afin de
        poser des questions ou de recevoir des informations de mise à jour.
      </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="d0e167"/>1.3. Avertissement</h3></div></div></div><p>
        L'auteur, les distributeurs et les contributeurs de ce guide pratique
        ne sont en aucun cas responsables des dommages physiques, financiers,
        moraux ou de tout autre type occasionnés suite aux suggestions de ce
        texte.
      </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="copyright_en"/>1.4. Copyright</h3></div></div></div><div class="important" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Important"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="images/important.png"/></td><th align="left">Important</th></tr><tr><td align="left" valign="top"><p>
        Le texte ci-dessous est la licence de ce document. Ce texte fait foi. Il 
        est composé de la licence (en anglais) du document original, suivi de la 
        licence (en français) de sa traduction.
      </p></td></tr></table></div><p>
        Copyright 2002 Dan Singletary
      </p><p>
        This document is copyright 2002 by Dan Singletary, and is
        released under the terms of the GNU Free Documentation License,
        which is hereby incorporated by reference.
      </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="copyright_fr"/>1.5. Droits d'utilisation</h3></div></div></div><p>
        Copyright 2002 Dan Singletary
      </p><p>
        Il vous est autorisé de copier, distribuer et/ou modifier ce document
        sous les termes de la licence GNU Free Documentation License,
        Version 1.1 ou toute version ultérieure publiée par la Free Software
        Foundation avec les sections inaltérables suivantes:
        texte de première page de couverture, texte de dernière page de
        couverture. Une copie de la licence est disponible sur
        <a class="ulink" href="http://www.gnu.org/copyleft/fdl.html" target="_top">http://www.gnu.org/copyleft/fdl.html</a>.
      </p><div class="blockquote"><blockquote class="blockquote"><p>
          Copyright © 2003, 2004 François Romieu, Guillaume Lelarge et
          Jean-Philippe Guérard pour la version française
        </p><p>
          La version française de ce document a été réalisée par François
          Romieu, Guillaume Lelarge et Jean-Philippe Guérard. Elle est
          publiée en accord avec les termes de la licence de documentation 
          libre GNU (GFDL), version 1.1 ou ultérieure, telle que publiée par 
          la <a class="ulink" href="http://fsffrance.org/" target="_top">Free Software 
          Foundation</a> ; sans section invariante, sans texte de 
          première de couverture ni texte de quatrième de couverture.
        </p></blockquote></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="d0e200"/>1.6. Retours d'expérience et corrections</h3></div></div></div><p>
        Merci de faire parvenir à l'auteur vos questions et commentaires
        relatifs à ce document, en anglais, via l'adresse :
        <a class="ulink" href="mailto:dvsing@sonicspike.net" target="_top">dvsing@sonicspike.net</a>.
      </p><p>
        N'hésitez pas à faire parvenir tout commentaire relatif à la version
        française de ce document à <code class="email">&lt;<a class="email" href="mailto:commentaires CHEZ traduc POINT org">commentaires CHEZ traduc POINT org</a>&gt;</code>
        en précisant son titre, sa date et sa version.
      </p></div></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title"><a id="background"/>2. Cadre d'utilisation</h2></div></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="d0e216"/>2.1. Prérequis</h3></div></div></div><p>
        La méthode décrite dans ce document devrait s'appliquer à n'importe
        quelle configuration Linux. Toutefois, elle n'a pour l'instant été
        testée que dans la configuration suivante :
      </p><div class="itemizedlist"><ul class="itemizedlist" type="bullet"><li class="listitem"><p>Red Hat Linux 7.3</p></li><li class="listitem"><p>
            Un noyau 2.4.18-5 avec une prise en charge de la QoS
            (éventuellement sous forme de module) qui inclut les correctifs
            suivants :
            </p><div class="itemizedlist"><ul class="itemizedlist" type="bullet"><li class="listitem"><p>
                  file d'attente HTB - <a class="ulink" href="http://luxik.cdi.cz/~devik/qos/htb/" target="_top">http://luxik.cdi.cz/~devik/qos/htb/</a>
                </p><p>
                  Remarque : on signale que les noyaux Mandrake au delà de
                  la version 2.4.18-3 (versions 8.1 et 8.2 de la
                  distribution Mandrake) incluent le correctif HTB.
                </p></li><li class="listitem"><p>
                  périphérique IMQ - <a class="ulink" href="http://luxik.cdi.cz/~patrick/imq/" target="_top">http://luxik.cdi.cz/~patrick/imq/</a>
                </p></li></ul></div><p>
            Ces correctifs se retrouveront probablement intégrés en standard
	    dans des versions ultérieures du noyau.
          </p></li><li class="listitem"><p>
            iptables v1.2.6a ou suivantes. Le module length est absent de la
            version d'iptables distribuée avec la Red Hat 7.3
          </p></li></ul></div><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"/></td><th align="left">Note</th></tr><tr><td align="left" valign="top"><p>
        
          Les versions antérieures de ce document impliquaient une 
          méthode de contrôle de la bande passante qui passait par 
          l'application d'un correctif à la queue sch_prio existante. Il 
          s'est avéré que ce correctif était inutile. De surcroît, 
          l'approche retenue dans ce texte donne de meilleurs résultats 
          (quoiqu'à la date de rédaction de ce document, l'application 
          de <span class="emphasis"><em>2</em></span> correctifs au noyau soit nécessaire 
          :o) ).
        
        </p></td></tr></table></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="d0e253"/>2.2. Organisation</h3></div></div></div><p>
        Toutes les mentions de périphériques réseau et de configuration
        dans ce guide pratique se rapportent au schéma suivant :
      </p><pre class="screen">
              &lt;-- 128kbit/s      +------------+    &lt;-- 10Mbit/s --&gt;
 Internet &lt;--------------------&gt; | Modem ADSL | &lt;-------------------+
               1.5Mbit/s --&gt;     +------------+                     |
                                                                    | eth0
                                                                    V
                                                        +---------------+
                                                        |               |
                                                        | Routeur Linux |
                                                        |               |
                                                        +---------------+
                                                         | .. | eth1..ethN
                                                         |    |
                                                         V    V
                  
                                                      Réseau local
</pre></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="d0e260"/>2.3. Files d'attente des paquets</h3></div></div></div><p>
        Les files d'attente contiennent les données destinées à un
        périphérique réseau quand celles-ci ne peuvent pas être
        expédiées immédiatement. La plupart des files d'attente sont
        du type premier entré/premier sorti (FIFO/first in, first out)
        sauf lorsqu'elles sont explicitement configurées pour appliquer
        une autre stratégie. Cela signifie que lorsqu'une file d'attente
        est remplie, le paquet qui y a été placé en dernier n'est émis
        qu'après tous ceux qui étaient déjà présents dans la file.
      </p><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="d0e265"/>2.3.1. Le lien montant</h4></div></div></div><p>
          La bande passante d'un modem ADSL est asymétrique avec des
          valeurs typiques de 1,5 Mbit/s en descente et 128 kbit/s en
          trafic montant. Par rapport au débit de cette ligne, le routeur Linux et
          le modem ADSL sont généralement associés par un lien à 10 Mb/s ou
          plus. Si l'interface du routeur avec le réseau local est
          également à 10 Mb/s il n'y a aucune mise en attente au niveau du
          routeur lorsque les paquets transitent à destination d'Internet.
          Les paquets sont transmis via eth0 aussi rapidement qu'ils sont
          reçus du réseau local. Les paquets séjournent dans la file
          d'attente du modem ADSL puisqu'ils arrivent à 10 Mb/s et sont
          renvoyés à 128 kb/s. Une fois la file d'attente du modem saturée,
          les nouveaux paquets sont jetés. TCP s'adapte à ce phénomène et
          ajuste la taille de sa fenêtre de transmission pour employer toute
          la bande passante disponible.
        </p><p>
          Si les files d'attente et TCP s'accordent pour utiliser toute la
          bande passante, des tailles de FIFO importantes augmentent la
          latence du trafic à vocation interactive.
        </p><p>
          Les files d'attente à n voies sont similaires aux files
          d'attente de type FIFO à cette différence près qu'elles
          comprennent plusieurs files. Les paquets sont placés dans
          l'une des n files en fonction de leurs caractéristiques.
          Chaque file se voit attribuer une priorité et les paquets sont
          émis à partir de la file de plus haute priorité qui n'est pas
          vide. Avec cette stratégie, les paquets FTP peuvent être mis
          dans une file de priorité plus basse que les paquets destinés
          à telnet de telle sorte qu'un simple paquet telnet est capable
          de franchir la file d'attente immédiatement même lors d'un
          transfert FTP.
        </p><p>
          Ce document a été repris pour faire usage d'une nouvelle
          file d'attente dans Linux, dite de type HTB (Hierarchical Token
          Bucket). La file HTB ressemble à la file à n voies décrite
          précédemment mais elle rend possible la limitation de trafic
          dans chaque classe. En outre, elle autorise la création d'une
          hiérarchie de classes de trafic. Une description complète d'HTB
          dépasse le cadre de ce document. Davantage d'informations sont
	  disponibles sur le site
          <a class="ulink" href="http://www.lartc.org" target="_top">http://www.lartc.org</a>
        </p></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="d0e279"/>2.3.2. Le lien descendant</h4></div></div></div><p>
          Le trafic entrant dans le modem ADSL en provenance d'Internet
          est mis en file d'attente de la même façon que le trafic
          sortant à ceci près que la file d'attente se situe chez le FAI.
          Il n'est donc guère possible de contrôler les priorités
          relatives des flux ou d'appliquer un traitement préférentiel à
          certains. La seule façon de maintenir une latence décente
          consiste à s'assurer que les interlocuteurs n'envoient pas les
          données trop vite. Il n'y a malheureusement pas de méthode
          directe. Comme une bonne partie du trafic est de type TCP, il
          est toutefois possible de ralentir les émetteurs :
        </p><div class="itemizedlist"><ul class="itemizedlist" type="bullet"><li class="listitem"><p>
            Jeter volontairement les paquets entrants. TCP est conçu pour
            employer la bande passante disponible tout en évitant la
            congestion du lien. Durant un échange TCP, les données sont
            émises jusqu'à ce qu'un paquet soit perdu. TCP remarque la
            perte et diminue sa fenêtre de transmission. Le cycle reprend,
            avec un rythme de progression des envois plus faible au cours
            du transfert et garantit une transmission aussi rapide que
            possible.
          </p></li><li class="listitem"><p>
            Jouer avec les annonces de fenêtre de réception. Au cours d'un
            transfert TCP, le récepteur envoie un flux permanent de paquets
            d'acquittements (ACK). Les paquets ACK incluent une annonce de
            taille de fenêtre qui précise la quantité maximale de données
            non-acquittées qui peut être reçue. Ceci permet de ralentir le
            rythme d'émission. Il n'existe à ce jour pas de mise en oeuvre
            libre de ce type de contrôle de flux pour Linux (quoique je
            puisse être en train d'y travailler).
          </p></li></ul></div></div></div></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title"><a id="how-it-works"/>3. Fonctionnement</h2></div></div></div><p>
      L'optimisation de la bande passante montante s'effectue en deux étapes.
      Tout d'abord il faut éviter que le modem ADSL ne mette les paquets en
      attente car on ne peut pas contrôler la façon dont il gère sa file.
      Ceci s'effectue en limitant la quantité de données émise par le routeur
      via eth0 un peu en dessous de la bande passante disponible. Le routeur
      met en file les paquets qui arrivent du réseau local plus vite qu'il ne
      les émet.
    </p><p>
      La seconde étape consiste à mettre en oeuvre une stratégie de file
      d'attente au niveau du routeur. On examinera une file d'attente qui
      peut être configurée pour donner la priorité au trafic interactif tel que
      telnet ou les jeux à plusieurs participants en réseau.
      </p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"/></td><th align="left">Note</th></tr><tr><td align="left" valign="top"><p>
      Les files HTB permettent à la fois la limitation de trafic et l'envoi
      prioritaire tout en assurant qu'aucune classe de priorité n'étouffe
      les autres. Ce dernier point n'était pas possible avec la méthode
      préconisée par la version 0.1 de ce document.
      </p></td></tr></table></div><p>
      La dernière étape porte sur le marquage des paquets au niveau du
      pare-feu pour affecter des priorités aux paquets avec fwmark.
    </p><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="d0e303"/>3.1. Limitation du trafic sortant avec HTB Linux</h3></div></div></div><p>
        Bien que le lien entre le routeur et le modem soit à 10 Mb/s, voire
        plus, le modem n'émet au mieux les données qu'à 128 kbit/s. Au delà
        de cette vitesse, les données sont mise en attente dans la file du
        modem. Un paquet de ping peut atteindre le modem immédiatement mais
        devoir attendre quelques secondes avant de rejoindre Internet si la
        file d'attente du modem est remplie. La plupart des modems ADSL ne
        permettent pas de contrôler la façon dont les paquets sont retirés
        de la file d'attente ni quelle est la taille de cette dernière.
        Le premier objectif consiste donc à déplacer le point de congestion
        des paquets sortants à un endroit où on peut exercer suffisamment
        de contrôle.
      </p><p>
        La file HTB limite le rythme d'envoi des paquets au modem ADSL.
        Bien que le rythme montant puisse atteindre 128 kb/s, on doit le
        brider à une valeur légèrement inférieure. Pour limiter la latence,
        il faut être certain du fait qu'aucun paquet n'est mis en attente au
        niveau du modem. L'expérience m'a indiqué qu'une limitation à
        90 kb/s du trafic sortant me donne 95 % de la bande passante atteinte
        en l'absence de HTB. L'activation de HTB à ce rythme prévient la
        mise en file d'attente par le modem ADSL.
      </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="d0e310"/>3.2. Gestion des files de priorité avec HTB</h3></div></div></div><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"/></td><th align="left">Note</th></tr><tr><td align="left" valign="top"><p>
        Remarque: les affirmations antérieures de cette section (concernant
        la mise en file d'attente à N voies) se sont avérées erronées.
        En l'occurrence, il était possible de classer les paquets dans les 
        éléments de la file de priorité juste au moyen du champ fwmark. Cette
        fonctionnalité n'était toutefois guère documentée lors de la rédaction
        de la version 0.1 du guide pratique.
      </p></td></tr></table></div><p>
        Pour l'instant, les performances n'ont pas été modifiées. La file de
        type FIFO des paquets a simplement été déplacée du modem ADSL au
        routeur. Comme Linux a une longueur de file égale à 100 paquets par
        défaut, la situation s'est probablement aggravée (mais pas pour
        longtemps).
      </p><p>
        Chaque classe adjacente dans une file HTB peut se voir attribuer une
        priorité. En plaçant différents types de trafic dans des classes
        distinctes et en affectant à ces classes des priorités spécifiques,
        l'ordre dans lequel les paquets sont extraits de la file puis émis
        est contrôlable. HTB le permet tout en évitant qu'une classe ne soit
        éteinte puisqu'une bande passante minimale pour chaque classe peut
        être garantie. En outre, HTB autorise une classe à utiliser jusqu'à
        un certain niveau la bande passante laissée libre par les autres
        classes.
      </p><p>
        Une fois les classes en place, on installe des filtres qui
        répartissent le trafic dans les classes. Plusieurs approches sont
        envisageables mais le document s'appuie sur les utilitaires
        courants ipchains/iptables pour marquer les paquets avec un
        indicateur fwmark. Les filtres dirigent le trafic dans les classes
        de la file HTB selon leur indice fwmark. De cette façon, les
        règles de reconnaissance d'iptables aiguillent certains trafics
        suivant leur classe.
      </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="d0e322"/>3.3. Classification des paquets sortant avec iptables</h3></div></div></div><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"/></td><th align="left">Note</th></tr><tr><td align="left" valign="top"><p>
        Remarque: cette documentation reposait à l'origine sur ipchains pour
        trier les paquets. iptables est à présent utilisé.
      </p></td></tr></table></div><p>
        La dernière étape de configuration du routeur pour augmenter la
        priorité du trafic interactif consiste à spécifier au filtre 
        comment identifier le trafic. Ceci s'effectue avec le champ fwmark
        des paquets.
      </p><p>
        Sans trop rentrer dans les détails, voici une description simplifiée
        du cheminement des paquets entre quatre classes dont celle d'indice
        0x00 a la priorité la plus élevée:
      </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
            On marque tous les paquets avec l'indice 0x03. Ceci les place
            tous dans la file de priorité la plus basse.
          </p></li><li class="listitem"><p>
            On marque les paquets ICMP avec l'indice 0x00 afin que ping
            fournisse la latence des paquets de priorité la plus élevée.
          </p></li><li class="listitem"><p>
            On marque tous les paquets dont le port destination est
            inférieur à 1024 comme 0x01. Les services système tels telnet et
            ssh voient leur priorité augmenter. Le port de contrôle de ftp
            rentre dans cette catégorie. Toutefois, les transferts de données
            ftp ont lieu avec des ports situés plus haut et ils restent
            donc dans la catégorie 0x03.
          </p></li><li class="listitem"><p>
            On marque tous les paquets à destination du port 25 (SMTP) avec
            un indice 0x03 afin d'éviter que l'envoi d'un courrier muni d'un
            attachement volumineux n'empiète sur le trafic interactif.
          </p></li><li class="listitem"><p>
            On marque tous les paquets en direction d'un serveur de jeu
            avec un indice 0x02. Les joueurs fous auront une bonne
            latence sans écraser les applications système qui demandent
            une latence faible.
          </p><p>
            On marque tous les paquets de petite taille avec un indice 0x02.
            Les paquets de type ACK des téléchargements doivent être retournés
            rapidement afin d'assurer des transferts efficaces. Ceci est
            possible grâce au module adéquat (c'est-à-dire length) d'iptables.
          </p></li></ol></div><p>
        Tout ce qui précède est bien sûr personnalisable en fonction des
        besoins.
      </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="d0e352"/>3.4. Des réglages supplémentaires...</h3></div></div></div><p>
        Deux choses sont encore susceptibles d'améliorer la latence.
        La MTU peut être positionnée en dessous de la valeur par
        défaut de 1500 octets. Sa diminution se répercute sur le temps
        moyen d'attente lors de l'envoi d'un paquet prioritaire lorsqu'un
        paquet de faible priorité est déjà en cours de transmission. La
        bande passante en souffre puisque le poids relatif des informations
        d'en-tête augmente (40 octets pour le couple TCP et IP).
      </p><p>
        La longueur de queue de 100 paquets par défaut, qui demande jusqu'à 10
        secondes pour se vider avec une ligne ADSL et une MTU de 1500 octets,
        peut également être abaissée.
      </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="d0e359"/>3.5. Une tentative de limitation du trafic entrant</h3></div></div></div><p>
        L'emploi d'un périphérique de file intermédiaire (IMQ ou
        Intermediate Queuing Device) place tous les paquets entrants dans une
        file d'une façon analogue au traitement des paquets sortants. La
        gestion de la priorité en est simplifiée. On met tout le trafic hors TCP
        dans la classe 0x00, le trafic TCP étant quant à lui dans la classe
        0x01. Les petits paquets vont également dans la classe 0x00 car il
        s'agit vraisemblablement d'acquittements de données sortantes déjà
        émises. Une file d'attente FIFO standard est appliquée à la classe
        0x00 et une queue de rejet anticipé aléatoire (Random Early Drop/RED)
        traite la classe 0x01. RED est meilleur qu'une FIFO pour le contrôle
        de TCP en ce qu'il rejette des paquets avant que la file ne déborde
        afin de ralentir le trafic qui semble sur le point de devenir
        incontrôlable. Les deux classes sont également bornées
        supérieurement à une valeur inférieure à la capacité maximale de la
        ligne ADSL.
      </p><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="d0e364"/>3.5.1. Problèmes soulevés par la limitation de trafic entrant</h4></div></div></div><p>
        On souhaite limiter le trafic entrant afin de ne pas remplir la file
        d'émission du côté du FAI qui est susceptible de contenir jusqu'à
        5 secondes de données. La seule façon de limiter le trafic entrant
        consiste à jeter des paquets tout à fait valables. Ces paquets ont
        déjà consommé leur quote part de bande passante et le routeur Linux
        les jette afin de limiter le rythme d'arrivée des paquets futurs.
        Ces paquets seront sûrement retransmis et consommeront davantage de
        bande passante. La limitation du trafic porte sur le rythme auquel
        les paquets vont être acceptés. Comme le taux
        <span class="emphasis"><em>courant</em></span> est bien supérieur en raison des paquets
        jetés, la bande passante descendante doit être <span class="emphasis"><em>bien</em></span>
        inférieure à la capacité de la ligne pour maintenir une latence faible.
        En pratique, j'ai dû brider ma connexion ADSL descendante de 1,5Mb/s à
        700kb/s afin de conserver une bonne latence avec 5 téléchargements
        simultanés. Plus les sessions TCP sont nombreuses, plus la bande
        passante perdue dans les paquets jetés est élevée et plus il faut
        limiter le taux de transfert.
      </p><p>
        Une meilleure méthode consisterait à jouer sur la fenêtre TCP mais
        je ne connais pas d'outil libre pour le faire sous Linux.
      </p></div></div></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title"><a id="implementation"/>4. Réalisation</h2></div></div></div><p>
      Après toutes ces explications, il est temps de passer à la mise en
      oeuvre sous Linux.
    </p><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="d0e382"/>4.1. Avertissements</h3></div></div></div><p>
        Brider le rythme d'émission des données vers le modem ADSL n'est pas
        aussi simple qu'il y parait. La plupart des modems DSL établit
        juste un pont Ethernet entre le routeur Linux et la passerelle du
        côté du FAI. La couche de liaison de données s'appuie le plus
        souvent sur ATM qui envoie les données au moyen de cellules de 53
        octets. Cinq octets sont consommés pour l'en-tête ATM laissant ainsi
        48 octets de données utiles. La transmission d'un simple octet de
        données isolé ne peut donc pas demander moins de 53 octets au niveau
        du lien ATM. Dans le cas d'un acquittement TCP typique qui comprend
        0 octet de données, 20 octets d'en-tête TCP, autant d'en-tête IP
        et 18 de préambule Ethernet, les données utiles (40 octets) sont
        inférieures au minimum de 48 octets requis par une trame Ethernet.
        Afin d'envoyer les 64 (48+16) octets via ATM, deux cellules ATM sont
        nécessaires, d'où une consommation de 106 octets de bande passante au
        niveau du lien ADSL. Chaque paquet TCP d'acquittement gaspille donc
        42 octets de bande passante. Ceci ne serait pas gênant si Linux prenait
        en compte l'encapsulation due au modem ADSL. Il ne peut malheureusement
        pas le faire et se cantonne aux en-têtes TCP et IP ainsi qu'aux 14
        octets d'adresse MAC (les quatre octets de CRC gérés au niveau matériel sont
        ignorés). Linux ne prend pas en compte la taille minimale de trame
        Ethernet ni la taille de cellule ATM.
      </p><p>
        Tout ceci pour convaincre qu'il faut limiter le trafic sortant à une
        valeur sensiblement inférieure à la véritable capacité de la ligne
        (jusqu'à ce qu'on dispose d'un ordonnanceur de paquets capable de
        prendre en compte les différentes encapsulations employées). Vous
        pouvez penser avoir trouvé un bon réglage mais constater des sauts de
        latence au delà de trois secondes lors d'un téléchargements important. Ceci
        viendra probablement d'une mauvaise évaluation de la bande passante
        consommée par les petits paquets d'acquittement.
      </p><p>
        Je travaille depuis quelques mois sur une solution à ce problème et
        j'ai presque terminé quelque chose qui sera publié afin que chacun
        puisse le tester. Ma solution repose sur une file en espace
        utilisateur à la place de la QoS de Linux pour limiter le rythme de
        transfert des paquets. Il s'agit d'une variante d'HTB en espace
        utilisateur. Pour l'instant cette solution a été capable de réguler
        le trafic sortant lors de téléchargements massifs (plusieurs flux)
        et de transferts point-à-point en volume (gnutella, sic) avec une
        telle efficacité que la latence dépasse au plus de 400 ms la
        latence nominale de 15 ms inhérente à mon lien ADSL. Pour davantage
        d'informations, abonnez-vous à la liste de diffusion ou surveillez
        les mises à jour de ce document.
      </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="d0e391"/>4.2. Script: mon_limiteur</h3></div></div></div><p>
        Ci-suit le source d'un script que j'emploie pour gérer la bande
        passante de mon routeur Linux. Il s'appuie sur les concepts expliqués
        dans ce guide. Le trafic sortant est ventilé entre une des sept files
        disponibles en fonction de son type. Le trafic entrant est placé
        dans une file parmi deux, le trafic TCP étant jeté en premier en cas
        de surcharge de la ligne. Les valeurs conviennent à mon installation
        mais les résultats peuvent être différents ailleurs.
      </p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"/></td><th align="left">Note</th></tr><tr><td align="left" valign="top"><p>
        Ce script s'inspire du WonderShaper ADSL disponible sur le site du
        <a class="ulink" href="http://www.lartc.org" target="_top">LARTC</a>.
      </p></td></tr></table></div><pre class="programlisting">#!/bin/bash
#
# mon_limiteur - Limiteur et classificateur de trafic pour modem Cable ou ADSL. 
#		 Inspiré de WonderShaper (www.lartc.org)
#
# Écrit par Dan Singletary (7/8/02)
#
# Remarque - ce script suppose que le noyau a été patché avec les files
#	     HTB et IMQ disponibles ici (les noyaux à venir ne demanderont
#	     pas forcément l'application d'un correctif):
#       http://luxik.cdi.cz/~devik/qos/htb/
#       http://luxik.cdi.cz/~patrick/imq/
#
# Options de configuration pour mon_limiteur:
#  DEV    - correspond au périphérique ethX connecté au modem
#  RATEUP - à positionner à une valeur inférieure à la bande
#	    passante montante de la ligne.
#	    Pour ma ligne ADSL en 1500/128, RATEUP=90 convient au rythme
#	    montant de 128kbps. A vous d'ajuster.
#  RATEDN - à positionner en dessous de la bande passante descendante de
#	    la ligne.
#
#
#  Principe d'utilisation d'imq pour limiter le trafic entrant:
#
#    Il est impossible de limiter directement le rythme auquel les
#  données vous sont envoyées depuis l'Internet. Afin de limiter le
#  trafic entrant, on s'appuie sur les mécanismes anti-congestion de
#  TCP. Ceci signifie que SEUL LE TRAFIC TCP PEUT SE LIMITER. Le
#  trafic hors TCP est placé dans une queue prioritaire car le jeter
#  ne conduit vraisemblablement qu'à une retransmission ultérieure
#  qui accroît la bande passante consommée.
#  On limite le trafic TCP en jetant les paquets lorsqu'ils débordent
#  de la file HTB qui les limitera à un certain rythme (RATEDN)
#  légèrement inférieur à la capacité réelle de la ligne. Jeter ces
#  paquets revient à en singer la perte par la file d'émission du
#  côté du FAI. Ceci a l'avantage d'éviter la congestion de la file
#  d'émission chez le FAI puisque TCP ralentira avant qu'elle ne
#  se remplisse. L'usage d'une stratégie de mise en attente basée sur
#  la classification des paquets par priorité permet de ne PAS jeter
#  certains types de paquets (ssh, telnet, etc). Les paquets ne sont
#  retirés des files d'attente de faible priorité qu'une fois que
#  chaque classe a atteint un seuil minimum (1/7 de la bande passante
#  dans ce script).
#
#  Résumé:
#   * La perte d'un paquet TCP diminue le rythme de réception de la
#     connexion associée via les mécanismes de contrôle de congestion.
#   * Jeter des paquets TCP n'apporte rien. S'ils sont importants, ils
#     seront retransmis.
#   * Limiter le rythme des connexions TCP entrantes en dessous de la
#     capacité de la ligne DEVRAIT éviter la mise en attente des paquets
#     du côté du FAI (DSLAM, concentrateur de cables, etc). L'expérience
#     indique que ces files contiennent 4 secondes de trafic à 1500kbps,
#     soit 6Mb de données. A ce niveau, l'absence de mise en attente
#     diminue la latence.
#
#  Avertissements:
#   * Est-ce que la limitation de bande passante diminue l'efficacité de
#     transferts TCP massifs ?
#     - Apparemment non. L'augmentation de priorité des paquets
#       d'acquittement maximise le débit en évitant de perdre de la bande
#       passante à retransmettre des paquets déjà reçus.
#   

# NOTE: La configuration ci-dessous fonctionne avec ma connexion ADSL
# 1.5M/128K via Pacific Bell Internet (SBC Global Services)

DEV=eth0
RATEUP=90
RATEDN=700  # Nettement inférieur à la capacité de la ligne de 1500.
	    # On n'a donc pas à limiter le trafic entrant jusqu'à ce
	    # qu'une meilleure réalisation telle que la modification
	    # de fenêtre TCP soit disponible.

# 
# Fin des options de configuration
#

if [ "$1" = "status" ]
then
        echo "[qdisc]"
        tc -s qdisc show dev $DEV
        tc -s qdisc show dev imq0
        echo "[class]"
        tc -s class show dev $DEV
        tc -s class show dev imq0
        echo "[filter]"
        tc -s filter show dev $DEV
        tc -s filter show dev imq0
        echo "[iptables]"
        iptables -t mangle -L MONLIMITEUR-OUT -v -x 2&gt; /dev/null
        iptables -t mangle -L MONLIMITEUR-IN -v -x 2&gt; /dev/null
        exit
fi

# Remise à zéro
tc qdisc del dev $DEV root    2&gt; /dev/null &gt; /dev/null
tc qdisc del dev imq0 root 2&gt; /dev/null &gt; /dev/null
iptables -t mangle -D POSTROUTING -o $DEV -j MONLIMITEUR-OUT 2&gt; /dev/null &gt; /dev/null
iptables -t mangle -F MONLIMITEUR-OUT 2&gt; /dev/null &gt; /dev/null
iptables -t mangle -X MONLIMITEUR-OUT 2&gt; /dev/null &gt; /dev/null
iptables -t mangle -D PREROUTING -i $DEV -j MONLIMITEUR-IN 2&gt; /dev/null &gt; /dev/null
iptables -t mangle -F MONLIMITEUR-IN 2&gt; /dev/null &gt; /dev/null
iptables -t mangle -X MONLIMITEUR-IN 2&gt; /dev/null &gt; /dev/null
ip link set imq0 down 2&gt; /dev/null &gt; /dev/null
rmmod imq 2&gt; /dev/null &gt; /dev/null

if [ "$1" = "stop" ] 
then 
        echo "Limitation de débit désactivée sur $DEV."
        exit
fi

###########################################################
#
# Limitation de trafic sortant (limite supérieure à RATEUP)

# positionnement de la taille de la file d'émission pour obtenir
# une latence d'environ 2 secondes pour les paquets de la file
# de faible priorité.
ip link set dev $DEV qlen 30

# modification de MTU du périphérique sortant.
# - Diminuer la MTU abaisse la latence mais dégrade le débit en raison de
#   la surcharge IP et TCP.
ip link set dev $DEV mtu 1000

# ajout de la stratégie HTB
tc qdisc add dev $DEV root handle 1: htb default 26

# ajout de la classe de limitation principale
tc class add dev $DEV parent 1: classid 1:1 htb rate ${RATEUP}kbit

# ajout des classes filles:
# - chaque classe dispose AU MOINS de son quota de bande passante. Aucune
#   classe n'est donc étouffée par les autres. Chaque classe peut également
#   consommer toute la bande passante si aucune autre classe ne l'emploie.
tc class add dev $DEV parent 1:1 classid 1:20 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 0
tc class add dev $DEV parent 1:1 classid 1:21 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 1
tc class add dev $DEV parent 1:1 classid 1:22 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 2
tc class add dev $DEV parent 1:1 classid 1:23 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 3
tc class add dev $DEV parent 1:1 classid 1:24 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 4
tc class add dev $DEV parent 1:1 classid 1:25 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 5
tc class add dev $DEV parent 1:1 classid 1:26 htb rate $[$RATEUP/7]kbit ceil ${RATEUP}kbit prio 6

# ajout de la stratégie aux classes filles
# - SFQ offre un traitement sensiblement équitable de chaque classe.
tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev $DEV parent 1:21 handle 21: sfq perturb 10
tc qdisc add dev $DEV parent 1:22 handle 22: sfq perturb 10
tc qdisc add dev $DEV parent 1:23 handle 23: sfq perturb 10
tc qdisc add dev $DEV parent 1:24 handle 24: sfq perturb 10
tc qdisc add dev $DEV parent 1:25 handle 25: sfq perturb 10
tc qdisc add dev $DEV parent 1:26 handle 26: sfq perturb 10

# répartition du trafic en classe via fwmark
# - le trafic est réparti en classes de priorité suivant l'indicateur
#   fwmark des paquets (ceux-ci sont positionnés avec iptables un peu plus
#   loin). La classe de priorité par défaut a été mise à 1:26 de telle sorte
#   que les paquets qui ne sont pas marqués se retrouvent dans la classe de
#   priorité la plus faible.
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 22 fw flowid 1:22
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 23 fw flowid 1:23
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 24 fw flowid 1:24
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 25 fw flowid 1:25
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 26 fw flowid 1:26

# ajout de MONLIMITEUR-OUT à la table de modification des paquets d'iptables
# - ceci déclare la table employée pour filtrer et classer les paquets
iptables -t mangle -N MONLIMITEUR-OUT
iptables -t mangle -I POSTROUTING -o $DEV -j MONLIMITEUR-OUT

# ajout de fwmark pour classer les différents types de trafic
# - fwmark est positionné de 20 à 26 suivant la classe. 20 correspond à la
#   priorité la plus forte.
iptables -t mangle -A MONLIMITEUR-OUT -p tcp --sport 0:1024 -j MARK --set-mark 23 # Trafic sur les ports bas
iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport 0:1024 -j MARK --set-mark 23 # "" 
iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport 20 -j MARK --set-mark 26     # Port ftp-data, faible priorité
iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport 5190 -j MARK --set-mark 23   # Messagerie Immédiate AOL
iptables -t mangle -A MONLIMITEUR-OUT -p icmp -j MARK --set-mark 20               # ICMP (ping) - forte priorité (impressionnez vos amis)
iptables -t mangle -A MONLIMITEUR-OUT -p udp -j MARK --set-mark 21                # DNS (petits paquets)
iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport ssh -j MARK --set-mark 22    # shell sécurisé
iptables -t mangle -A MONLIMITEUR-OUT -p tcp --sport ssh -j MARK --set-mark 22    # shell sécurisé
iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport telnet -j MARK --set-mark 22 # telnet (hum...)
iptables -t mangle -A MONLIMITEUR-OUT -p tcp --sport telnet -j MARK --set-mark 22 # telnet (hum...)
iptables -t mangle -A MONLIMITEUR-OUT -p ipv6-crypt -j MARK --set-mark 24         # IPSec - la surcharge n'est pas connue...
iptables -t mangle -A MONLIMITEUR-OUT -p tcp --sport http -j MARK --set-mark 25   # Serveur WWW local
iptables -t mangle -A MONLIMITEUR-OUT -p tcp -m length --length :64 -j MARK --set-mark 21 # Petits paquets (des ACK probablement)
iptables -t mangle -A MONLIMITEUR-OUT -m mark --mark 0 -j MARK --set-mark 26      # Répétition - on marque les paquets restants à 26 (faible priorité)

# Fin de la limitation sortante
#
####################################################

echo "Limitation de trafic sortant activé sur $DEV.  Débit: ${RATEUP}kbit/sec."

# Décommenter la ligne suivante pour n'avoir que la limitation de trafic montant.
# exit

####################################################
#
# Limitation du trafic entrant (débit maximal de RATEDN)

# on force le chargement du module imq

modprobe imq numdevs=1

ip link set imq0 up

# ajout de la stratégie de mise en file d'attente
# - par défaut une classe 1:21 à faible priorité

tc qdisc add dev imq0 handle 1: root htb default 21

# ajout de la classe de limitation principale
tc class add dev imq0 parent 1: classid 1:1 htb rate ${RATEDN}kbit

# ajout des classes filles
# - trafic TCP en 21, le reste en 20
#
tc class add dev imq0 parent 1:1 classid 1:20 htb rate $[$RATEDN/2]kbit ceil ${RATEDN}kbit prio 0
tc class add dev imq0 parent 1:1 classid 1:21 htb rate $[$RATEDN/2]kbit ceil ${RATEDN}kbit prio 1

# ajout de la stratégie de limitation aux classes filles
# - voir les remarques ci-dessus sur SFQ.
tc qdisc add dev imq0 parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev imq0 parent 1:21 handle 21: red limit 1000000 min 5000 max 100000 avpkt 1000 burst 50

# répartition du trafic en classe via fwmark
# - le trafic est réparti en classes de priorité suivant l'indicateur
#   fwmark des paquets (ceux-ci sont positionnés avec iptables un peu plus
#   loin). La classe de priorité par défaut à été mise à 1:26 de telle sorte
#   que les paquets qui ne sont pas marqués se retrouvent dans la classe de
#   priorité la plus faible.
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21

# ajout de MONLIMITEUR-IN à la table de modification des paquets d'iptables
iptables -t mangle -N MONLIMITEUR-IN
iptables -t mangle -I PREROUTING -i $DEV -j MONLIMITEUR-IN

# ajout de fwmark pour classer les différents types de trafic
# - fwmark est positionné de 20 à 21 suivant la classe. 20 correspond à la
#   priorité la plus forte.
iptables -t mangle -A MONLIMITEUR-IN -p ! tcp -j MARK --set-mark 20              # Forte priorité pour les paquets non TCP
iptables -t mangle -A MONLIMITEUR-IN -p tcp -m length --length :64 -j MARK --set-mark 20 # Les petits paquets TCP sont probablement des ACK
iptables -t mangle -A MONLIMITEUR-IN -p tcp --dport ssh -j MARK --set-mark 20    # shell sécurisé
iptables -t mangle -A MONLIMITEUR-IN -p tcp --sport ssh -j MARK --set-mark 20    # shell sécurisé
iptables -t mangle -A MONLIMITEUR-IN -p tcp --dport telnet -j MARK --set-mark 20 # telnet (hum...)
iptables -t mangle -A MONLIMITEUR-IN -p tcp --sport telnet -j MARK --set-mark 20 # telnet (hum...)
iptables -t mangle -A MONLIMITEUR-IN -m mark --mark 0 -j MARK --set-mark 21              # Répétition - les paquets sans marque sont positionnés à 21 (faible priorité)

# on envoie les paquets précédents à l'interface imq0.
iptables -t mangle -A MONLIMITEUR-IN -j IMQ

# Fin de la limitation de trafic entrant.
#
####################################################

echo "Limitation de trafic entrant activée sur $DEV.  Débit: ${RATEDN}kbit/sec."</pre></div></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title"><a id="testing"/>5. Test</h2></div></div></div><p>
      La méthode de test la plus facile consiste à saturer le lien montant
      avec du trafic à faible priorité. Si le trafic telnet et le ping ont
      une priorité élevée par opposition aux transferts FTP, l'augmentation
      de délai des pings lorsqu'un transfert FTP s'établit devrait être
      négligeable par rapport à ce qu'elle devient en l'absence de file
      d'attente. Des pings en dessous de 100 ms dépendent de la configuration.
      Des pings au dessus d'une ou deux secondes signalent une anomalie.
    </p></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title"><a id="onward"/>6. Ça fonctionne. Et maintenant ?</h2></div></div></div><p>
      Maintenant que la bande passante est gérée, il faut s'en servir. Après
      tout, elle a été payée !
    </p><div class="itemizedlist"><ul class="itemizedlist" type="bullet"><li class="listitem"><p>
      Utilisez un client Gnutella et PARTAGEZ VOS FICHIERS sans dégrader les
      performances de votre réseau.
    </p></li><li class="listitem"><p>
      Hébergez un site web sans que la consultation ne ralentisse vos
      sessions Quake.
    </p></li></ul></div></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title"><a id="links"/>7. Liens</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="bullet"><li class="listitem"><p>
           Contrôleur de bande passante pour Windows (<span class="foreignphrase"><em class="foreignphrase">Bandwidth
           Controller for Windows</em></span>) —
           <a class="ulink" href="http://www.bandwidthcontroller.com" target="_top">http://www.bandwidthcontroller.com</a>
         </p></li><li class="listitem"><p>
           <a class="ulink" href="http://www.sonicspike.net/software#dsl_qos_queue" target="_top">dsl_qos_queue</a> -
           (bêta) pour Linux. Pas de correctifs pour le noyau et de meilleurs
           performances
         </p></li></ul></div></div></div></body></html>