HTTP

HyperText Transfer Protocol

http://mbranko.github.io/webkurs

Ovo je deo web kursa

Literatura

HTTP

HyperText Transfer Protocol

  • protokol na aplikativnom nivou u TCP/IP steku
  • za distribuirane, kolaborativne, hipermedia sisteme
  • osnovni protokol za komunikaciju na webu
  • od 1990. godine

Tri osnovne osobine

  • connectionless: ne čuva konekciju
    1. web čitač inicira komunikaciju otvarajući TCP vezu prema serveru
    2. web čitač šalje zahtev serveru
    3. server obrađuje zahtev i šalje odgovor
    4. server zatvara vezu
      ...naredni zahtevi moraju ići kroz nove konekcije
  • media independent: bilo koji tip podataka (MIME-type) se može prenositi sve dok klijent i server mogu da ih obrade
  • stateless: klijent i server su u vezi samo tokom jednog ciklusa zahtev/odgovor; ne čuva se stanje u komunikaciji

HTTP je klijent/server model

  • klijent šalje zahtev: metoda, URI, verzija protokola, modifikatori zahteva, informacije o klijentu, opciono i sadržaj

  • server šalje odgovor: verzija protokola, kod rezultata, informacije o serveru, sadržaj

HTTP/1.0 vs HTTP/1.1 vs HTTP/2.0

  • HTTP/1.0 koristi novu TCP konekciju za svaki ciklus zahtev/odgovor
  • HTTP/1.1 može da koristi istu TCP konekciju za više ciklusa zahtev/odgovor
  • ali je protokol i dalje connectionless i stateless
  • uvedeno zbog unapređenja performansi
    • jedna stranica sa 20 slika bi zahtevala 21 TCP konekciju po HTTP/1.0
    • jedna stranica sa 20 slika, 5 CSS fajlova i 10 JavaScript fajlova...
  • HTTP/2.0 novine radi unapređenja performansi

HTTP verzija

  • koristi se <major>.<minor> šema
    HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT
  • primer:
    HTTP/1.0
    HTTP/1.1
    HTTP/2.0

URI adrese


   foo://example.com:8042/over/there?name=ferret#nose
   \_/   \______________/\_________/ \_________/ \__/
    |           |            |            |        |
 scheme     authority       path        query   fragment
            

Datum i vreme

  • uvek se izražava u GMT vremenskoj zoni

Struktura HTTP poruke

  1. prva linija
  2. nula ili više polja zaglavlja završenih sa CR/LF
  3. prazan red
  4. (opcioni) sadržaj

Primer HTTP zahteva: GET


GET /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.foobar.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
            

Primer HTTP zahteva: POST


POST /cgi-bin/process.cgi HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.foobar.com
Content-Type: application/x-www-form-urlencoded
Content-Length: length
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

licenseID=string&content=string&/paramsXML=string
            

Primer HTTP odgovora: 200


HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed

<html>
  <body>
    <h1>Hello, World!</h1>
  </body>
</html>
            

Primer HTTP odgovora: 404


HTTP/1.1 404 Not Found
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Connection: Closed
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
   <title>404 Not Found</title>
</head>
<body>
   <h1>Not Found</h1>
   <p>The requested URL /t.html was not found on this server.</p>
</body>
</html>
            

Primer HTTP odgovora: 400


HTTP/1.1 400 Bad Request
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Content-Type: text/html; charset=iso-8859-1
Connection: Closed
  
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
   <title>400 Bad Request</title>
</head>
<body>
   <h1>Bad Request</h1>
   <p>Your browser sent a request that this server could not understand.</p>
   <p>The request line contained invalid characters following the protocol string.</p>
</body>
</html>
            

Moguće metode u zahtevu

metoda opis
GET za čitanje podataka; ne bi trebalo da menja podatke
HEAD isto kao GET, ali vraća se samo prva linija i zaglavlja
POST za slanje (novih) podataka
PUT ažurira resurs novim vrednostima (šalje ceo resurs)
PATCH ažurira resurs novim vrednostima (šalje deo resursa)
DELETE uklanja resurs sa servera
CONNECT uspostavlja tunel prema serveru identifikovanim URI adresom
OPTIONS zahteva opis mogućih operacija za dati resurs
TRACE loopback test sa slanjem poruke

Status operacije

kod opis
1xx informativne poruke, od HTTP/1.1
2xx uspešno obrađen zahtev
200 OK
201 Created
204 No Content
3xx redirekcija: usluga dostupna na drugom URI
302 Moved Temporarily
304 Not Modified
4xx greška na strani klijenta
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
5xx greška na strani servera
500 Internal Server Error

Pregled svih statusa: https://httpstatuses.com

GET metoda

  1. za čitanje podataka
  2. uspešna operacija treba da vrati 200
  3. tipične greške: 401, 403, 404

GET metoda


GET /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.foobar.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
            

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Vary: Authorization,Accept
Accept-Ranges: bytes
Content-Length: 88
Content-Type: text/html
Connection: Closed

<html>
  <body>
    <h1>Hello, World!</h1>
  </body>
</html>
            

HEAD metoda

  1. za (skraćeno) čitanje podataka
  2. vraća se samo zaglavlje, ali ne i sadržaj
  3. uspešna operacija treba da vrati 200

HEAD metoda


GET /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.foobar.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
            

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Vary: Authorization,Accept
Accept-Ranges: bytes
Content-Length: 88
Content-Type: text/html
Connection: Closed
            

POST metoda

  1. za slanje (novih) podataka
  2. uspešna operacija treba da vrati
    • 200 OK ili 204 No Content: ako se rezultat ne može identifikovati pomoću URI
    • 201 Created: ako je kreiran novi resurs koji ima URI

POST metoda


POST /cgi-bin/process.cgi HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.foobar.com
Content-Type: text/xml; charset=utf-8
Content-Length: 88
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://clearforest.com/">string</string>
            

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Vary: Authorization,Accept
Accept-Ranges: bytes
Content-Length: 88
Content-Type: text/html
Connection: Closed

<html><body><h1>Request Processed Successfully</h1></body></html>
            

POST metoda


POST /edit/ HTTP/1.1
Host: example.org
User-Agent: Thingio/1.0
Authorization: Basic ZGFmZnk6c2VjZXJldA==
Content-Type: application/atom+xml;type=entry
Content-Length: nnn
Slug: First Post

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Atom-Powered Robots Run Amok</title>
  <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  <updated>2003-12-13T18:30:02Z</updated>
  <author><name>John Doe</name></author>
  <content>Some text.</content>
</entry>
            

HTTP/1.1 201 Created
Date: Fri, 7 Oct 2005 17:17:11 GMT
Content-Length: nnn
Content-Type: application/atom+xml;type=entry;charset="utf-8"
Location: http://example.org/edit/first-post.atom
ETag: "c180de84f991g8"  

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Atom-Powered Robots Run Amok</title>
  <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  <updated>2003-12-13T18:30:02Z</updated>
  <author><name>John Doe</name></author>
  <content>Some text.</content>
  <link rel="edit"
      href="http://example.org/edit/first-post.atom"/>
</entry>
            

PUT metoda

  1. za ažuriranje resursa
  2. uspešna operacija treba da vrati
    • 200 OK: ako ima opisa operacije u odgovoru
    • 204 No Content: ako nema opisa operacije
    • 201 Created: ako je kreiran novi resurs

PUT metoda


PUT /users/123 HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.foobar.com
Accept-Language: en-us
Connection: Keep-Alive
Content-type: application/json
Content-Length: 182

{"user_id": 123, "firstName": "John", "LastName": "Doe"}
            

HTTP/1.1 204 No Content
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Connection: Closed
            

DELETE metoda

  1. za brisanje resursa
  2. uspešna operacija treba da vrati
    • 200 OK: ako ima opisa operacije u odgovoru
    • 204 No Content: ako nema opisa operacije

DELETE metoda


DELETE /users/123 HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.foobar.com
Accept-Language: en-us
Connection: Keep-Alive
            

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Vary: Authorization,Accept
Accept-Ranges: bytes
Content-Length: 88
Content-Type: text/html
Connection: Closed

<html><body><h1>Request Processed Successfully</h1></body></html>
            

Koji zahtev / koji odgovor?

HTTP/2

HTTP/2

  • nastao iz Guglovog SPDY ("speedy") protokola
  • Ciljevi HTTP/2:
    • smanjenje kašnjenja
    • smanjenje broja otvorenih TCP konekcija
    • bolja bezbednost na webu
    • kompatibilnost sa HTTP/1.1 klijentima i serverima
    • može se koristiti gde i HTTP/1.1

Novosti u HTTP/2

  • multiplexing: više asinhronih HTTP zahteva kroz jednu TCP konekciju
  • server push: više odgovora na jedan zahtev
  • header compression: kompresija HTTP zaglavlja kao i sadržaja
  • request prioritization: prioritet među zahtevima poslatim na isti domen
  • binary protocol: HTTP/2 je binarni protokol, za razliku od HTTP/1.1

Kompatibilnost sa HTTP/1.1

  • HTTP/2 klijent prvo šalje HTTP/1.1 zahtev sa zaglavljem
    Upgrade: HTTP/2.0

  • ako server podržava HTTP/2 odgovara porukom
    HTTP/1.1 101 Switching Protocols

  • klijent može da pamti da li server podržava HTTP/2

Multipleksiranje

  • više zahteva se može poslati kroz jednu TCP konekciju i odgovori se mogu primati asinhrono
  • streams & frames
    • svaki zahtev i odgovor imaju svoj stream id
    • podeljeni su u delove (binarne) i svaki deo ima svoj frame id
    • stream identifikuje kom zahtevu ili odgovoru pripada dati frame
    • stream je kolekcija frame-ova

Prioritet

  • stream može imati različite prioritete
  • na osnovu njega server odlučuje koliko memorije, CPU i I/O resursa će odvojiti za zahtev
  • frame-ovi streama sa prioritetom šalju se pre ostalih frame-ova

Settings frame

  • kada se uspostavi TCP konekcija za HTTP/2, klijent i server razmenjuju SETTINGS frame-ove
    • koliko istovremenih stream-ova (paralelnih zahteva)
    • window size
    • na nivou konekcije i na nivou pojedinačnih stream-ova
  • nije isto što i TCP flow control, ali je slično

Server push

Primer: klijent šalje zahtev za index.html; server proceni da će klijent tražiti i styles.css i script.js, i šalje push promise da predupredi zahtev.

  1. klijent šalje HEADERS tražeći index.html u strim 3
  2. server šalje PUSH_PROMISE za styles.css i PUSH_PROMISE za script.js u strim 3; ovi frejmovi su slični zahtevu klijenta
  3. server šalje HEADERS frejm u strim 3 za odgovor na index.html
  4. server šalje DATA frejmove u strimu 3 za index.html
  5. server šalje HEADERS frejm za odgovor na styles.css u strimu 4
  6. server šalje HEADERS frejm za odgovor na script.js u strimu 6
  7. server šalje DATA frejmove u strimovima 4 i 6 za styles.css i script.js

Kompresija zaglavlja

  • Zaglavlje HTTP zahteva troši od 800B do par KB (cookies)
  • kompresija nije GZip, već se zaglavlja koja se ponavljaju (ne menjaju) izostavljaju
  • klijent i server održavaju tabelu zaglavlja za svaku TCP konekciju
  • zaglavlja se šalju samo kada se vrednost menja

Kraj dela

← Početak dela

⇐ Početak kursa