Flow control na ethernetu

Projekt do Technologie počítačových sítí

Autor: Dušan Jalůvka, JAL016

Obsah

Trochu teorie
PAUSE rámec
Nastavení flow control
Nastavení na CISCO switchi
Nastavení na linuxu
Utilita flow-ctrl
Testovaná zařízení
Závěr
Zdroje

Trochu teorie

Flow control je metoda, která dovoluje řídit tok dat mezi dvěma propojenými zařízeními. V tomto projektu se budu zabývat pouze zařízeními propojenými ethernetovou full-duplex linkou. Na half-duplex lince není flow control podporován. Je definována v normě IEEE 802.3x. Zajištuje se pomocí PAUSE rámců. PAUSE rámce jsou speciální rámce ethernetu na druhé vrstvě referenčního modelu ISO OSI. Dovolují jednomu zařízení dočasně zastavit veškerý síťový provoz protější strany. (Kromě PAUSE rámců)

Když jsou dvě zařízení propojená full-duplexní ethernet linkou (například switch a počítač), data procházející z počítače přes switch někam dále se můžou shromažďovat ve vstupních buffrech switche. Pokud se buffery zaplní, tak switch začne rámce zahazovat. Pokud je na switchi i na počítači povolený a funkční mechanismus flow control, switch odešle na port, u kterého se mu zaplnily vstupní buffery, PAUSE rámec a tím pozastaví na určitou dobu odesílání dat počítačem. To umožní switchi odeslat nashromážděné data a uvolnit své buffery. Po uplynutí stanovené doby začne počítač znovu vysílat data. Switch může v průběhu pozastavení odesílání odeslat nový PAUSE rámec a počítač si do časovače nastaví novou hodnotu z nového PAUSE rámce a začne odpočítávat znovu. Pokud switch pošle PAUSE rámec s nulovou hodnotou, pro počítač to znamená, že může okamžitě pokračovat ve vysílání.

PAUSE rámce umožňují oboustrané řízení toku dat. Proto rozlišujeme symetrický a asymetrický flow control. Symetrický flow control znamená, že zařízení umí přijímat a reagovat na PAUSE rámce a také je umí v případě potřeby generovat. Asymetrický flow control znamená pouze jednu z možností. Buď umí přijímat a zpracovávat PAUSE rámce nebo je umí vysílat. Zařízení používají auto-negotiation protokol ke zjištění, kterou z možností flow control podporuje druhá strana.

PAUSE rámec

Na následující tabulce je znázorněna struktura PAUSE rámce. Jde o klasický ethernetový rámec, který je znázorněn níže.

Preamble
(7-bytes)
Start Frame
Delimiter
(1-byte)
Dest. MAC Address
(6-bytes)
Source MAC Address
(6-bytes)
Type
(2-bytes)
802.3 MAC Control
0x8808
MAC Control Opcode
(2-bytes)
PAUSE
(00-01)
MAC Control Param.
(2-bytes)
Reserved
(42-bytes)
samé nuly
CRC
(4-bytes)

Nastavení flow control

Ne všechny zařízení podporují flow control. Pro správnou funkčnost je třeba podpora operačního systému. V linuxu (ArchLinux, jádro 2.6.13) se podpora dá zapnout nástrojem ethtool, který je popsán níže. Ve Windows XP SP1 jsem nastavení flow control nenašel. Je také třeba, aby flow control podporoval hardware a hlavně jeho ovladače.

Nastavení flow control na CISCO switchi

Zjištění podpory flow control na CISCO switchi se provede příkazem show interfaces capabilities. Zkrácený výpis by vypadal asi takto:

Switch#show interfaces capabilities          
FastEthernet0/1
Model:                 WS-C3560-24TS
Type:                  10/100BaseTX
Speed:                 10,100,auto
Duplex:                half,full,auto
Trunk encap. type:     802.1Q,ISL
Trunk mode:            on,off,desirable,nonegotiate
Channel:               yes
Broadcast suppression: percentage(0-100)
Flowcontrol:           rx-(off,on,desired),tx-(none)
Fast Start:            yes
QoS scheduling:        rx-(not configurable on per port basis),tx-(4q2t)
CoS rewrite:           yes
ToS rewrite:           yes
UDLD:                  yes
Inline power:          no
SPAN:                  source/destination
PortSecure:            yes
Dot1x:                 yes

Z výpisu vidíme, že switch podporuje flow control jen pro příchozí rámce a dovoluje nastavit ho na off, on, desired. Desired volba se chová tak, že si z Auto-negotiation zjistí, jestli druhá strana flow control podporuje a pak ho začne používat. V opačném případě zůstane flow control na tomto rozhraní vypnut.

Změna nastavení se provede tak, že se přejde na interface, na kterém chceme flow control přenastavit a příkazem flowcontrol receive {on|off|desired} změníme nastavení. Vysílání PAUSE rámců se nastaví podobně, jen s volbou send. (flowcontrol send {on|off|desired}) Po zapnutí se můžeme podívat, jestli flow control pracuje správně:

Switch#show flowcontrol 
Port       Send FlowControl  Receive FlowControl  RxPause TxPause
           admin    oper     admin    oper                       
---------  -------- -------- -------- --------    ------- -------
Fa0/1      Unsupp.  Unsupp.  on       on          262     0      
Fa0/2      Unsupp.  Unsupp.  on       on          10      0

Dvojice sloupců pod Send FlowControl ukazuje jak je nastaven flow control pro odchozí PAUSE rámce. Sloupec admin ukazuje, jak byl flow control nastaven administrátorem a sloupec oper v jakém stavu flow control aktuálně pracuje. Podobně je to i s dvojicí sloupců pod Receive FlowControl, které ukazují nastavení pro příchozí PAUSE rámce. Sloupec RxPause ukazuje, kolik bylo přijato PAUSE rámců a TxPause počet vyslaných PAUSE rámců. Z výpisu vidíme, že příchozí flow control je zapnut a na rozhraní Fa0/1 bylo přijato 262 PAUSE rámců. Z výpisu pro odeslané PAUSE rámce vidíme, že switch nepodporuje generování PAUSE rámců.

Nastavení flow control na linuxu

Nastavení flow control na linuxu se dá provést pomocí příkazu ethtool, který je jako volitelný balíček dostupný pro většinu distribucí. Zjištění aktuálního nastavení flow control pro rozhraní eth0 se provede:

# ethtool -a eth0

Zapnutí se provede pomocí:

# ethtool -A eth0 rx on
# ethtool -A eth0 tx on

Více informací o tomto příkazu je k dispozici v jeho manuálových stránkách.

V mém případě (podprobněji popsáno níže) se nedaly informace o nastavení vůbec získat. Podle těchto stránek by ovladače flow control měly podporovat, ale nepřišel jsem na to, z jakého důvodu to karta nebo ovladač nepodporuje.

Utilita flow-ctrl

Linuxový program flow-ctrl dokáže generovat PAUSE rámce. Slouží hlavně k otestování, jak se jednotlivé síťové zařízení dokáží vypořádat s PAUSE rámci a jestli na ně správně reagují. Originální zdrojový kód můžete najít tady. Aby bylo možné tento program přeložit dnešní verzí gcc, musel jsem zakomentovat část definice struktury, která byla pravděpodobně časem zařazena přímo do hlavičkových souborů. Upravená verze programu je k dispozici tady.

Pro vygenerování rámce s délkou pauzy (quanta-length) 50000 (to na 100Mbps ethernetu odpovídá 256ms) stačí spustit:

./flow-ctrl -p 50000

Ukázka vygenerovaného PAUSE rámce

No.     Time        Source                Destination           Protocol Info
    161 54.569311   00:90:f5:2a:8b:82     01:80:c2:00:00:01     CTRL     MAC PAUSE: Quanta 50000

Frame 161 (60 bytes on wire, 60 bytes captured)
    Arrival Time: Jan 11, 2006 12:47:13.822194000
    Time delta from previous packet: 3.859867000 seconds
    Time since reference or first frame: 54.569311000 seconds
    Frame Number: 161
    Packet Length: 60 bytes
    Capture Length: 60 bytes
    Protocols in frame: eth:macc
Ethernet II, Src: 00:90:f5:2a:8b:82 (00:90:f5:2a:8b:82), Dst: 01:80:c2:00:00:01 (01:80:c2:00:00:01)
    Destination: 01:80:c2:00:00:01 (01:80:c2:00:00:01)
    Source: 00:90:f5:2a:8b:82 (00:90:f5:2a:8b:82)
    Type: MAC Control (0x8808)
MAC Control
    Pause: 0x0001
    Quanta: 50000

Testovaná zařízení

Otestoval jsem flow control v několika zařízeních v laboratoři a na dvou počítačích s Windows XP a Linuxem.

Switch CISCO Catalyst 2950 flow control nepodporuje. Verze software byla 12.1(22)EA4.

Switch CISCO Catalyst 3550 podporuje asymetrický flow control. Umí pouze přijímat PAUSE rámce a správně na ně reagovat. Podobně je na tom s podporou flow control také switch Catalyst 3560 (Cisco IOS Software, C3560 Software (C3560-ADVIPSERVICESK9-M), Version 12.2(25)SEB3), na kterém jsem zkoušel, jestli na vygenerovaný PAUSE rámce umí správně reagovat. Do switche jsem zapojil notebook a počítač, oba s linuxem. Počíč odpovídal na ping z notebooku a tím generoval síťový provoz ve druhém směru. Podrobněji je to vidět na obrázku níže. Z notebooku jsem pustil ping 192.168.0.1 -i 0.1, který generoval síťový provoz každých 100ms. Při generování PAUSE rámců z notebooku switch přerušil vysílání k notebooku a odezvy na ping se prodloužily.

Testovací zapojení

Zkoušel jsem také, jak na vygenerovaný PAUSE rámec zareaguje Windows XP SP1 s kartou Realtek RTL8139 a integrovaným windows ovladačem. Windows PAUSE rámce ignoroval. V nastavení sítě jsem nikde nenašel volbu pro nastavování flow control, takže nevím, jestli byl problém v kartě, ovladači nebo ve Windows.

Ani počítač s Linuxem (jádro 2.6.13, karta Realtek RTL8139, ovladač 8139too) se mi nepodařilo přesvědčit, aby na PAUSE rámce nějak reagoval. Tady to však asi bylo způsobeno tím, že flow control nepodporovala samotná karta. Po zadání příkazu pro zjištění nastavení flow control jsem dostal toto:

# ethtool -a eth0 
Pause parameters for eth0:
Cannot get device pause settings: Operation not supported

Závěr

V normě IEEE 802.3x je flow control definováno jako doporučení, takže ne všichni výrobci síťových prvků se tímto doporučením řídí. Vyjádření několika velkých výrobců k této problematice najdeme tady. CISCO dokonce říká, že pro jejich switche by to mohlo znamenat spíše problémy než výhody (některé switche mají sdílenou paměť a nemůže tak dojít k zaplnění jednotlivých vstupních bufferů). Navíc flow control neposkytuje možnost řídit tok dat mezi dvěma nesousedními zařízeními a jeden síťový prvek v trase přenosu, který nepodporuje flow control, by pak takové řízení toku znemožňoval. Takovou možnost ovšem poskytuje protokol TCP, takže se lze bez flow control na druhé vrstvě klidně obejít. Své využití by jistě našel při implementaci QoS. Myslím si, že zařízení, která by podporovala flow control není mnoho a pokud už taková zařízení někde jsou, tak už ve výchozím nastavení mají flow control vypnutý.

Zdroje

Postup jak prověřit flow control na různých zařízeních:
ftp.iol.unh.edu/pub/ethernet/test_suites/CL31_FC/flow_control_testsuite_v1.2.pdf

Informace o 802.3x Flow control:
http://en.wikipedia.org/wiki/Ethernet_flow_control
http://www.techfest.com/networking/lan/ethernet3.htm#3.2.1
http://www.ieee802.org/3

Nastavení flow control na CISCO Catalyst 2926G:
http://www.cisco.com/univercd/cc/td/doc/product/lan/c29xx/c2926/05cnfg.htm

Článek o flow control včetně vyjádření výrobců síťových zařízení k této problematice:
http://www.networkworld.com/netresources/0913flow.html
http://www.networkworld.com/netresources/0913flow2.html

Vypracoval: Dušan Jalůvka jako projekt do projektu Technologie počítačových sítí.
Email: dusan.jaluvka<zavináč>gmail.com
Web: www.jaluvka.info