HTTP
Tähän artikkeliin tai osioon ei ole merkitty lähteitä, joten tiedot kannattaa tarkistaa muista tietolähteistä. Voit auttaa Wikipediaa lisäämällä artikkeliin tarkistettavissa olevia lähteitä ja merkitsemällä ne ohjeen mukaan. |
TCP/IP-pino | |
---|---|
sovelluskerros |
BGP · DHCP · DNS · ESMTP · FTP · HTTP · IMAP · IRC · LDAP · MGCP · NNTP · NTP · POP3 · RPC · RTP · RTSP · SIP · SMTP · SNMP · SOCKS · SSH · Telnet · TLS/SSL · XMPP · (..lisää..) |
kuljetuskerros |
TCP · UDP · QUIC · DCCP · SCTP · RSVP · RIP · ECN |
verkkokerros |
IP (IPv4 ja IPv6) · ICMP (ICMPv6) · IGMP · IPsec |
siirtoyhteyskerros | ARP · IS-IS · NDP · OSPF · L2TP · PPP |
fyysinen kerros |
HTTP (lyhenne sanoista Hypertext Transfer Protocol eli hypertekstin siirtoprotokolla) on protokolla, jota selaimet ja WWW-palvelimet käyttävät tiedonsiirtoon.[1] Protokolla perustuu siihen, että asiakasohjelma (selain, hakurobotti tms.) avaa TCP-yhteyden palvelimelle ja lähettää pyynnön. Palvelin vastaa lähettämällä sopivan vastauksen, tavallisimmin HTML-sivun tai binääridataa kuten kuvia, ohjelmia tai ääntä.
Historia
Ensimmäinen HTTP:n dokumentoitu versio julkaistiin vuonna 1991 versionumerolla 0.9 joka tuki pelkästään GET-pyyntöä.[2] Versio 1.0 julkaistiin 1996, jonka parannuksiin kuuluu tuki meta-tiedon haulle sekä paranneltuja tietoturvaominaisuuksia.[3] 1997 julkaistiin HTTP 1.1, joka sai heti seuraavana vuonna päivityksen samalla versionumerolla.[4] Internet Engineering Task Forcen (IETF) HTTP-työryhmä julkaisi HTTP/2:n (työnimellä HTTP 2.0) vuoden 2015 alussa (RFC 7540).[5]
HTTP/3 käyttää QUIC-protokollaa TCP:n sijaan.[6][7]
Sivun hakeminen
Selain lähettää palvelimelle GET-pyynnön, johon palvelin vastaa.
Minimaalinen GET-pyyntö:
GET / HTTP/1.1 Host: www.example.com
Esimerkki pyytää Host
-kentässä kerrotulta palvelimelta juuressa (/
) olevan sisällön.
Esimerkki pyynnöstä (tältä sivulta):
GET /wiki/HTTP HTTP/1.1 Host: fi.wikipedia.org User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fi-FI; rv:1.6) Gecko/20040206 Firefox/0.8 Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1 Accept-Language: fi,en;q=0.7,en-us;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Proxy-Connection: keep-alive Referer: http://fi.wikipedia.org/w/wiki.phtml?title=HTTP Cache-Control: max-age=0
Kentällä Referer selain kertoo sivulle, minkä sivun kautta kyseiselle sivulle on päädytty. Esimerkiksi palvelimelle kerrotaan, millä hakukoneen haulla sivulle on päädytty ellei sitä erikseen ole selaimen asetuksissa kielletty. Selain kertoo myös palvelimelle nimensä ja versionsa. Muut tiedot ovat lähinnä teknisiä ja kertovat minkä muotoisia tiedostoja selain osaa käsitellä ja millä kielellä käyttäjä mieluiten haluaisi sivua lukea.
Vanhempi HTTP 1.0 -protokolla vaati vain itse pyynnön, mutta HTTP 1.1 -protokollassa on määritettävä myös Host-otsake, joka kertoo palvelimen, johon selain uskoo ottavansa yhteyttä. Täten oikeasti saman IP-osoitteen takaa voikin löytyä useita www-sivuja, jotka palvelin lähettää aina kulloisenkin annetun host-otsakkeen perusteella. Tällaisia palvelimia kutsutaan WWW-näennäispalvelimiksi.
Vastaus
HTTP/1.1 200 OK Date: Tue, 06 Jul 2004 17:59:22 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Cache-Control: private, must-revalidate Via: 1.0 cthulhu Server: Apache/1.3.29 (Unix) PHP/4.3.4 X-Powered-By: PHP/4.3.4 Set-Cookie: fiwikiSession=a8015bd32eee4e5bd46fd83aea40f159; path=/ Vary: Accept-Encoding,Cookie Content-Language: fi Content-Type: text/html; charset=utf-8 X-Cache: MISS from wikipedia.org Transfer-Encoding: chunked Connection: keep-alive
Nämä ovat HTTP-protokollaan liittyvät otsikkotiedot (headers). Otsikot päättyvät kahteen rivinvaihtoon (tai tyhjään riviin). Tämän jälkeen palvelin lähettää varsinaisen näytettävän sisällön (text/html on MIME-tyyppi, joka kertoo sisällön olevan tässä tapauksessa HTML:ää). Selain poimii HTML-sisällöstä myös kuvien tiedostonimet ja hakee ne samanlaisilla pyynnöillä. Selain näyttää HTML-sivun ruudulla heti saatuaan sen, ja alkaa täyttää kuville asetettuja raameja ladattuaan nekin.
Vastauksessa pyyntöön välitetään ensimmäisen status-koodi (tässä 200), joka kertoo pyynnön onnistumisesta tai virheestä. Muita tietoja ovat sivun ikä ja voimassaoloaika, palvelinohjelmiston nimi ja versionumero, sekä välitetyn dokumentin tyyppi (tässä HTML, UTF-8-merkistökoodauksella) ja kieli (suomi). Sivun Expires-kenttänä (voimassaoloaika) on Unix-järjestelmän ajan alkuhetki vuonna 1970, mikä tarkoittaa, että sivu vanhenee välittömästi, eikä sitä pidä tallentaa välipalvelimeen uudelleen käytettäväksi. Tähän voi olla useita syitä. Esimerkiksi pyyntö oli sivun muokkausta varten, eikä vanhentuneen sisällön käsittely enää tulevaisuudessa ole järkevää tai käyttäjä voi olla kirjautunut tunnuksellaan, jolloin sivua ei voi näyttää muille käyttäjille. Kenttä Cache-Control kertoo saman.
Kenttä Set-Cookie asettaa selaimelle evästeen (cookie), jonka se palauttaa palvelimelle seuraavan pyynnön yhteydessä.
Metodit
GET on metodi, jolla luetaan yksittäinen sivu tai resurssi. HTTP määrittelee kuitenkin muitakin metodeja (vaikka valtaosa liikenteestä käyttää vain GET-metodia); erityisesti GET on määritelty idempotentiksi, jolloin peräkkäisten, identtisten GET-pyyntöjen pitäisi tuottaa aina sama tulos. Toinen käytetty metodi on POST, jolla välitetään palvelimelle muun muassa selaimessa muokattavien tekstikenttien (lomakkeiden) sisällöt. POST ei ole idempotentti, joten useimpien järjestelmän tilaa muuttavien kutsujen tulisi käyttää sitä GETin sijaan. HEAD-metodilla voidaan pyytää pelkät otsikkokentät ilman sivun sisältöä. Tätä käytetään esimerkiksi tarkistettaessa onko dokumentti muuttunut sitten viime kerran siirtämättä sitä kokonaan. CONNECT-metodia käytetään taas salattujen (HTTPS) yhteyksien kanssa. Muita metodeita on harvoin edes toteutettu WWW-palvelimeen, ellei samalla tueta myös WebDAV-laajennuksia.
- GET - käytetään resurssin hakua varten (esimerkiksi verkkosivun hakuun)
- POST - esimerkiksi täytetyn lomakkeen tietojen lähettäminen palveluun
- OPTIONS - kysely palvelimen tai resurssin ominaisuuksista
- HEAD - pyydä vain sivun otsikkotiedot (esimerkiksi hakukone selvittää onko sivu muuttunut)
- PUT - sivun tallettaminen (käytetään harvoin ilman WebDAV-laajennuksia)
- DELETE - sivun poistaminen (käytetään harvoin ilman WebDAV-laajennuksia)
- TRACE - palauttaa pyynnön sellaisenaan (vikojen jäljitykseen)
- CONNECT - pyydetään yhteyttä, joka jää päälle
Vastauskoodit
- Pääartikkeli: Luettelo HTTP-tilakoodeista
Palvelin palauttaa onnistuneeseen sivunhakuun (edellä) vastauksena ensimmäisenä "HTTP/1.1 200 OK". Tämä kertoo protokollan versionumeron ja koodi "200" kertoo pyynnön onnistuneen (selväkielisenä "OK"). Statuskoodeista 2xx-alkuiset kertovat onnistuneesta pyynnöstä. Näistä tärkeimpiä ovat 200 eli OK ja 206 "Partial Content", joka kertoo vastauksen olevan osa pyydetty osa tiedostoa (pyydettäessä osaa suuremmasta tiedostosta).
3xx-alkuiset koodit kertovat sisällön löytyvän jostain muualta kuin selain pyysi. Koodi 301 "Moved Permanently" kertoo sivun siirtyneen pysyvästi ja 302 "Moved Temporarily" väliaikaisesti toiseen paikkaan.
4xx-alkuiset vastauskoodit kertovat asiakasohjelman (selaimen) tekemästä virheestä. Esimerkiksi 404 "Not Found" on tuloksena, jos haetaan sivua, jota palvelimella ei ole ja 403 "Forbidden", ettei hakijalla ole oikeutta dokumenttiin pääsyyn.
5xx-alkuiset koodit ovat palvelimen tekemien virheiden seurausta. Näistä yleisin on 500 "Internal Server Error", joka kertoo pyynnön epäonnistuneen sitä käsittelevän ohjelman kaaduttua tai palvelimen muun virheellisen toiminnan seurauksena.
Vastauskoodeja käytetään verrattain vähän, vaikka niiden avulla voitaisiin toteuttaa monia hyviä ominaisuuksia, esimerkiksi www-selain voisi sopivan vastauskoodin saadessaan tietää, että URL ei ole enää olemassa, mutta että se löytyy annetusta osoitteesta ja päivittää automaattisesti kirjanmerkin uutta vastaavaksi.
Istunnot
HTTP on normaalisti tilaton. Tämä tarkoittaa, ettei seuraavan pyynnön tulos riipu mitenkään edellisen tuloksesta ja kaikki asiakkaat saavat saman tuloksen samalla pyynnöllä. Tämä on kuitenkin melko rajoitettua, koska esimerkiksi verkkokaupan ostoskori tai kirjautuminen käyttäjätunnuksella foorumille olisivat mahdottomia tilattomalla protokollalla.
Käyttäjien istuntojen (session) toteuttamiseen HTTP:ssä on useita keinoja. Luotettavimmat näistä liittyvät evästeiden (cookie) käyttöön. Tällöin palvelin asettaa asiakasohjelmalle evästeen Set-Cookie-kentällä pyynnön yhteydessä. Vastaavasti palvelimelle luodaan ja pidetään muistissa istuntoon liittyvä tieto. Istunnon voisi muodostaa luottamalla pelkästään evästeiden välittämään tietoon, mutta tämä on usein hankalaa ja mahdollisesti tietoturvariski. Tietoturvan ylläpitämiseksi istunto sidotaan myös käyttäjän IP-osoitteeseen, johon luottaminen ainoana istunnon tunnisteena on epävarmaa (mm. siksi, että usea eri käyttäjä voi hakea sivuja saman IP-osoitteen takaa. Katso osoitteenmuunnos) Myös evästeisiin luottaminen on suhteellisen epävarmaa, koska niille varattu tila on rajattu ja monet käyttäjät estävät ainakin epämääräisten evästeiden käytön. Istuntoon liittyvä tilatieto voidaan välittää myös URL:n yhteydessä parametrina, mutta sekin on ongelmallista väärin toteutettuna. Vastaavasti palvelimen kapasiteetti on rajallinen, joten vanhoja ja käyttämättömiä istuntoja on siivottava pois tietyin väliajoin, mikä saa liian kauan käyttämättömä olevan istunnon katkeamaan.
Standardointi
- RFC 1945 - HTTP 1.0
- RFC 2068 - HTTP 1.1 (vanhempi versio)
- RFC 2616 - HTTP 1.1 (vanhentunut)
- RFC 7230
- RFC 7231
- RFC 7232
- RFC 7233
- RFC 7234
- RFC 7235
- RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)
HTTP-protokollalle on varattu TCP-portti 80. Toinen varattu, mutta harvoin käytetty, portti on 8080. Toisaalta portti 8080 on monien verkkosovelluspalvelimien, kuten Tomcatin, JBossin ja Glassfishin oletusportti. Portin 8080 käyttö on niin ikään yleistä testiympäristöissä.
Katso myös
Lähteet
- ↑ Robb H. Tracy: Linux+ Certification Study Guide, s. 820. McGraw-Hill Professional, 2007. ISBN 9780071488747 (englanniksi)
- ↑ The Original HTTP as defined in 1991 (englanniksi)
- ↑ Dave Raggett's Bio (englanniksi)
- ↑ mnot’s blog (englanniksi)
- ↑ Iso päivitys netin ytimeen – standardia päivitettiin viimeksi 16 vuotta sitten
- ↑ Määritä nimeke! zdnet.com. 26.9.2019. Viitattu 6.8.2021. (englanniksi)
- ↑ HTTP-over-QUIC to be renamed HTTP/3 12.11.2018. ZDNet. Viitattu 17.11.2018.
Aiheesta muualla
- Kuvia tai muita tiedostoja aiheesta HTTP Wikimedia Commonsissa