HTTP

**HTTP** jeb **hiperteksta transporta protokols** () ir lietojumslāņa protokols, kas paredzēts datu apmaiņai starp tīmekļa serveriem un pārlūkprogrammām. Tas ir galvenais informācijas pārraides veids vispasaules tīmeklī. Tā sākotnējā funkcija bija veids, kādā publicēt un pārraidīt hiperteksta dokumentus (HTML lapas), bet tagad ar to var pārraidīt arī cita veida datus.

HTTP ir pieprasījuma/atbildes protokols starp klientiem un serveriem. Transakciju vienmēr sāk klients, izveidojot TCP/IP savienojumu uz servera noteiktu portu (80 pēc noklusējuma) un nosūtot pieprasījumu serverim. HTTP serveris, kurš klausās šo portu, gaida, ka klients nosūtīs pieprasījumu, piemēram, `GET / HTTP/1.1` Pieprasījums var būt papildināts ar e-pasta stila MIME ziņojumu, kurš satur noteiktu skaitu informējošas galvenes virknes, kas apraksta dažādus pieprasījuma aspektus, aiz kā seko opcionāls ķermenis ar patvaļīgiem datiem. Pēc pieprasījuma virknes saņemšanas serveris atpakaļ nosūta atbildes virkni, piemēram, "200 OK" (pieprasījums izpildīts veiksmīgi), un savu ziņojumu, kura ķermenis satur pieprasīto failu, kļūdas paziņojumu vai citu informāciju.

HTTP 1.0 atšķiras no citiem uz TCP balstītiem protkoliem, piemēram FTP, ar to, ka savienojums tiek aizvērts tūlīt pēc pieprasījuma izpildes. Tas padara HTTP protokolu īpaši piemērotu vispasaules tīmeklim, kur lappuses bieži vien satur saites uz citiem serveriem.
Savukārt HTTP 1.1 izmanto pastāvīgu TCP savienojumu — tādējādi pēc katra pieprasījuma nav jāveido jauns TCP savienojums.

HTTP ir bezstāvokļa protokols — gan serveris, gan klients neuztur savienojuma stāvokli — serveris nezina, vai klients ir saņēmis atbildi, klients pie *timeout* kļūdas nevar zināt, vai serveris ir apstrādājis pieprasījumu

## Piemērs
Zemāk ir redzams saziņas piemērs starp HTTP klientu un HTTP serveri, kas darbojas uz www.google.lv 80. porta.

**Klienta pieprasījums**:

```
GET / HTTP/1.1
Host: www.google.lv
```


(papildināts ar rindas pārnesumu)

**Servera atbilde**:

```
HTTP/1.1 200 OK
Content-Length: 3059
Server: GWS/2.0
Date: Sat, 11 Jan 2003 02:44:04 GMT
Content-Type: text/html
Cache-control: private
Set-Cookie: PREF=ID=73d4aef52e57bae9:TM=1042253044:LM=1042253044:S=SMCc_HRPCQiqy
X9j; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.lv
Connection: keep-alive
```


(papildināts ar rindas pārnesumu un Google sākumlapas HTML kodu)

----
HTTP 1.0 klients sūta pieprasījumu serverim un serveris sūta atbildi atpakaļ klientam. Pēc tā savienojums tiek izbeigts. Savukārt HTTP 1.1 atbalsta pastāvīgos savienojumus. Tas ļauj klientam nosūtīt pieprasījumu serverim, saņemt atbildi, un tad nosūtīt papildu pieprasījumus un saņemt papildu atbildes nekavējoties. Šo atkārtoto pieprasījumu laikā TCP savienojums netiek izbeigts, līdz ar to papildu datu plūsma TCP dēļ ir mazāka.

## Darbība
Klients sūta pieprasījumu serverim. Pieprasījums satur atslēgvārdu (*verb*) un pieprasītā resursa adresi (kā failsistēmas ceļu), un var saturēt papildu headerus (formātā nosaukums:vērtība), un vēl dažu atslēgvārdu (ne GET) gadījumā var saturēt datus.
Servera atbilde satur atbildes kodu (cik veiksmīgi pieprasījums tika izpildīts), papildu headerus un var saturēt atbildes datus.

### Pieprasījumu veidi
Visplašāk lietotie pieprasījumu veidi ir GET un POST, lielākā daļa serveru neko citu neatbalsta (vai arī jebko citu atslēdz drošības apsvērumu dēļ).
*GET — Pieprasa norādīto resursu. Pieprasījums var saturēt headerus, bet nesatur papildu datus. GET pieprasījumam nevajadzētu izmainīt servera datus.
*POST — Nosūta datus uz serveri. Pieprasījums var saturēt headerus un satur papildu datus (ko jāaizsūta uz serveri), servera atbilde var būt līdzīga kā GET pieprasījumiem.
*HEAD — Līdzīgs GET, tikai atbilde nesatur datus, tikai atbildes kodu un headerus.
*PUT — Nosūta pieprasījuma datus uz norādīto resursu, lai to izveidotu vai aizvietotu. Formāts līdzīgs kā POST.
*DELETE — Izdzēš norādīto resursu, formāts līdzīgs kā GET.
*TRACE — Atsūta atpakaļ klienta pieprasījumu, lai klients varētu izvērtēt, ko tam nodarījuši starpniekserveri starp klientu un serveri.
*OPTIONS — Atsūta attiecīgajam resursam pieejamos HTTP atslēgvārdus.
*CONNECT — Izveido TCP savienojumu uz norādīto adresi, lieto HTTP starpniekserveriem, lai nodrošinātu HTTPS. Normālos HTTP serveros nelieto.
*PATCH — Daļēji aizvieto resursu.
### Atbildes kodi
Tie ir 3ciparu skaitļi, kas satur informāciju, par to cik veiksmīgi izdevās izpildīt pieprasījumu:
*2xx — pieprasījums izpildīts sekmīgi;
*3xx — pāradresācija — serveris ziņo, ka pieprasītais resurss atrodas citur un atbilde satur informāciju kur un kāpēc;
*4xx — klienta kļūda — pieprasījums nav izpildīts sekmīgi klienta dēļ (resurss nav pieejams, klients nav autentificēts, ...);
*5xx — servera kļūda — pieprasījums nav izpildīts sekmīgi tāpēc, ka serverī kaut kas nobruka, vai tāpēc, ka starpniekserveris nevarēja sasniegt serveri.

### HTTP starpniekserveri
Starp klientu un serveri var būt starpniekserveris (*proxy*). Tur izšķir 2 veidus:
*starpniekserveris starp nelielu skaitu klientu un visiem serveriem (*forward proxy*). To lieto, lai samazinātu klientu trafiku (*http caching proxy*) un lai vieglāk cenzētu, kam klienti tiek klāt.
*starpniekserveris starp visiem klientiem un vienu vai dažiem serveriem (*reverse proxy*). To lieto, lai samazinātu servera slodzi (arī tā pati *cache*) un uzliktu TLS (starp klientiem un starpniekserveri tad ir HTTPS, starp starpniekserveri un serveri ir HTTP).
 
Jebkurā gadījumā starpniekserveri cauri ejošajiem pieprasījumiem var pievienot papildu headerus.

*Reverse proxy* gadījumā starpniekserveris uzvedas kā parasts HTTP serveris, tikai pārsūta saņemtos pieprasījumus uz attiecīgo serveri, nevis apstrādā uz vietas (atskaitot pieprasījumus, kurus var atbildēt ar datiem no *cache*).

*Forward proxy* gadījumā HTTP pieprasījumiem jāsatur pilno URL, kas satur servera *hostname*, (nevis relatīvo, kā slēdzoties pa taisno). HTTPS gadījumā kients lieto CONNECT pieprasījumu, kas satur tikai servera *hostname* un starpniekserveris tad izveido TCP savienojumu, caur kuru darbina TLS. Šo metodi lieto arī, lai caur starpniekserveri dabūtu cauri ne-HTTP protokolus.

## Skatīt arī
* HTTPS

## Atsauces

## Ārējās saites

*  A detailed technical history of HTTP.
*  Design Issues by Berners-Lee when he was designing the protocol.
* list of other classic documents recounting the early protocol history