This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
Sunday, 28 December 2025
HTTP ei kehittynyt. pakko muuttaa fysiikalla, latenssilla ja väärinkäytöllä.
Jokainen versio on olemassa, koska edellisellä on kovat rajoitteet. Jos ymmärrät nämä rajoitukset, ymmärrät, miksi verkko toimii niin kuin se toimii - ja miksi niin monet "parhaat käytännöt" ovat itse asiassa protokollarajoituksia, joita olemme venkoilleet jo kolmekymmentä vuotta.
Olen rakentanut verkkosovelluksia vuodesta 1997 lähtien. Olen purkanut HTTP/1.0-yhteysmyrskyjä, katsellut selainten avaavan kuusi yhteyttä isäntää kohti "ominaisuutena", kironnut HTTP/2:n TCP-pääeston mobiiliverkoissa, ja lopulta nähnyt HTTP/3:n myöntävän, mitä tiesimme koko ajan: verkko on ongelma.
Tämä ei ole protokollaopetus, vaan tarina siitä, miten päädyimme tänne.
HTTP/1.0 suunniteltiin vuonna 1996 maailmaa varten, jota ei enää ole. Ymmärtääksesi, miksi se toimi, sinun täytyy ymmärtää, mitä "verkko" tarkoitti vuonna 1996:
Tässä maailmassa pullonkaula oli kaistanleveys50KB-sivun lataaminen kesti 15 sekuntia. Kuka välitti 200 metrin ylimääräisestä kädenpuristuksesta?
Mihin HTTP/1.0 optimoitiin:
GET /index.html HTTP/1.0
Host: example.com
HTTP/1.0 200 OK
Content-Type: text/html
<html>...
Yksinkertainen, elegantti, täydellinen vuodelta 1996 ja täysin käyttökelvoton kaikkeen muuhun kuin asiakirjahakuun.
Sitten verkko muuttui nopeasti.
Vuonna 1998 sivut eivät olleet vain asiakirjoja, vaan niissä oli tyylisivuja, JavaScript-kuvia ja useita kuvia. Yksi sivu voi tarvita 20-30 erillistä resurssia.
Jokainen vaadittu pyyntö:
20-resurssilla varustettu sivu tarkoitti 20 TCP-kädenpuristusta. 200 ms:n latenssiyhteydellä (joka on yhä yleinen), 4 sekuntia vain kättelyä ennen kuin mitään sisältöä siirretään.
Perusoletus HTTP/1.0:sta:
Aika oli halpaa.
Vuonna 1996 se oli. Bandwidth oli pullonkaula. Vuonna 1999 kaistanleveys parani, mutta Latenssi ei ollut Yhtäkkiä kierroksilla oli merkitystä.
HTTP/1.0 oli suunniteltu dokumentteja varten. Netistä oli tullut sovellusalusta.
HTTP/1.1 saapui vuonna 1997, juuri kun verkko oli räjähtämässä. Dotcom-buumi oli alkamassa. Kaikki yritykset tarvitsivat nettisivut. Web-sivut olivat mutkikkaita - taulut ulkoasua varten, JavaScript vuorovaikutteisuutta varten, kuvat kaikkialla.
Painostus oli selvä: Liitäntäpyyntö oli tapposuoritus. Mutta täysin HTTP:n uudelleen suunnittelu ei ollut vaihtoehto. Liika infrastruktuuri oli jo kiinni siitä. Ratkaisun piti olla takaperin yhteensopiva.
Mikä muuttui:
Connection: keep-alive Oletuksena) – TCP-yhteyden uudelleenkäyttöCache-Control, ETag, ehdolliset pyynnöt)Mikä ei muuttunut:
GET /page.html HTTP/1.1
Host: example.com
Connection: keep-alive
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Cache-Control: max-age=3600
...
HTTP/1.1 ei itse asiassa ratkaissut suoritusongelmaa, vaan se vain liikutti sitä.
Putket epäonnistuivat. Spektrolin avulla voitiin lähettää useita pyyntöjä yhdellä yhteydellä, mutta:
Sen sijaan, että protokollaa olisi korjattu, selaimet huijasivat:
static1.example.com, static2.example.com) liittymien moninkertaistaminenMikään näistä ei toiminut suunnitellusti, vaan koko ekosysteemi korvasi HTTP/1.1:n perustavanlaatuisen rajoituksen.
HTTP/1.1 skaalautuu huijaamalla, ei korjaamalla mallia.
HTTP/1.1 toimi tarpeeksi hyvin Viisitoista vuotta, ei siksi, että se olisi hyvä, vaan siksi, että ympäristö kompensoi:
Olimme vain onnekkaita, että maailma salasi sen.
Nuo kuusi liittymää per isäntä eivät olleet ilmaisia:
Verkko nopeutui HTTP/1.1:n aikakaudella, mutta ei HTTP/1.1:n takia. Se nopeutui, koska:
Rakensimme sovellusalustaa dokumenttien hakuprotokollalle, ja protokolla oli häviämässä.
Vuoteen 2010 mennessä verkon suorituskyky oli jatkuvaa taistelua HTTP:tä itseään vastaan.
Aikakauden "parhaat käytännöt" kertovat tarinan:
Jokainen näistä on täyskäännös "HTTP/1.1:lle, joka ei pysty käsittelemään monia pyyntöjä tehokkaasti".
Rakensin monia näistä pienistä työkaluista, kuten sprite-generaattoreista, CSS-kompressorista, aloimme käyttää reagointikompressiota jne.
Selaimet eivät olleet nopeampia, koska HTTP parani. työskennellyt HTTP:n ympärillä.
Kuusi yhteyttä per isäntä ei ole ominaisuus. Se on hakata. Verkkoalueen sirpale ei ole paras käytäntö, vaan myöntää epäonnistuneensa.
Opetin vuosia kehittäjiä niputtamaan hyödykkeitä, sprite-kuvia ja inline-kriittisiä resursseja. Mikään niistä ei ollut "hyvää arkkitehtuuria". Protokollavaurioiden hallinta.
"HTTP on yksinkertainen" myytti jatkui, koska monimutkaisuus oli piilotettu:
HTTP/1.1 toimi, koska kaikki toimi ympäri se teki ylitöitä kompensoidakseen.
Jos olet koskaan nähnyt kaavion HTTP:stä, jossa ei näy latenssia, menetyksiä tai vikatiloja, se valehtelee sinulle. Protokolla on yksinkertainen. Todellisuus ei ole.
Vuonna 2010 verkko oli jälleen muuttunut. Kaksi massiivista vuoroa muutti kaiken:
1. Mobiili tapahtui. Vuonna 2007 lanseerattu iPhone. Vuonna 2012 mobiiliverkkoliikenne räjähti räjähdysmäisesti. Yhtäkkiä käyttäjät eivät olleet langallisella laajakaistayhteydellä - he olivat 3G:llä, sitten 4G:llä, vaihtelevalla latenssilla ja toistuvilla pakettitappioilla. Oletukset, jotka tekivät HTTP/1.1:stä siedettävän, olivat kaatumassa.
2. Verkkosovellukset korvasivat verkkosivut. Gmail. Google Maps. Facebook. Twitter. Nämä eivät olleet dokumentteja, joissa oli linkkejä, vaan sovelluksia, jotka tarvitsivat kymmeniä tai satoja resursseja, reaaliaikaisia päivityksiä ja pikaisia vastauksia. "Kuusi yhteyttä per isäntä" -hakkeri osoitti ikänsä.
Googlella oli valtava mittakaava, suorituskykyinsinöörejä, ja HTTP/1.1:n todistamiseen käytetty data oli pullonkaula. Vuonna 2009 he aloittivat SPIDYn - kokeellisen protokollan, josta tulisi HTTP/2.
Mikä muuttui:
┌──────────────────────────────────────────┐
│ Single TCP Connection │
├──────────────────────────────────────────┤
│ Stream 1: GET /page.html │
│ Stream 3: GET /style.css │
│ Stream 5: GET /app.js │
│ Stream 7: GET /logo.png │
│ (all interleaved, no ordering required) │
└──────────────────────────────────────────┘
Näin HTTP/1.1-putkenpidityksen olisi pitänyt olla. Virtaukset ovat itsenäisiä. Yksi hidas reaktio ei estä muita. Otsikko on tiivistetty. Protokolla vastasi lopulta sitä, miten käytämme verkkoa.
HTTP/2 oli täydellinen laajakaistaverkolleJa vuonna 2015, kun se standardoitiin, laajakaista oli kaikkialla kehittyneessä maailmassa.
Mikä parani:
HTTP/2 oli käyttäjille langallisilla yhteyksillä, joilla oli alhainen pakettitappio, todellinen parannus. Vertailuarvot näyttivät hyviltä. Mittarit paranivat. Google julisti voiton.
Mutta maailma oli jo mennyt eteenpäin. Mobiili oli nyt suurin osa verkkoliikenteestä.
Matkapuhelinverkoilla on perusominaisuus, jollaista laajakaistalla ei ole: pakettitappio on vakio.
TCP-takuut TilaustoimitusJos paketti 47 katoaa, paketit 48-100 odottavat, kunnes 47 lähetetään uudelleen - vaikka ne kuuluisivat täysin riippumattomiin HTTP/2 -virtoihin.
┌──────────────────────────────────────────┐
│ TCP Receive Buffer │
├──────────────────────────────────────────┤
│ [pkt 45][pkt 46][ ? ][pkt 48][pkt 49] │
│ ↑ │
│ Waiting for packet 47 │
│ │
│ Stream 1 data: BLOCKED │
│ Stream 3 data: BLOCKED │
│ Stream 5 data: BLOCKED (has pkt 48-49) │
│ Stream 7 data: BLOCKED │
└──────────────────────────────────────────┘
HTTP/2 ratkaisi kantapään tukoksen käyttökerroksessa, minkä jälkeen TCP palautti sen siirtokerrokseen.
Yksi kadonnut paketti tukkii kaikki purot. Puhtaalla langalla pakettihävikki on harvinaista. Matkapuhelimissa, hukassa olevilla WiFi-yhteyksillä tai ruuhkaisilla yhteyksillä pakkaushävikki on vakio. Ja koska HTTP/2 käyttää single yhteys (suunnitellusti), yksi kadonnut paketti nyt estää kaikki sen sijaan vain yksi kuudesta yhteydestä.
HTTP/2:n suorituskyky:
Ironista: HTTP/2 oli suunniteltu mobiilikäyttöön, mutta TCP:n takuut pahensivat mobiilissa sen korvaamaa protokollaa.
HTTP/2:n käyttöönotto osoitti todellisia parannuksia:
Mutta hännän latenssi kertoi toisen tarinan. mediaani P99 paheni.
Näin tämän omin silmin: asiakas otti HTTP/2:n käyttöön CDN:ssä ja katseli mobiilia P99 latenssia lisäys Kojelaudat paranivat 40 prosentilla. Tukiliput tulivat mobiilikäyttäjiltä. Käytimme viikon sen selvittämiseen, että HTTP/2:n "parannus" pahensi suurimman osan liikenteestä.
Kun HTTP/2 toimii, se toimii kauniisti. Kun paketti putoaa mobiiliyhteydelle pahimmalla hetkellä, kaikki jäätyy. Käyttäjät huomaavat, että se jäätyy enemmän kuin nopeat mediaanit.
Perusongelma:
HTTP/2 oletti TCP:n kelpaavan.
Laajakaistan osalta se oli. Mobiilien kohdalla se ei ollut. Kun HTTP/2 standardoitiin, mobiili oli jo voitolla. Olimme ajaneet niin pitkälle kuin TCP pystyi.
Vuoteen 2015 mennessä todisteet olivat selvät: TCP oli ongelma.
Google oli käyttänyt QUICia kokeellisesti vuodesta 2012 lähtien. Heillä oli tiedot mobiiliverkoista, häviöllisistä WiFi-yhteyksistä ja korkeista latenssiyhteyksistä. HTTP/2 epäonnistui TCP:n kohdalla tavoilla, joita ei voitu korjata vaihtamatta kuljetuskerrosta.
Mutta TCP:tä ei voi vain "korjata". Se on toteutettu käyttöjärjestelmän ytimessä. Se on leivottu jokaiseen internetin reitittimeen, palomuuriin ja välilaatikkoon. TCP:n muuttaminen tarkoittaa, että se odottaa vuosikymmeniä koko internetin infrastruktuurin päivittämistä.
Joten Google teki jotain uhkarohkeaa: he rakensivat UDP:n päälle uuden liikenneprotokollan.
UDP on "mykkä" suunnittelultaan - se vain lähettää paketteja ilman takuita. Mutta juuri sitä tarvitset, jos haluat toteuttaa omasi Luotettavuussemantiikkaa. QUIC toteuttaa uudelleen TCP:n takuut (luotettava, tilattu toimitus), mutta tekee sen Virtaa kohti Yhteyden sijaan.
HTTP/3 (2022) on HTTP yli QUIC. Se on tunnustus, että meidän piti mennä alle HTTP korjata HTTP.
Mikä muuttui:
┌──────────────────────────────────────────┐
│ QUIC Connection │
├──────────────────────────────────────────┤
│ Stream 1: [pkt][pkt][pkt] ← flowing │
│ Stream 3: [pkt][ ? ][pkt] ← waiting │
│ Stream 5: [pkt][pkt][pkt] ← flowing │
│ Stream 7: [pkt][pkt] ← flowing │
│ │
│ Lost packet only affects Stream 3 │
└──────────────────────────────────────────┘
Mikä pysyi samana:
HTTP/3 ei muuttanut HTTP:tä, vaan se muutti sen, miten HTTP selviää todellisuudesta.
QUIC toteuttaa TCP:n luotettavuustakuut Virtaa kohtiTämä on avainnäkemys.
TCP:n lupaus: "Jokainen tavu saapuu järjestykseen." QUICin lupaus: "Jokainen taputus tässä virrassa saapuu kuntoon."
Tämän eron vuoksi HTTP/3 ei kaadu häviöllisissä verkoissa.
Muita QUIC-ominaisuuksia, jotka korjaavat pitkäaikaisia ongelmia:
Liitännäismuutto:
Phone on WiFi → walks out of range → switches to cellular
TCP: Connection dies. Restart everything.
QUIC: Connection ID maintained. Streams continue.
Tämä on tärkeää, koska mobiilikäyttäjät jatkuvasti Vaihda verkkoja, kävele ulos talostasi, menetä WiFi, vaihda kännykkään. TCP:n myötä jokainen yhteys katkeaa. QUIC:n kanssa yhteys jatkuu.
0-RTT:n uudelleen aloittaminen:
First connection: Full handshake (1-RTT)
Returning user: Send data immediately (0-RTT)
Salaus kaikkialla:
TCP + TLS: Handshake, then encrypted tunnel
QUIC: Encryption is the handshake (TLS 1.3 integrated)
HTTP/3 on suunniteltu maailmaan, jossa oikeasti elämme:
Protokolla vastaa vihdoin verkkotodellisuutta. 30 vuotta HTTP/1.0:n olettaman luotettavan langallisen yhteyden jälkeen HTTP/3 myöntää, että luotettavuus on poikkeus, ei sääntö.
HTTP/3 ei ole ilmainen:
Mutta mobiilien ensimmäisille sovelluksille, epäluotettaville verkoille ja latenssiherkille palveluille HTTP/3 on ensimmäinen versio, joka vastaa sitä, miten verkostot todellisuudessa käyttäytyvät.
Jokainen HTTP-versio vaihtui, koska ympäristö muuttui nopeammin kuin protokolla.
Versio: Aikakausi Ympäristö Oletus: Miksi se rikkoi? |---------|-----|-------------|------------|--------------| HTTP/1.0 1996 Dialup, dokumentit Bandwidth on pullonkaula. Sivuista tuli sovelluksia, latenssilla oli merkitystä. HTTP/1.1 Laajakaista, verkkosovellukset Low latency kätkee tehottomuuden Mobile saapui pakettitappiolla HTTP/2 2015-2022 Laajakaistahuippu, liikkuva nouseva TCP on tarpeeksi luotettava ja mobiili tuli hallitsevaksi, TCP epäonnistui. HTTP/3 HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022 + HTTP 2022
Malli on selkeä:
Protokollaa työnnetään yhä lähemmäs verkkoa. Jokainen riittävältä vaikuttanut abstraktio kuoriutui takaisin, kun ympäristö sitä vaati.
Muita huomioita:
30 vuoden protokollakehityksestä huolimatta:
Pyynnöt epäonnistuvat edelleen. Verkkojako, palvelimet kaatuvat, aikakatkaisut tapahtuvat. Koodisi tarvitsee vielä uutta logiikkaa.
Verkostot valehtelevat yhä. 200 OK ei tarkoita, että vastaus olisi oikea. Yhteys suljettuna ei tarkoita, etteikö pyyntö olisi onnistunut. Aikalisät eivät tarkoita, etteikö palvelin olisi käsitellyt pyyntöäsi.
Käpylät tarjoavat yhä tunkkaista dataa.
Cache-Control Se on pyyntö, ei käsky. Proxies tekee mitä haluaa. CDN:n mitätöinti on parhaimmillaankin.
Asiakkaat yrittävät yhä huonosti. Käyttäjä napsauttaa painiketta, mitään ei tapahdu, napsahtaa uudelleen. Nyt sinulla on kaksi pyyntöä. Impotenssilla on merkitystä.
Kehittäjät ymmärtävät yhä väärin idempotenssin. PUT:n pitäisi olla idempotentti. POST on villi länsi. Useimmat API:t ymmärtävät tämän väärin.
// This is still your problem, regardless of HTTP version
public async Task<Result> CreateOrderAsync(Order order)
{
// What happens if this times out?
// Did the server receive it?
// Did it process it?
// Will the client retry?
// Will you create duplicate orders?
// HTTP/3 doesn't save you here.
// Idempotency keys do.
}
Jos et ymmärrä näitä, HTTP/3 ei pelasta sinua.
Kun olet rakentanut web-sovelluksia kaikkien näiden protokolliversioiden päälle, tämä jäi jumiin:
1. Protokolla ei ole luotettava kerros.
HTTP antaa sinulle pyyntö- ja vastausselmantiikkaa. Se ei takaa toimitusta, korrektiutta tai tasan kertakäsittelyä. Se on sinun tehtäväsi.
2. Latenssi on vihollinen, ei kaistanleveys.
Suurin osa suoritusongelmista on pyöreitä, ei läpivientiin sidottuja. Vaatimusten vähentäminen on tärkeämpää kuin hyötykuorman keventäminen.
3. Jokaisella "parhaalla käytännöllä" on viimeinen käyttöpäivä.
Verkkoalueen siristys oli olennaista HTTP/1.1:lle. Se on haitallista HTTP/2:lle. CSS:n inlinointi oli fiksua. Nyt meillä on palvelimen työntö (joka myös epäonnistui) ja varhaiset vihjeet. Taktiikan muutos. Maali (vähennä viivettä) pysyy samana.
4. Mittaus todellisissa verkoissa.
Käyttäjäsi ovat mobiiliverkoissa, hotellin WiFissä ja kyllästetyissä kahviloissa. Testaa siellä.
5. Tylsyillä osilla on eniten merkitystä.
Aikakatkaisut, retries, virtapiirien katkaisut, häiriönsieto. Liitännäisten yhdistäminen. Nämä häikäisemättömät yksityiskohdat ratkaisevat, toimiiko järjestelmäsi kuormitettuna.
HTTP ei nopeutunut, koska siitä tuli älykkäämpi. verkko oli ongelma.
Jokainen versio oli oikea aikansa:
Virheessä luultiin, että jokin niistä oli pysyviä ratkaisuja, jotka kaikki reagoivat erityisiin ympäristöpaineisiin. Ympäristön muuttuessa protokollaa oli noudatettava.
HTTP-versiot eivät ole kuluttajamielessä päivityksiä, vaan ne on optimoitu erilaisiin vikajakeluihin.
Ja silti, kaiken tämän jälkeen, perusasiat ovat edelleen:
Protokolla kehittyi, mutta ongelmat eivät hävinneet.
Rakenna järjestelmiä, jotka selviävät epäonnistumisista. Testaa todellisia verkkoja. Ymmärrä, että jokainen HTTP-versio on aikakautensa muovaama vaihtokauppa, ei päivitys, joka vanhentuu aiemmasta.
Se on kolmekymmentä vuotta HTTP:tä. Se on verkko, jonka rakensimme. Toisella vuosikymmenellä HTTP/3:n oletukset näyttävät todennäköisesti samalta kuin HTTP/1.0:n oletukset nyt.
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.