qos
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédente | |||
qos [2009/03/14 21:42] – root | qos [Date inconnue] (Version actuelle) – supprimée - modification externe (Date inconnue) 127.0.0.1 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== 1. Généralités ====== | ||
- | |||
- | Le terme **QoS** (Quality of Service) désigne de nombreux éléments et mécanismes du réseau, mais il est très souvent réduit aux problématiques de bande passante. Nous allons voir que dans le contexte précis du noyau Linux il s'agit effectivement de gérer les débits au niveau des interfaces, mais aussi leur latence et l' | ||
- | |||
- | ===== Contexte ===== | ||
- | |||
- | La question de qualité de service peut se poser à différents endroits: depuis un appareil final (ordinateur, | ||
- | |||
- | ===== Fonctions ===== | ||
- | |||
- | La QoS dans sa définition la plus restreinte désigne un ensemble de fonctions et de paramètres appliqués à une interface réseau et visant à régir son traffic sortant et - dans une moindre mesure - entrant. Les fonctions que nous allons pouvoir gérer sont: | ||
- | * Le **contrôle de bande passante** (// | ||
- | * L**' | ||
- | * Le **contrôle de congestion** (// | ||
- | |||
- | Il est important de comprendre que si on peut évidemment contrôler et arbitrer totalement ce que l'on fait sortir par une interface, il n'en est pas de même pour le traffic entrant qui dépend de caractéristiques du réseau indépendantes de notre interface. Ainsi la gestion de bande passante et d' | ||
- | |||
- | ====== 2. Architecture ====== | ||
- | |||
- | ===== Qdisc ===== | ||
- | |||
- | Les **queue disciplines** représentent une structure de donnée et un algorithme particulier pour traiter un flux de paquet transitant via une interface. Les traitements possibles sont les suivants: | ||
- | * Limitation de bande passante (en sortie) | ||
- | * Réordonnancement des paquets | ||
- | * Lachâge de paquets | ||
- | Dans le modèle QoS, chaque interface possède une telle **qdisc** (celle par défaut étant une simple FIFO). | ||
- | |||
- | Il existent une catégorie de//qdisc// dites **classless** qui se contentent d' | ||
- | * **pfifo**, **bfifo**: simple FIFO avec limite de vitesse par paquets ou octets | ||
- | * **pfifo_fast**: | ||
- | * **red**: pour //Random Early Detection// (prévention de congestion) | ||
- | * **sfq**: pour // | ||
- | * **tbf**: pour //Tocken Bucket Filter// (contrôle précis de la bande passante) | ||
- | |||
- | Enfin il existe des //qdisc// dites **classfull** qui permettent de créer des hiérarchies complexes de règles de traffic, et en particulier d' | ||
- | * **CBQ**: pour //Class Based Queuing//, le mécanisme historique de QoS | ||
- | * **HTB**: pour //Hierarchy Tocken Bucket//, alternative à CBQ pour des situations différentes | ||
- | * **PRIO**: un simple algorithme de gestion de priorité en servant les classes dans l' | ||
- | |||
- | Pour nommer les //qdisc//, on utilise un simple numéro appelé le **majeur** noté sous la forme **5:** (pour le //qdisc// numéro 1). | ||
- | |||
- | ===== Classes ===== | ||
- | |||
- | Les classes n' | ||
- | |||
- | Pour nommer les classes, on leur attribue un simple numéro appelé le //mineur// et on les préfixe toujours avec le numéro (// | ||
- | |||
- | ===== Filtres ===== | ||
- | |||
- | Pour les //qdisc classfull//, | ||
- | |||
- | |||
- | |||
- | ====== 3. Classification du traffic ====== | ||
- | |||
- | Avant de pouvoir décider de quelle gestion nous allons appliquer aux " | ||
- | |||
- | #tc filter add dev eth0 parent x:y protocol ip prio 1 [...filtre...] flowid a:b | ||
- | |||
- | * **add dev eth0**: un filtre est toujours attaché à une interface particulière | ||
- | * **parent x:y**: un filtre permet de distribuer les paquets parmi les //classes// d'un //qdisc// (voir plus loin | ||
- | * **protocl ip**: les filtres dépendent du protocole de transport choisi (ip, atm, etc) | ||
- | * **prio 1**: les filtres sont évalués dans l' | ||
- | * **...filtre...**: | ||
- | * **flowid a:b**: si un paquet remplit les critères du filtre il est envoyé à cette //classe// du //qdisc// | ||
- | |||
- | ===== Propriétés IP ===== | ||
- | |||
- | La classification la plus simple se base sur les IP sources ou destination : | ||
- | |||
- | #tc filter ... u32 match ip src 193.82.10.25/ | ||
- | #tc filter ... u32 match ip dst 193.82.10.51/ | ||
- | |||
- | ... ou bien les ports source et destination: | ||
- | |||
- | #tc filter ... u32 match ip sport 3306 0xffff ... | ||
- | #tc filter ... u32 match ip dport 80 0xffff ... | ||
- | |||
- | ===== ToS ===== | ||
- | |||
- | Le protocole IP possède un champ standard de quelques bits appelé **ToS** (Type of Service) qui peut valoir // | ||
- | |||
- | #tc filter ... u32 match ip tos 0x01 0xff ... | ||
- | |||
- | Où **0xff** est le masque (le champ ToS fait 8 bits) et **0x01** la valeur recherchée (consulter //Type of Service// dans la RFC791). | ||
- | |||
- | ===== iptables ===== | ||
- | |||
- | Si l'on a déjà fait un effort de classification pour un parefeu via **iptables**, | ||
- | |||
- | Si le parquet a été marqué avec le mécanisme //mangle// (numérotage des paquets), il peut être reconnu avec le filtre //handle// : | ||
- | |||
- | #iptables -A PREROUTING -t mangle -i eth1 -j MARK --set-mark 42 | ||
- | #tc filter ... handle 42 ... | ||
- | |||
- | ====== 4. Classfull queuing ====== | ||
- | |||
- | Dans le schéma général où l'on désire associer des qualités de service différentes à des flux distincts, les règles qui vont s' | ||
- | |||
- | ===== Example simple: PRIO ===== | ||
- | |||
- | Le //qdisc// **PRIO** est l'un des exemples " | ||
- | |||
- | Par défaut, cet algorithme permet une classification directe via une liste de correspondance associant le **ToS** d'un paquet IP avec une bande spécifique (donc il est possible de se passer de //tc filter//). C'est d' | ||
- | |||
- | Cet algorithme possède un défaut de conception important: il est possible de se retrouver dans une situation où la première bande ne désemplit jamais, et donc les paquets des bandes suivantes ne sont jamais distribués. On le combine donc en général avec des solutions de limitation de bande passante au niveau des bandes de haute priorité (par ex **TBF**). | ||
- | |||
- | ===== Example complexe: HTB ===== | ||
- | |||
- | Le //qdisc// **HTB** est basé au niveau de ses classes sur le même algorithme que **TBF** (le //tocken bucket//, voir plus bas). Il permet de réutiliser des notions intuitives de gestion et de limitation de bande passante mais de manière différenciée sur des flux distincts. | ||
- | |||
- | La différence notable est l' | ||
- | |||
- | Illustration: | ||
- | * **classe :1** : une limitation de bande passante // | ||
- | * **classe :2** : une limitation de bande passante // | ||
- | Si votre interface est saturée, alors l' | ||
- | * **classe :1** : le trafic peut dépasser 80Mbps et " | ||
- | * **classe :2** : le trafic ne dépassera en aucun cas 20Mbps, même si l' | ||
- | |||
- | |||
- | ====== 5. Bande passante et latence ====== | ||
- | |||
- | Les notions de bande passante et de latence sont étroitement liées, selons différents contextes. | ||
- | |||
- | * **Bande passante**: une mesure du flux d' | ||
- | |||
- | * **Latence**: | ||
- | |||
- | ===== La file d' | ||
- | |||
- | Chaque interface réseau est associée avec une file d' | ||
- | Latence = Longueur_file / Bande_passante | ||
- | | ||
- | Ex: 2.6ms = 32KB / 100Mbps | ||
- | |||
- | |||
- | Bien qu'il soit objectivement désirable de réduire la file d' | ||
- | * Tranferts vers l' | ||
- | * Efficacité du transfert : afin de profiter au maximum de la bande passante disponible, il est important d' | ||
- | |||
- | ===== Le protocole TCP ===== | ||
- | |||
- | Le protocole TCP a la particularité de contrôler son flux, en d' | ||
- | |||
- | La gestion du flux se fait par l' | ||
- | |||
- | Cela signifie que la bande passante d'un transfert TCP, par exemple dans un sens descendant : | ||
- | * dépend d'un seuil de latence de transfert entre les deux extrémités (RTT) | ||
- | * dépend de la bande passante montante | ||
- | |||
- | ===== Le Tocken bucket ===== | ||
- | |||
- | L' | ||
- | |||
- | Le principe est le suivant: on considère que l'on possède un **seau** que l'on remplit de jetons de manière régulière à un débit constant (le débit de contrôle), sauf quand le seau est " | ||
- | |||
- | Le trafic sortant est donc toujours limité par la vitesse de remplissage du seau, mais **en moyenne seulement** puisqu' | ||
- | |||
- | La taille du seau est en général dénommée **burst** et désigne la quantité d' | ||
qos.1237066939.txt.gz · Dernière modification : 2009/03/14 21:42 de root