Webové aplikace mají jiné potřeby než jen prosté předávání informací ze serveru do prohlížeče v doprovodu pár obrázků a stylů. Obsahují mnoho obrázků, mnoho skriptů a komunikace mezi klientem a serverem je velmi čilá po každém kliknutí. Google tento koncept vývoje aplikací propaguje už dlouho, ale protokol HTTP, kterým se dorozumívají prohlížeče se servery, k podobné komunikaci není moc nakloněn. Proto není divu, že zrovna Google přišel s protokolem SPDY, který doplňuje HTTP o nové vlastnosti.
Google při návrhu vycházel především z toho, že každé vytvořené spojení mezi serverem a prohlížečem je „drahé“ a přitom není důvod, aby se pro každý zdroj (obrázek, skript, stránka) tvořilo znovu. Zároveň se snaží využít každé možnosti, jaké se nabízí. SPDY tedy přidává následující vlastnosti:
- jedno spojení pro všechny
- paralelní přenos
- prioritizace
- komprese
- šifrování
- server push
- server hints
Komprese i šifrování podporují webové prohlížeče i známé servery už dlouho. Zato využití jednoho HTTP spojení pro více přenosů je trochu kostrbaté a ne všechny prohlížeče a ne všechny servery si s ním dokáží poradit. Problémy se týkají hlavně případů, kde je podpora chybná nebo jsou použity proxy servery.
SPDY využívá vždy jen jedno spojení a přidává do něj možnost paralelního odesílání souborů. Navíc si prohlížeč může určit prioritu jednotlivých vláken, tedy jaký typ obsahu dostane jako první. Přidá se šifrování, komprese a pod značkou SPDY tu máme na první pohled úplně nový způsob přenosu dat na webu. Značka je zde důležitá, protože sjednocuje specifikaci, kterou bude jednoduší implementovat a provozovat. Jednotlivé techniky nejsou roztříštěny ani na straně standardu, ani na straně implementace.
Díky SPDY se velké zdroje (soubory) rozdělí na malé balíčky, které jsou postupně podle požadovaných priorit rozesílány klientovi. V tomto kontextu je myšlen stav, kdy například skript nedokáže posílat klientovi data dostatečně rychle, a tak se uvolní kapacita pro ostatní data. Zatímco se čeká, až se skript pohne dál, posílají se třeba styly nebo obrázky. Díky prioritizaci se pak zajistí, aby velké obrázky a videa neměl prohlížeč zbytečně předtím, než se načte samotné rozhraní stránky. Nastavení priorit určuje prohlížeč, takže ne vždy musí být výsledek ideální. Plán je ale takový, že by uživatel měl nejprve vidět rozhraní aplikace, začít třeba číst e-mail a mezi tím by se stahovaly objemnější, ale méně důležité přílohy.
Paralelní přenos je „zbytečný“ v případě, kdy existuje na každý zdroj jiné TCP spojení, takže SPDY tím řeší problém, který vznikl spojením do jednoho komunikačního kanálu. Na druhou stranu by měla být komunikace efektivnější a díky prioritizaci by se měly webové stránky a aplikace stahovat plynuleji.
SPDY je rozšíření, které stojí mezi TCP a HTTP. Jeho standardní součástí je i komprese celého datového toku. Na rozdíl od volitelné komprese známé z HTTP se komprimuje také samotná hlavička. V HTTP se komprimují jen data.
Dalšími technikami na zrychlení komunikace je server push a hints. V prvním případě se může server rozhodnout odeslat soubor i přesto, že o něj klient ještě nepožádal. Rozhodne se tak na základě svých algoritmů, které mohou vycházet z toho, co se posílalo v podobných požadavcích předtím. Prohlížeč tak může automaticky dostat třeba obrázky, i když ještě nerozparsoval HTML stránku nezjistil, že je bude potřebovat. Ve správnou chvíli je už bude mít v paměti.
Někdy ale může dojít ke zbytečnému odeslání takového obsahu, protože klient už ho může mít třeba cache. Ve většině případů ale bude takový přenos velmi efektivní. Server hints fungují podobně. Neodesílá se obsah ale jen seznam URL, které by klient mohl potřebovat. Ten se pak podívá do lokální cache a rozhodne se, zda už daný zdroj má nebo o něj požádá.
SPDY a Apache
Kromě některých služeb Google podporuje protokol SPDY také například Twitter. Ten, stejně jako Google, provozuje také webovou aplikaci a potřebuje tahat hodně zdrojů najednou. Malým webům, které si nemohou dovolit implementovat SPDY do svých služeb, bylo SPDY doposud uzavřeno.
Existovaly nějaké implementace, například ve webovém serveru Jetty, node.js nebo pythoní SPDY server, ale nešlo o nic, co by se dalo nasadit na nějaký mass hosting nebo na většinu populárních skriptovacích jazyků. Nyní Google uvolnil balíčky mod_spdy pro Apache, což otevře pohodlnou cestu k novému protokolu alespoň pro některé další služby.
Než začnu, musím napsat, že mod_spdy pro Apache je teprve beta a na produkčních strojích byste jej tedy měli instalovat s rozmyslem a opatrně.
K dispozici jsou deb a rpm balíčky a samozřejmě zdrojový kód. Vše se dá stáhnout z developers.google.com. Aby vše správně fungovalo, je potřeba Apache verze 2.2.4 a vyšší a v něm aktivovaný mod_ssl. Instalace je na RPM a DEB distribucích jednoduchá, stáhne se balíček a nainstaluje. V případě Debianu nebo Ubuntu je to:
# wget https://dl-ssl.google.com/dl/linux/direct/mod-spdy-beta_current_amd64.deb
# dpkg -i mod-spdy-beta_current_amd64.deb
U RPM distribucí to pak bude:
# wget https://dl-ssl.google.com/dl/linux/direct/mod-spdy-beta_current_x86_64.rpm
# rpm -U mod-spdy-beta_current_x86_64.rpm
Po instalaci je potřeba funkční ssl VirtualHost v Apachi. Do souboru /etc/apache2/site-available/00_ssl.conf
vložíme třeba toto:
NameVirtualHost *:443
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
SSLCertificateFile /etc/ssl/muj_certifikat.crt
SSLCertificateKeyFile /etc/ssl/muj_klic.key
</VirtualHost>
Po restartu Apache by jste k němu měli připojit přes SPDY z vašeho webového prohlížeče. Nejjednodušší je použít Google Chrome. Na URL chrome://net-internals/#spdy se pak dozvíte, zda je SPDY použito nebo ne. Pokud ne, nemusí jít ještě o chyby na serveru, ale někteří uživatelé mají SPDY ve svém Chrome vypnuté. V takovém případě pomůže spustit Chrome s parametrem --use-spdy=npn
.
Shrnutí
SPDY v současné době z prohlížečů podporuje pouze Chrome. Mozilla Firefox se k němu přidá ve verzí 13. Podpora v něm je od verze 11, ale ve výchozím stavu je vypnutá. Podle měření Google přidá SPDY na rychlosti stažení stránky přibližně 30 až 60 %, což není rozhodně zanedbatelné. Měření je ovšem hodně závislé na tom, jakou konkrétní stránku server posílá.
Obecně se dá říct, že SPDY pomůže tam, kde se toho načítá hodně nebo se z nějakého důvodu v některých fázích stahování dlouho čeká. Příjemné také je, že pokud váš server SPDY podporuje, ale klient nikoli, použije se staré dobré HTTPS. Zůstává otázkou, zda se někdy dočkáme standardizace SPDY. Možná k tomu nikdy nedojde, protože jeho vlastnosti jsou přebírány do připravované specifikace HTTP 2.0.