F5 attack
"F5 attack" se nazývá situace, kdy uživatel vyžaduje po HTTP serveru nějakou stránku, ona dlouho nepřichází a on nedočkavě mačká F5 - Reload stránky. U správně napsaných web aplikací toto chování obvykle nezpůsobuje větší problémy, protože obecně platí, že aplikace má dostatečně rychlou odezvu, pokud reaguje do 1 sekundy.
U hodně zatížených webů či špatně napsaných vzniká taková malá sněhová koule. Uživatel mačká F5 - Reload, zvyšuje zatížení serveru, to prodlužuje dobu odezvy atd, atd. Taková situace končí typicky hláškou "Server Too Busy".
Dnes se Petr Lazecký ve
VSNET-L konferenci
zmínil o tom, že IIS6 (Windows 2003) obsahuje obranu proti takové situaci (nikoliv 100%, ale to nebude nikdy). Požadal jsem ho o podrobnější
popis, který si dovoluji napsat i sem.
Pokud uzivatel stiskne F5 tak tim z pohledu IIS serveru "ukonci" predchozi request. Vsechny requesty ktere dorazily na IIS jsou umisteny ve vstupni fronte FIFO fronte. V pripade ze uzivatel stiskne F5, tak je predchozi request disconnected, ale presto je stale v teto FIFO fronte. Takze pokud je uzivatel nedockavy a stale macka F5, tak je vstupni FIFO fronta plna disconnected ("mrtvych") pozadavku. IIS 5.0 neni schopen tuto situaci rozpoznat a prochazi tuto frontu jenom proto aby zpracoval "mrtvy" pozadavek. Pokud uzivatel macka klavesu F5 dostatecne rychle, tak dojde k zahlceni teto FIFO fronty a server vrati neco jako "too busy". Tolik tedy F5 attack.
Jelikoz se jedna o FIFO frontu, tak jedina moznost jak odstranit "mrtve" pozadavky je projit tuto frontu od pocatku (head). Interni implementace nedovoluje detekovat (a odstranit) mrtve pozadavky uprostred fronty. Reseni proti F5 je toto:
IIS 6.0 obsluhuje dalsi, pomocnou frontu pozadavku, ktera obsahuje v podstate pouze ukazatele do hlavni FIFO fronty. Dale IIS 6.0 vytvari obsluzny thread, ktery udrzuje tuto pomocnou frontu. Jakmile se IIS pokusi vyzvednout pozadavek z FIFO fronty pro zpracovani, tak nejdrive skontroluje, jestli pomocna fronta obsahuje odkaz na teto pozadavek. Pokud ano, pak je pozadavek zpracovan. Pokud ne, pozadavek je zahozen. Cela logika detekce "mrtvych" pozadavku je tedy umistena do pomocneho vlakna obsluhujici pomocnou frontu.
Pomocne vlakno obsahuje algoritmus ktery detekuje "mrtve" pozadavky podle zateze serveru.
V pripade ze vstupni FIFO fronta je zaplnena z mene nez 10 procent, pak obsluzne vlakno testuje pouze pozadavky ktere jsou v FIFO fronte dele nez dany casovy interval (2 * connection time).
V pripade ze je vstupni FIFO fronta zaplnena z 90 procent, tak pomocne vlakno netestuje vsechny pozavaky ve fronte, ale pouze poslednich 10 procent pozadavku ve FIFO fronte. Jestlize vice jak 75 procent techto poslednich 10 procent pozadavku je disconnected, tak pomocne vlakno otestuje dalsich 10 procent, a tak dale.
Algoritmus se lisi podle toho jestli se jedna o in-proc nebo out-of -proc web aplikaci, ale princip je stejny. Rozdil je pouze v procentnich hodnotach a v casovych intervalech.
Petr Lazecky,
Microsoft
Upozornění na nové komentáře
Pokud chčeš dostávat upozornění emailem na změny u toho příspěvku,tak se zaregistruj zde.zde
Odebírat komentáře k tomuto příspěvku pomocí