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

Capítol 2. Anàlisi i Disseny del servidor Web

2.1. Anàlisi de requisits

En el capítol anterior ja hem vist quines eren les característiques més rellevants del protocol HTTP, i també que els servidors Web s'implementen seguint l'esquema client/servidor donant servei a múltiples clients, de manera que ara ja podem establir els requisits que haurà de tenir el servidor XicHttpd. Començarem doncs per analitzar-ne les característiques essencials, i a continuació establirem les funcionalitats addicionals que se li volen implementar.

2.1.1. Requisits del servidor

  1. Cal implementar la part servidor de l'esquema client/servidor sobre el protocol TCP/IP.

  2. El servidor ha de restar a l'espera de rebre connexions al port HTTP per defecte (port 80). Tanmateix s'hauria de permetre de canviar aquest port estàticament, és a dir, abans de l'execució del servidor ja sigui com a paràmetre de la línia de comandes, o per mitjà d'algun fitxer de configuració.

  3. S'han de poder atendre simultàniament les peticions de múltiples clients. Això requerirà d'algun mecanisme que permeti l'atenció paral·lela de cada connexió.

  4. Un cop acceptada la connexió d'un nou client, tot l'intercanvi d'informació de la capa d'aplicació entre aquest i el servidor es farà seguint la versió HTTP/1.1 del protocol HTTP. Donat que en aquesta versió es contempla la persistència per defecte, caldrà que el servidor tanqui les connexions després d'un cert temps d'inactivitat. En el cas que les peticions facin referència a una altra versió, el servidor haurà de respondre amb el codi d'estat 505 HTTP Version Not Supported.

  5. Els mètodes HTTP inicialment acceptats per aquest servidor seran GET i HEAD. En cas de rebren algun altre, el servidor haurà de respondre amb el codi d'estat 501 Not Implemented.

  6. Totes les peticions faran referència a un recurs situat en el sistema de fitxers de la màquina on s'executa el servidor, de manera que el servidor haurà de demanar el recurs al sistema de fitxers i servir-lo al client (mètode GET), o informar-ne de les característiques (mètode HEAD). Es poden donar dos situacions d'error: o bé que no es tingui permís per accedir al fitxer (o el directori on es troba), o bé que el fitxer no existeixi; en ambdós casos el servidor respondrà amb el codi d'estat 404 Not Found ja que en aquesta versió no es fa distinció de clients, ni es suporta cap tipus d'autentificació.

  7. Per cada petició caldrà que el servidor en verifiqui la sintaxis. Algunes situacions d'error que es podrien donar són:

  8. Les capçaleres que incorporaran els missatges de resposta són les següents:

  9. Cal tenir present, que existeix la possibilitat de passar paràmetres per mitjà de la URL a les pàgines Web (pas per GET), caldrà doncs que a l'hora de descodificar l'URI es tingui en compte que el caràcter separador és '?'.

2.1.2. Funcionalitats addicionals

Nota

Durant les primeres setmanes de recollida d'informació, vaig poder veure algunes implementacions del mètode POST que no tenien res a veure amb els estàndards CGI[1], ni amb el pas de paràmetres a llenguatges d'script. Donat que el servidor s'executarà en un entorn controlat, si es disposa de temps s'intentarà fer una implementació "particular" del mètode POST definint les regles bàsiques que hauria de tenir l'aplicació que en processi les dades.

2.1.3. Anàlisi

Podem distingir dues parts diferenciades a partir dels requisits anteriors, així tenim que els tres primers fan referència a la implementació del servidor, i la resta a la implementació del protocol.

Per satisfer el tercer requisit es podrien utilitzar subprocessos, utilitzar algun mecanisme de selecció de connexions (com select de la llibreria sockets del C) o bé utilitzar fils d'execució diferenciats. S'obta pels fils d'execució, ja que seleccionant connexions en realitat no tindríem paral·lelisme, i utilitzant subprocessos correm el risc de sobrecarregar la màquina en excés en càrregues altes, a part de la penalització que provoca la creació del mateix (crida al sistema, assignació de memòria, etc), a banda que totes les comunicacions entre processos es farien per mitjà de crides al sistema (PIPE, mmap, IPC, signals, etc.). D'altra banda els fils comparteixen per defecte l'espai de memòria, ens ofereixen mecanismes d'accés segur a les variables compartides, i un control adient de cada fil, tot per mitjà de les funcions de la llibreria escollida. Un altre tema és el tractament que faci el sistema operatiu dels fils, però aquesta discussió queda lluny de l'objectiu d'aquest document.

Tenint en compte el que s'ha escollit, inicialment es crearan una serie de fils estàticament que s'assignaran a cada connexió entrant, un cop estiguin tots assignats sen crearan de nous dinàmicament per atendre les noves connexions, això si, prioritzant sempre els fils estàtics que ja hagin acabat la seva tasca. Cal notar que si es permet de configurar la quantitat de fils estàtics i dinàmics, així com el timeout de les connexions podrem fer un tunning del servidor i comparar els resultats dels benchmarks escollits.

Vegem doncs els diagrames de flux sobre el funcionament del servidor Web. En primer lloc tenim el diagrama del fil principal fins a la creació/assignació dels fils per cada connexió, el següent fa referència a cada fil que és on estarà implementat el protocol HTTP.

2.1.3.1. Tasques del servidor

Vegem a continuació la descripció de tasques a realitzar pel procés principal del servidor Web, a partir del diagrama de flux següent:

2.1.3.2. Funcionament de cada fil

A continuació tenim el diagrama de flux de les tasques que haurà d'executar cada thread des de que se li assigna una connexió, fins que aquesta es tanca:

Notes

[1]

CGI és l'acrònim de Common Gateway Interface