Trafikkregulering med ALTQ

Innholdsfortegnelse
ALTQ - prioritere etter trafikktype
ALTQ - prosentvis fordeling
ALTQ - håndtere uønsket trafikk

ALTQ - forkortelse for ALTernate Queueing - er en svært fleksibel trafikkstyringsmekanisme som levde et eget liv før den ble integrert i PF. Dette var enda en ting som det var mest praktisk å integrere.

Altq bruker begrepet queue, altså "kø", om hovedmekanismen for trafikkstyringen. Man definerer køer med gitt båndbredde eller del av båndbredde, der hver kø kan utstyres med underordnede køer av ulike typer.

Bildet blir komplett når du lager filtreringsregler som henviser pakkene til en gitt kø eller forsåvidt et utvalg delkøer der pakkene kan slippe til etter nærmere definerte kriterier.

Køene kan følge flere disipliner. Normal køordning uten ALTQ er FIFO, altså første inn første ut.

Mer interessante er disiplinen som gjør køene klassebaserte (CBQ), noe som i praksis betyr at du angir båndbredden for køen som absolutt datamengde per sekund, enten prosent eller i kilobit, megabit og så videre, med mulighet for prioritetsangivelse i tillegg, eller prioritetsbasert (priq), der du kun angir en prioritet.

Prioritet kan angis fra 0 til 7 for cbq-køer, 0 til 15 for priq-køer, der høyere verdi gir høyere prioritet og bedre behandling. Endelig finnes det en hierarkisk kødisiplin, algoritmen er kjent som "Hierarchical Fair Service Curve", eller HFSC.

Syntaksen for definering av køer er kort

altq on grensesnitt type [alternativer ... ] hovedkø { delkø1, delkø2 ..}
  queue delkø1 [ alternativer ... ]
  queue delkø2 [ alternativer ... ]
[...]
pass [ ... ] queue delkø1
pass [ ... ] queue delkø2

Når du skal bruke dette i praksis, bør du uansett lese man-sidene for pf.conf og brukerhåndboken for PF. Der er syntaks og annet forklart svært detaljert og ganske oversiktlig.[1] [2]

ALTQ - prioritere etter trafikktype

Det første praktiske eksempelet er hentet fra Daniel Hartmeier. Daniel har som mange av oss en asymmetrisk forbindelse, og ønsket å få utnyttet båndbredden bedre.

Symptomet på at noen kunne gjøres bedre, var at inn-trafikk (nedlasting) så ut til å medføre at utgående trafikk gikk tregere.

En analyse kunne tyde på at dette kom av at ACK-pakkene for hver overførte datapakke ble forsinket uforholdsmessig mye, antakelig fordi den utgående trafikken ble køet etter FIFO-prinsippet, altså først inn, først ut.

En mulig hypotese som det var verd å prøve, var at de små ACK-pakkene, som praktisk talt ikke inneholder data, ville kunne snike seg forbi de større datapakkene hvis to køer med forskjellig prioritet var tilgjengelig. De relevante delene av regelsettet følger:

ext_if="kue0"

altq on $ext_if priq bandwidth 100Kb queue { q_pri, q_def }
queue q_pri priority 7
queue q_def priority 1 priq(default)

pass out on $ext_if proto tcp from $ext_if to any flags S/SA \
        keep state queue (q_def, q_pri)

pass in  on $ext_if proto tcp from any to $ext_if flags S/SA \
        keep state queue (q_def, q_pri)

Resultatet ble bedre båndbreddeutnyttelse.

Så hvorfor virker dette?

Så hvorfor virker dette?[3] Forklaringen finner vi i måten ALTQ-koden behandler underordnede køer med forskjellig prioritet. Når en forbindelse blir tilordnet hovedkøen, sjekker ALTQ 'type or service'-feltet (ToS) i hver enkelt pakke. ACK-pakker har 'Delay'-biten i Tos-feltet satt til 'low', noe som betyr at avsenderen ønsker raskest mulig levering.

Når ALTQ ser en pakke med lav ønsket forsinkelse og køer med forskjellige prioriteter er tilgjengelige, tilordner den pakken til køen med høyest prioritet. Dette betyr at ACK-pakkene hopper forbi køen med lavere prioritet og blir levert fortere, noe som i sin tur betyr at datapakkene også blir behandlet raskere.

Daniels artikkel er tilgjengelig på webstedet hans, http://www.benzedrine.cx/ackpri.html

Fotnoter

[1]

På FreeBSD krever ALTQ alternativene for ALTQ og de kødisiplinene du vil bruke er med i konfigurasjonen for kjernen som er i bruk. Se i kapittelet om PF i FreeBSD Handbook for nærmere beskrivelse.

[2]

I skrivende stund er ALTQ ikke integrert i PF på NetBSD, men Peter Postma vedlikeholder en patch som gjør funksjonaliteten tilgjengelig. Oppdatert informasjon om dette er tilgjengelig fra Peter Postmas PF på NetBSD-sider, http://nedbsd.nl/~ppostma/pf/

[3]

Tidligere versjoner av dette manuskriptet lot det stort sett være en oppgave for leseren å finne ut av.