Miki TFC - http://www.miki.cat
 

1.3. El protocol HTTP

En aquest apartat s'intenta donar una visió sintetitzada dels trets bàsics que caracteritzen el protocol HTTP. L'objectiu és utilitzar-lo de base de cara a recollir els requisits del protocol que haurà d'implementar el nostre servidor.

1.3.1. Introducció

EL protocol de transferència d'HiperText (Hypertext Transfer Protocol) és un protocol client/servidor senzill i eficient que defineix les regles que han de seguir les comunicacions entre el servidors web i els clients (navegadors, software de descàrrega, etc.).

HTTP està basat en operacions senzilles de solicituts-respostes (Request-Response), de manera que el client envia un missatge amb les dades de la solicitut al servidor, i aquest envia un missatge de resposta al client amb les dades sobre l'estat de l'operació i el seu possible resultat. Totes les operacions poden fer referència a l'objecte de recurs sobre el que actuen, i la manera de referir-se a aquests objectes és per mitjà de la seva URL (Uniform Recource Locator).

Les característiques més rellevants són:

1.3.2. Etapes d'una transacció HTTP

De qualsevol transacció HTTP sen poden distingir les següents etapes:

  1. El client accedeix a una URL, ja sigui escrivint-la directament en el navegador, o per mitjà d'un hiperenllaç.

  2. El client Web decodifica la URL, separant-ne les diferents parts, així n'identifica el protocol (HTTP en el nostre cas), la direcció DNS o IP del servidor, el possible port (per defecte el 80), i l'objecte demanat al servidor.

  3. S'obre una connexió TCP/IP amb el servidor sobre el port 80 (o el que s'hagi especificat).

  4. Es fa la petició: S'envia la comanda adient (GET, HEAD, POST, ...), seguida de la URL de l'objecte demanat, la versió del protocol, i un conjunt de capçaleres amb diferents tipus d'informació.

  5. El servidor respon a la petició enviant un missatge de resposta que conté el codi d'estat, una serie de capçaleres entre les que destaquem el tipus MIME de la informació, seguit de la pròpia informació.

  6. Tancament de la connexió TCP/IP.

Cal notar que si s'utilitzen connexions persistents (HTTP/1.1) els passos 4 i 5 s'anirien repetint fins que una de les dues parts tanqués la connexió explicitament, o fins que passés un cert temps d'inactivitat.

Els coneixedors del protocol TCP/IP s'adonaran que l'HTTP explicat fins ara, fa un ús ineficient de les característiques de rendiment del TCP/IP com és l'ús de finestres de connexió: Posem per cas que el client accedeix a una plana amb quinze imatges, aleshores el client faria una petició, i s'esperaria a rebre la imatge per fer la següent petició, i així successivament fins a les quinze vegades, si a més resulta que les imatges són molt petites (de la mida d'un píxel per decorar taules per exemple), tenim que mai s'arriba a omplir la finestra TCP provocant una ineficiència considerable en l'ús de la xarxa.

El Pipelining és una tècnica prevista per a la implementació de clients i servidors que permet de multiplexar múltiples peticions, i llurs respostes en una mateixa transferència i aprofitar així les característiques d'eficiència del TCP/IP, així se soluciona el problema descrit en l'anterior pàrraf, de manera que el client faria totes les peticions encadenades l'una al darrere de l'altra sense esperar per cada una, i enviant-les totes de cop, el servidor per la seva banda prepararia les respostes en un buffer intermig, i quan tingui prou dades les enviaria al client. Cal que el servidor vigili de no fer esperar massa les respostes, òbviament no es tracta d'aprofitar l'eficiència per una banda penalitzant el rendiment per l'altra.

Veiem ara un exemple concret:

1.3.3. Estructura dels missatges HTTP

El protocol HTTP només defineix dos tipus de missatges: Les peticions o Request i les respostes o Response. Cada missatge està format per una línia d'inici, cap o més camps de capçalera i una línia en blanc indicant el final de les capçaleres, i finalment el cos del missatge si s'escau. Les capçaleres segueixen el format definit a l'[RFC 822 [9]], de manera que cada camp ocupa una línia acabada amb CRLF, i s'usa ASCII per la codificació dels caràcters.

Els missatges doncs seguiran el següent esquema:

On tenim que SP significa espai en blanc, i CRLF són els caràcters CR (Carry return) y LF (Line Feed)

1.3.4. Descripció de les comandes

Les comandes són aquelles operacions que el client demana sobre un recurs al servidor HTTP. La seva sintaxi és molt senzilla com s'ha vist en l'exemple de petició de l'apartat anterior:

Comanda SP URL SP Versió-HTTP CRLF
En cas que la comanda necessiti especificar alguna característica especial es fa ús de les capçaleres del missatge.

Les diferents comandes reconegudes a l'especificació del protocol [RFC 2612] són les següents:

  • OPTIONS. Mètode utilitzat per demanar informació sobre les opcions de comunicació disponibles en l'intercanvi de peticions/respostes sobre un recurs. D'aquesta manera el client pot determinar les opcions i/o requeriments associats a un recurs, o les capacitats del servidor sense que això impliqui actuar sobre el recurs. Per exemple, es poden determinar les comandes permeses sobre un determinat recurs, o la codificació que s'emprarà per transmetre'l.

  • GET. El mètode GET és el que s'utilitza per demanar qualsevol tipus de recurs, ja siguin pàgines web, imatges, o en general qualsevol tipus d'arxiu. Òbviament si l'URI fa referència a un programa o script (CGI, ASP, PHP, ...) aquest serà executat al servidor i sen retornarà la seva sortida.

  • HEAD. Aquest mètode és idèntic al mètode GET, excepte que no s'envia el cos del missatge, sinó només les capçaleres.

  • POST. Mètode utilitzat per enviar informació (o dades) al servidor, de manera que el servidor les passa al recurs identificat per l'URI (normalment un script o programa) per tal que les processi. El servidor depenent del resultat de la operació pot retornar la sortida del programa, o bé no retornar res (codi 204 No Content).

  • PUT. Mètode que indica que el cos del missatge s'ha de deixar a l'URI indicada en la petició, o bé reemplaçar-lo si aquest ja existeix.

  • DELETE. El mètode DELETE demana al servidor que elimini el recurs identificat per l'URI de la petició.

  • TRACE. Aquest mètode permet al client de veure quina informació rep el servidor. Posem per exemple que hi ha un proxy entre mig de la comunicació, aleshores aquest servidor intermediari, quan rep una petició del client, la reenvia al servidor ficant-li les seves pròpies capçaleres. Així si el client fa un TRACE sobre un determinat recurs, el servidor li retornarà les capçaleres que ha rebut al cos del missatge de resposta.

  • CONNECT. Aquesta és una comanda reservada per ser utilitzada amb els servidors proxy quan aquests poden convertir-se en un túnel dinàmicament (com ara un túnel SSL).

1.3.5. Les Capçaleres

Les capçaleres HTTP són un conjunt de variables que s'adjunten als missatges per tal de descriure alguna característica, o de complementar-ne el significat. El format de les capçaleres és el següent:

		Nom-Varialbe: SP Valor-Variable
On segons el tipus de variable, Valor-Variable pot prendre un o més valors separats per algun caràcter separador.

Les capçaleres definides al [RFC 2616] són:

  • Capçaleres generals.

    Cache-Control
    Connection
    Date
    Pragma
    Trailer
    Transfer-Encoding
    Upgrade
    Via
    Warning
    	

  • Capçaleres de les peticions (Request).

    Accept
    Accept-Charset
    Accept-Encoding
    Accept-Language
    Authorization
    Expect
    From
    Host
    If-Match
    If-Modified-Since
    If-None-Match
    If-Range
    Max-Forwards
    Proxy-Authorization
    Range
    Referer
    TE
    User-Agent
    	

  • Capçaleres de les respostes (Response).

    Accept-Ranges
    Age
    ETag
    Location
    Proxy-Authenticate
    Retry-After
    Server
    Vary
    WWW-Authenticate
    	

  • Capçaleres del contingut (Entity).

    Allow
    Content-Encoding
    Content-Language
    Content-Length
    Content-Location
    Content-MD5
    Content-Range
    Content-Type
    Expires
    Last-Modified
    extension-header
    	

Tot i això, la majoria d'elles no són imprescindibles per al funcionament del protocol, sinó que més aviat s'utilitzen en determinats tipus de transferències, o per donar informació addicional. Cal mencionar, però, que la capçalera Host si que és obligatòria per al totes les peticions HTTP/1.1 i el seu valor ha de fer referència al nom del servidor hoste i al port (si és diferent del 80) del recurs que es demana. També és necessari que tots els missatges que portin cos (entity-body) n'indiquin la seva mida, ja sigui per mitjà de la capçalera Content-Length, o per la combinació d'altres
[2].

1.3.6. Codis d'estat del servidor

Com s'ha vist quan parlàvem dels missatges, la primera línia del missatge de resposta del servidor conté el codi d'estat, fent referència a la petició solicitada. Podem veure els codis d'estat definits per l'especificació del protocol a la següent taula:

1.3.7. Notes sobre la cau de pàgines i els servidors Proxy

La majoria de clients Web mantenen una còpia local de les pàgines visitades anteriorment, amb la data de modificació. L'objectiu no és altre que reduir el nombre de connexions a internet, així quan el client accedeix a una web, primer es comprova si la pàgina es troba a la cau, si hi és s'envia un HEAD al servidor per comprovar la data de modificació de la plana, si és la mateixa que la que té a la cau, s'usa la còpia local, i sino es fa un GET per obtenir-ne la última versió, i a més s'actualitza el contingut de la cau.

Un servidor Proxy es situa entre el client i el servidor Web, de manera que el client es connecta al Proxy per demanar un recurs enlloc de fer-ho al servidor original, i el Proxy actua de manera molt semblant al que em explicat.

El principal avantatge d'utilitzar servidors Proxy en les organitzacions és que proporcionen un únic punt d'entrada/sortida a internet, el que permet tenir un control més eficient sobre l'ús d'internet i la seguretat, i a més sen redueix el tràfic considerablement, ja que els clients acostumen a accedir a conjunt semblant de pàgines.

Tot i això en alguns casos les cau poden tenir copies obsoletes, sobretot de pàgines generades dinàmicament. De tota manera el protocol HTTP permet de controlar certs aspectes de com gestionar les còpies de la cau per mitjà d'algunes capçaleres.

Notes

[1]

MIME és l'acrònim de Multipurpose Internet Mail Extension.

[2]

Per exemple quan el tipus de transferència és "chunked" s'indica la posició de les parts que s'envien amb la capçalera Content-Range.