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.
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) |
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.
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 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.
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
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
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.
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
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ý.
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