HTTP
HTTP protokollen finnes i to versjoner, HTTP 1.0 og HTTP 1.1. Denne modulen er skrevet for å få fram de viktigste komponentene og er ikke versjonsavhengig ut over de kommentarene der versjonen nevnes.
Det finnes flere hendige on-line verktøy for å inspisere hva som går fram og tilbake i en HTTP-dialog. To av dem er er Toolsvoid [1] og HTTP-sniffer [2]
Merk at sikker, avlyttingsfri kommunikasjon forutsetter at den skjer kryptert. Serveren vi bruker må være satt opp for slik kryptering. Da kan vi nente siden med HTTPS. HTTPS er ikke en egen protokoll men det involveres en kryptering av innholdet. Vi kan da bruke HTTPS i stedet for HTTP i adressen. HTTPS er godt forklart på Wikipedia [3] . I skrivende stund er det slik at vi kan gå mellom http-refererte sider og https-refererte sider, men nettleserne aksepterer som hovedregel ikke at vi henter ikke-kryptert (http) materiale inn til kryptert (https) side.
HTTP er tilstandsløs. Det vil si at hver melding som går mellom klient og tjener er historieløs. De to partene husker ikke at de har snakket sammen før. Dette er grunnen til at vi må ivareta sesjoner, lengre "samtaler", med spesielle tiltak som cookies, localstorage (i HTML5), skjulte felt eller programmering av tiltak på tjeneren.
HTTP beskriver et antall forespørsler som skal kunne betjenes. De viktigste er:
- GET
- POST
- HEAD
Vi ser nærmere på en forspørsel - svar situasjon basert på GET, og kommenterer de andre etterpå.
GET
En forespørsel
En melding, forspørsel eller svar, har denne generelle formen:
startlinje header (ingen, en eller flere header-linjer) en blank linje body (meldingsinnholdet, kan være tomt)
Vi ser først på en forespørsel, en henvendelse fra klienten til tjeneren. Den kan se slik ut:
GET /web/basis/http/index.html HTTP/1.1 Host: borres.hiof.no
Startlinja angir metoden (GET), en filpath på tjeneren (/web/basis/http/) en ressurs som i dette tilfettel er en fil (index.html) og endelig protokollen (HTTP/1.1). Så har vi en headerlinje som er av den foreskrevne typen, navn: value, som beskriver tjeneren. Vi avslutter med en blank linje og har ingen body-del. Dette kan vi betrakte som en minimalistisk løsning for å få hentet den siden du ser på nå fra en tjener til en nettleser. Nettleserne er programmert til å sende mer informasjon som headere enn det som er vist ovenfor. Hvis vi bruker en "snifferen" som er referert nedenfor viser det seg at følgende sendes fra Mozilla Firefox når denne siden etterspørres:
GET /wep/basis/http/index.html HTTP/1.1 User-Agent: Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Host: borres.hiof.no Accept: */* Connection: close Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7 Accept-Language: en-gb,en;q=0.5 Cache-Control: no-cache Referer: http://www.toolsvoid.com/
Uten å ta for oss alle detaljene så ser vi at netteleseren presenterer seg selv (User-Agent), hvilken side vi spør fra (Referer).
Et svar
Serverens svar på en slik forespørsel følger samme mønster: startlinje, headerlinjer, blank linje, body. I dette tilfellet er selve siden, den ressursen vi spør etter, body. Hvis vi bruker snifferen finner vi ut at svaret er slik:
HTTP/1.1 200 OK Date: Thu, 20 Nov 2014 06:41:28 GMT Server: Apache/2.2.22 (Debian) Last-Modified: Thu, 20 Nov 2014 06:11:04 GMT ETag: "c48b7-5328-50844317433d3" Accept-Ranges: bytes Content-Length: 21288 Vary: Accept-Encoding Connection: close Content-Type: text/html; charset=utf-8 .. så kommer body som er selve vevsiden
Vi ser at serveren presenterer seg (Server), at den sier fra hvordan svaret er kodet (Content-Type) og vi ser i den første linja at den kvitterer med at dette gikk bra ( 200 OK). 200 er en standardisert kode, blandt mange andre, som sier noe om hvordan forespørselen forløp. OK er en tekslig utdyping av det samme.
GET et CGI-skript
Vi fortsetter å bruke GET som metode. Nå skal vi hente en ressurs som ikke er en fil. Vi skal referere til et CGI-skript i Python, og vi skal sende med en parameter, slik:
https://borres.hiof.no/wep/basis/hp/pscript.py?message=Hallo
Forsøk å kopiere linja ovenfor inn i nettleserens adressefelt.
Skriptet som kalles ser slik ut:
Vi ser at vi har lagt til en parameter=verdi (message=Hallo) til selve URI'en.
Den ressursen vi vil ha tak i er ikke en vanlig fil som tjeneren skal returnere.
Det er et program, et CGI-skript, som skal kjøres. Arbeidsdelingen mellom tjener og skript
krever noen kommentarer. Tjeneren må først tolke den URI'en den får og skille ut
selve filadressen fra parameterdelen.
Tjeneren åpner fila og finner den første linja i skriptet:
#! /usr/bin/python
I følge oppsettet på en Linux-tjener tolkes dette
slik at fila skal kjøres av den applikasjonen som er angitt: /usr/bin/python.
Serveren starter Python, Python interpreterer vårt skript og finner informasjon
hos tjeneren om det følger med en parameter verdi.
Så er det opp til skriptet å produsere et svar på forespørselen. Skriptet produserer headeren content-type og body. Det vil si at noen av headerene produseres av tjeneren. Hvis vi bruker snifferen, ser det slik ut:
GET /wep/basis/http/pscript.py?message=Hallo HTTP/1.1 User-Agent: Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Host: borres.hiof.no Accept: */* Connection: close Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7 Accept-Language: en-gb,en;q=0.5 Cache-Control: no-cache Referer: http://www.toolsvoid.com/]
Svaret på denne forespørselen ser slik ut:
HTTP/1.1 200 OK Date: Thu, 20 Nov 2014 06:45:41 GMT Server: Apache/2.2.22 (Debian) Vary: Accept-Encoding Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8 <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"/> <title>forms-demo</title> </head> <body> <p>Serverskriptet har mottatt:</p> <h2>message: Hallo</h2> <p><a href="javascript:history.back()">Tilbake</a></p> </body> </html>
HEAD
HEAD ghør i prinsipp det samme som GET, men returnerer bare headerinformasjon. Dette kan være nyttig hvis vi bare er interesserte i om en ressurs finnes eller når den er oppdatert.
POST
POST skiller seg fra GET på den måten at forespørselen har en body-del som ikke er tom. Vi kan overføre data til tjeneren i body i stedet for å hekte på parametere til URI'en slik vi gjør med GET. GET har den ulempen i forhold til POST at det er begrenset med data vi kan sende som parametere, og parameterne synes i nettleserens adressefelt. Når vi lager nettsider som skal kommunisere med en tjener gjør vi som regel det enten ved å bruke forms eller via AJAX. I begge tilfellene kan vi velge om vi vil bruke GET eller POST som metode.
Diagnoser
Den første linja vi får tilbake på en forespørsel inneholder en angivelse av hvordan forespørselen gikk, f.eks: HTTP/1.1 200 OK. Det finnes en rekke standardisert koder som hjelper oss å tolke resultatet. Noen av de vanligste er:
200 | OK | Alt vel |
404 | Not Found | Ressursen finnes ikke |
500 | Server Error | Tjeneren feiler i å respondere på forespørselen. Typisk når et CGI-skript feiler |
Du finner en komplett liste på definisjonen av HTTP/1.1, se referanser.
Andre protokoller
Det ligger utenfor dette materialet å gå nærmere inn på ulike lag av protokoller for transport av data på internettet. Det er imidlertid en rekke protokoller på øverste nivå i tillegg til HTTP. De mest kjente er vel FTP (file Transfer Protocol), SOAP (Simple Object Access Protocol,), SSH (Secure Shell) og Telnet. Du finner en inngangsnøkkel til disse på Wikipeadia [4] .