Podle mne vůbec nejde o rychlost při síťovém přenosu, ale o rychlost při zpracování na straně serveru. Představte si nějaký loadbalancer, webhosting se spoustou webů, CDN. Generování nějaké stránky z DB, to prostě nějakou dobu bude trvat a přenosový protokol na tom nic nezmění. Ale kolem té stránky je spousta bižuterie, obrázky, styly, skripty – na jednu stránku jsou jich desítky. A tam se server potřebuje rychle rozhodnout, kam požadavek předat dál, rychle poznat, že může odpovědět 304 atd.
Všimněte si, co se v naposledy na HTTP rozvíjelo – Connection keep-alive, chunked encoding, SPDY. První a třetí je optimalizace právě pro rychlejší získání bižuterie, chunked encoding umožňuje průběžné odesílání ze serveru, tedy opět snížení zátěže serveru. Binární protokol HTTP jenom v tomhle trendu pokračuje.
Taky mi vadí, že ladění už nebude tak pohodlné jako s textovým protokolem. Ale chápu, že je dnes požadováno co nejrychlejší odbavení na serveru, a textový protokol v tom má limity. Vždyť se kvůli zrychlení vymýšlejí i náhrady protokolu TCP/IP, aby se obešel úvodní handshake…
Jenže co mi binární protokol v tomto směru přinese navíc ? Nic...
Serializovat požadavky na bižuterii - OK, konec konců se to děje už dnes v podobě různých js a css kompresorů, nebo obrázkových map. Takže v konečný fázi můžu mít stránku o jednom středně velkém javascriptu, jednom podobně velkém stylu, obrázku a nakonec html. Díky kompresi i ten relativně velký textový soubor bude zmáčknutý do jednotek kb.
Mimochodem, generování stránek se řeší různými cache na všech frontách a to včetně bižu, a v konečném stádiu prostě nebude stíhat IO, pokud toho bude tak moc.
To co chápu jako přínos je nenavazování 150ti malých spojení, které ve skutečnosti stáhnou méně dat než nosný protokol. K tomu ale není potřeba binárního protokolu.
Binární protokol přinese to, že specializovaný server (loadbalancer, CDN) zpracuje požadavek mnohem rychleji. Nebude muset zpracovávat hlavičky znak po znaku, ale nezajímavé hlavičky přeskáče a vytáhne si těch pár, které ho zajímají – Host, E-tag, If-*, Accept-*.
Dál bude možné jedním TCP/IP spojením možné přenášet několik požadavků najednou (ne po sobě, jak je to dnes) – to samo o sobě by čitelnost pro člověka výrazně zhoršilo.
Nakešované soubory má server ideálně v RAM a ten kus paměti jednoduše zkopíruje do paketu – na tom už se toho moc zrychlit nedá. Naopak zpracování hlaviček, kdy dnes musíte je od začátku znak po znaku a čekat, zda se neobjeví zajímavá hlavička, se zrychlit dá.
No jasne. Proste jsou lidi (nebo spis firmy), kterym je decentralizovana a otevrena povaha internetu od zacatku nepochopitelna a/nebo trnem v oku. Uz aby se z toho konecne podarilo udelat centralni distribuci manipulace (chci rict obycejny prostredek masove komunikace). Zda se, ze po W3C (a lobby pro DRM) je i IETF ponekud "neverne" technologii a pod tlakem "zlobru".
To jsem udělal samozřejmě před napsání předchozího komentáře. Zjistil jsem, že internet je postavený na binárním protokolu IP a dvojici TCP/IP a UDP - vše binární protokoly. Pro koncové uživatele je pak klíčový ještě protokol DNS - také binární. Takže podle vaší teorie je internet centralizovaný a uzavřený od samého počátku.
Ve skutečnosti ale decentralizace ani otevřenost nijak nesouvisí s tím, zda je protokol binární nebo textový. V případě protokolů souvisí jen s tím, zda je ten protokol standardizovaný a zda se ta standardizovaná verze reálně používá. Z toho důvodu je HTTP 2.0 krokem k větší otevřenosti. Dnes má Google svůj proprietární protokol SPDY a má sílu prosazovat jej. HTTP 2.0 má ale SPDY nahradit, a bude to protokol standardizovaný konsorciem, takže ho nemůže Google jen tak vzít a změnit (to v případě SPDY může, může ho i uzavřít).
Že by tedy d.c. jenom zaměnil příčinu a následek? Jinak ani ve vašem případě není „centralizovaný“ to správné slovo. Webový e-mail nebo vyhledávač jsou pořád decentralizované aplikace. Jenom shodou okolností pár hráčů udělalo ty aplikace tak dobré, že získali významný podíl na trhu. Pro ty aplikace se tedy nový protokol hodí ne proto, že by byly centralizované, ale proto, že obsluhují velké množství uživatelů současně.
Problém ale je, že toto v reálu tak velký problém není. Ano je snazší skočit na konkrétní místo v datech, než iterovat znaky a hledat ty správné hlavičky které mě zajímají. Ale protože tu máme IPv6, které rychlost trochu komplikuje, protože síla strojů pořád celkem rychle roste, tak změna na binární protokol je ve stínu tisíce dalších aspektů naprostou výkonostní banalitou.
Nehledě na to že load-balancing na úrovni http proxy serverů je první krok k řešení zátěže, ale pak existují ještě minimálně 3 další řešení, o úroveň jinde, a tudíž je jim nějaké HTTP úplně volné.
Proto jestli binární protokol přinese nějaké zrychlení, tak jen na úrovní http proxyn, které zpracovávají http hlavičky. A to ještě zrychlení v konečném stavu krajně pochybné.
Serializace / paralelizace není na binární podobě protokolu nijak závislá.
Embeded zařízení, které tu někdo zmínil jsou úplně mimo, protože ty musí zvládat ipv6, variabilně dlouhé dns a hromadu jiných věcí. Takže parsovat jednoduché textové hlavičky, které jsou napsány tak, aby se snadno parsovali, je záležitost těch nejzákladnějších funkcí libovolného programovacího jazyka.
Já tedy nevím o jiném problému, který by se dnes hromadně řešil napříč webovými servery (a nejviditelněji jej řeší Google). Nepodezíral bych je, že to dělají jen z pouhého rozmaru.
CDN server dokáže hlavičku 304 nebo i data z diskové cache odeslat na „pár“ taktů procesoru. Jenže před tím musí z hlaviček zjistit, co a zda má vůbec posílat – a je hloupé, když tahle operace je o několik řádu náročnější.
Paralelizace není na binárním protokolu závislá, ale je to jedna ze změn v HTTP 2.0, která sama o sobě přenášená data pro člověka velmi znečitelní. Holt asi čitelnost pro člověka není tak zásadní přínos – ostatně IP, TCP/IP, DNS nebo HTTPS jsou taky binární a pro člověka nečitelné protokoly.
Textové HTTP hlavičky nejsou napsané tak, aby se snadno parsovaly – vždyť i když chcete jenom oddělit jednotlivé hlavičky od sebe, musíte jet znak po znaku a hledat první CRLF, který není escapovaný uvnitř řetězce v uvozovkách a není následovaný bílým znakem.
Google dělá a zkouší různé věci. To že něco začne dělat google ještě neznamená že je to správná cesta, nebo cesta která se ujme.
Jenže před zpracováním http hlavičky je vrchol dané operace. Z obou stran se totiž musí zpracovat tcp/ip/ethernet a dalších jiných milion přerušení / signálů v rámci přepínání procesů / vláken, logování, různých tcp/ip pravidel, inicializací atd... Proto prostě nevěřím že to zrychlení bude tak super.
Chápu binární protokoly, v mnoha případech mají svůj zřejmý a jasný význam. Tím spíš, když se přenáší binární data. Ale u http 2.0 mě přijde, že si řekli, je to jeden z mála textových protokolů, uděláme z něj binární.
Ta paralelizace není zas až takový problém. Ano nepatřím k těm, co vidí problém v použití tcpdumpu a jiných nadstaveb, ale maily které chodí textově taky mohou obsahovat Xkrát vnořené přílohy a dá se v tom vyznat.
S těmi textovými hlavičky to snad ani nemyslíte važně? V čem je problém iterovat znaky až narazím na ':' a následně na CRLF ? Stejně tak porovnávání celých stringů je teoreticky náročnější proti číslu přesně tolikrát, kolik porovnáváte znaků.
Ano pokud bych psal nějaký http balancer pro AVR, asi by bylo fajn ušetřit těch pár taktů. Ale i tak bych musel řešit tolik věcí okolo, že textové hlavičky jsou jen zanedbatelnou prkotinou. Ta režie okolo, je prostě výrazně větší.
Google nebyl argument pro to, že je to správné řešení, ale pro to, že jde o reálný problém.
Zpracování příchozího paketu s minimem přerušení, kopírování a přepínání kontextů už je vyřešené. Ethernetové a TCP/IP hlavičky zpracuje už síťová karta, data umístí do hlavní paměti a jádro jen tuhle část paměti zpřístupní aplikaci. Pokud vím, v současné době se např. do linuxového jádra implementuje to, aby se pod zátěží nepoužívala pro čtení ze sítě přerušení. Textové hlavičky jsou tedy v současné době jediná věc, kterou nejde tímhle způsobem optimalizovat.
Problém s iterováním, dokud nenarazíte na CRLF, je v tom, že je to špatně :-) Tohle celé je jedna hlavička, ukončená až tím posledním CRLF:
X-Header: "ab\[CR]\[LF]cd"[CR][LF][SP]ef[CR][LF]
Na té režii okolo se asi neshodneme. Když tohle autoři webserverů optimalizují, já jim věřím, že vědí, proč to dělají.
Pravidla firewallu nahraje systém přímo do síťovky. A síťovka ani nepřijme paket pro neregistrovanej tpc port. Aplikace pak jen dostane naservírovaný data a po pár taktech je rovnou zpracuje. Přijde mi to moc super na to, aby to byla pravda.
A co se té víceřádkové hlavičky týče, to je pořád velmi jednoduchá logika.
Ale alespoň na něčem se shodneme. Na tom že se s tou režií neshodneme :)
Tak jako tak, standard nestandard, dokud ho nebudou mít masivně implementované obě strany (client i server), tak tu můžeme diskutovat donekonečna. Nehledě na to, že pořád musí existovat z5ná kompatibilita, alespoň do té doby, dokud to bude ekonomicky zajímavé.
Na takovémhle stroji nemají co dělat žádná pravidla firewallu. Mapování port -> aplikace je jednoduché.
Ta víceřádková a escapovaná hlavička má jednoduchou logiku, ale pořád musíte u každého znaku zjišťovat, zda to není jeden ze tří důležitých. Lépe řešeným protokolem se dostanete třeba na setinu nutných operací.
Se zpětnou kompatibilitou se určitě počítá. Podle mne to bude jako dnes s SPDY – klient se serverem se dohodnou, zda to podporují, a pokud ano, použijí novější protokol. No a pokud si budou uživatelé Firefoxu a Internet Exploreru stěžovat, jak to že se Google v Chrome načítá rychleji, naimplementují to i autoři ostatních prohlížečů. Podstatné je, že je to vytvářeno jako otevřený standard, že to nebude proprietární protokol Googlu, který by ostatní museli hackovat.
Na binarni protokoly je tu wireshark. Tak jako se prohlizec postupne meni v tenkeho aplikacniho klienta, tak se i HTTP protokol meni v aplikacni protokol.
HTTP je vlatne vyjimka. Vetsina IP protokolu je binarnich. Viz http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One
VoIP binární protokol H.323, který byl perfektně definován pomocí jazyka ASN.1, umřel na to, že byl binární a nikomu se nechtělo studovat ty datové struktury.
Zatímco konkurenčnímu SIP, který vychází z HTTP, pšenka těžce komerčně kvete, navzdory tomu, že právě v textových parserech implementací byly (jsou) bezpečnostně kritické chyby.
Tak se nechme překvapit, jestli se tím web stane bezpečnějším místem. A jestli budou ta binární data dostatečně jednoznačně a kvalitně popsána tak, aby je parsery dokázaly sanitizovat. A jestli to celé časem neumře na znechucení adminů či co...
Binární protokol určitě přinese zrychlení na "velkých" serverech a load balancerech, ale další oblastí kde binár pomůže jsou embeded zařízení. Pársování textového HTTP když nemáte k dispozici skoro ani libc není moc velká zábava... Dnes se to může zdát jako okrajová oblast, ale s nástupem Internet Of Things, M2M a pod. to znamená velké množství zařízení a aplikací.
Pokud se vas server neumi rychle rozhodnout, tak to rozhodne neni tim, ze hlavicky nemate binarni, ale tim co si pod pojmem server predstavujete. Pokud to delate v skriptovacim jazyce, nebo v jave, ktere bezi ve svem vm, a jeste to cele provozujete ve virtualu, tak se nedivte ze Vam to nestiha.
Kdyz si vezmu pomerne stare zelezo, 4 jadra po 3GHz, na 1G siti... to mame 100MB/s hlavicek a procesor zvladne zpracovat 4x 3G = 12GB/s. To mame 120 pohledu na kazde pismenko hlavicky. A nepocitam zde prinos 32/64b architektury, nebo berlicky skrze SSE.
Proste jste linej, nebo neumite programovat a hledate problem tam kde neni. Lidi by meli prestat pouzivat FB a jine nesmysly a premyslet zas vlastni hlavou, pak by mozna na neco i prisli. Pred 10-20-30 lety byl hardware vyuzit na 100%, ale dnes? Dnes mame prevazne neschopne lidi kteri si rikaji vyvojari.
Loadbalancery nejsou dělané ve skriptovacím jazyce a spuštěné ve virtuálním počítači. Je to specializovaný hardware, který má v sobě protokoly více či méně zadrátované.
Váš pohled je sice hezký, ale řešíte web na úrovni nějakého bložínku z dovolené. Já jsem psal o nasazení na trochu jiné úrovni, kdy se řeší, aby se obsah paketu v paměti zbytečně nekopíroval, aby se minimalizovalo přepínání mezi uživatelským prostorem a jádrem, aby se zpracování drželo na jednom jádru a využila se tak data načtená v cache nebo aby byla data v paměti uspořádaná tak, aby v cache bylo maximum užitečných dat. Mimochodem, takovéhle věci jsou napsané i v Javě a mohou běžet ve virtuálu, protože se tím žádný výkon neztratí. On je to totiž nakonec stejně optimalizovaný nativní kód běžící na procesoru, a je jedno, že ten kód vytvořila JVM a že někde okolo se vedle jádra plácá také hypervizor. Ono taky to, čemu dnes říkáme procesor, by před pár lety bylo nazýváno virtuální počítač nebo emulátor -- dnešní procesory už nevykonávají jednu instrukci za druhou tak, jak přicházejí, ale převádějí instrukce třeba x86 nebo amd64 do interní instrukční sady procesoru, optimalizují kód, odhadují větvení a spekulativně provádějí instrukce napřed... Tenhle hardwarový "virtuální stroj" (moderní procesor) opravdu neslouží ke zpomalení programů, právě naopak.
>Proste jste linej, nebo neumite programovat a hledate problem tam kde neni. Lidi by meli prestat pouzivat FB a jine nesmysly a premyslet zas vlastni hlavou, pak by mozna na neco i prisli. Pred 10-20-30 lety byl hardware vyuzit na 100%, ale dnes? Dnes mame prevazne neschopne lidi kteri si rikaji vyvojari.
Bohuzel Vam musim dat za pravdu. Je to des velebnosti.