PRACTICA FINAL

Anuncio
Práctica FINAL. Redes de Computadores
PRACTICA FINAL
Diseño e implementación de un servidor Web básico y cliente http
Protocolo HTTP-RC
Descripción de la práctica
Se pretende desarrollar un servidor Web básico con soporte a múltiples conexiones
concurrentes y un cliente http básico que permita el uso del servidor web.
Tanto servidor como cliente deben cumplir un subconjunto del estándar HTTP (protocolo
HTTP-RC).
Descripción del Servidor Web HTTP-RC
El servidor aceptará múltiples conexiones concurrentes, hasta un número máximo de
clientes indicado en un parámetro de entrada, y para su desarrollo se deberá utilizar la
función fork() para que para cada conexión se cree un nuevo proceso que atienda a dicha
conexión.
El protocolo http a implementar será la versión HTTP/1.0. A diferencia de la versión
HTTP/1.1 en la versión 1.0 el servidor una vez realizada la petición (entrega del recurso
solicitado o envío de información) cierra la conexión.
El servidor aceptará peticiones según el estándar http al menos de los métodos GET y
HEAD. Un ejemplo de peticiones que debería aceptar:
GET /index.html HTTP/1.0
Host: www.example.com
User-Agent: nombre-cliente
[Línea en blanco]
HEAD /index.html HTTP/1.0
Host: www.example.com
User-Agent: nombre-cliente
[Línea en blanco]
Página 1 de 7
Práctica FINAL. Redes de Computadores
Él servidor enviará por la conexión las cabeceras de respuesta según la petición realizada
(GET o HEAD) y según si se puede cumplir o no la petición, y seguido a las cabeceras
deberá enviar, si es el caso de petición GET, línea a línea el recurso (fichero) solicitado
En el ejemplo anterior, hay que enviar el recurso (fichero) index.html
Los recursos que sirve deben encontrarse a partir de un directorio a especificar en la
ejecución del servidor. Será en ese directorio donde el servidor web irá a buscar dichos
ficheros
Del estándar HTTP el protocolo HTTP-RC al menos debe implementar:
•
•
•
Debe implementar los métodos GET y HEAD
Debe interpretar una solicitud con cabeceras de petición estándar y debe
implementar las cabeceras de respuesta al menos las más relevantes. Al menos debe
implementar el comportamiento para responder con un código 200 OK o 404 Not
Found
Una vez enviado el recurso debe cerrar la conexión establecida con el cliente
Ejemplo:
Ejecución:
$ httpserver-rc -n <número de clientes> -d <dir base recursos>
Ejemplo: httpserver-rc -p 8888 -n 10 -d /opt/rc/rc<xx>/html
Petición:
GET /index.html HTTP/1.0
Host: <nombre_del_host_que_hace_la_peticion>
User-Agent: http-rc/1.0
[Línea en blanco]
Respuesta:
HTTP/1.0 200 OK
Date: 10/11/2009 16:15:00
Content-Length: 57
<html>
<body>
<h1>Hello World</h1>
</body>
</html>
Página 2 de 7
Práctica FINAL. Redes de Computadores
Las cabeceras Host y User-Agent se usan para lo siguiente:
• Host: nombre del host cliente que hace la petición
• User-Agent: nombre del navegador cliente que se está utilizando, en nuestro
caso pondremos siempre http-rc/1.0
Es importante destacar que el servidor sabe que la petición ha finalizado, es decir que no
hay más cabeceras, mediante una línea en blanco (con caracteres CRLF, retorno de carro,
fin de línea). En C se representan mediante \r\n\ (retorno de carro \r y salto de línea \n) en
un string…
Descripción del Cliente Web HTTP-RC
El cliente Web HTTP-RC debe implementar el comportamiento anteriormente descrito
enviando peticiones GET y HEAD. Mostrará siempre por pantalla las cabeceras de
respuesta y en caso de peticiones GET el recurso obtenido lo guardará en un fichero
local con el mismo nombre que el fichero solicitado
Mediante un modificador (-h) que es opciones indicaremos al cliente que el método es
HEAD en vez de GET
El funcionamiento detallado del cliente es el siguiente:
1. El cliente envía la solicitud de página al servidor. Dependiendo de la existencia
o no del modificador (-h) mandará un GET o un HEAD y de la URL obtendrá el
nombre del servidor, el puerto y el recurso solicitado
2. Una vez recibidas las cabeceras de respuesta y el recurso solicitado (según si es
una petición GET o HEAD) cerrará el programa
Ejemplo:
Ejecución:
http-rc http://<nombre_servidor>:<puerto>/<recurso> [-h]
Ejemplo: http-rc http://tlm101.net.tlm.unavarra.es:8888/index.html
Deberá enviar al servidor la petición:
GET /index.html HTTP/1.0
Host: <nombre_del_host_que_hace_la_peticion>
User-Agent: http-rc
[Línea en blanco]
Mostrará por pantalla:
HTTP/1.0 200 OK
Date: 10/11/2009 16:15:00
Content-Length: 57
Página 3 de 7
Práctica FINAL. Redes de Computadores
Y habrá creado un fichero de texto en local con el nombre
index.html y con el contenido:
<html>
<body>
<h1>Hello World</h1>
</body>
</html>
Página 4 de 7
Práctica FINAL. Redes de Computadores
Protocolo HTTP
El Protocolo de Transferencia de Hipertexto (Hypertext Transfer Protocol) es el protocolo
fundador de la red de extensión mundial (WWW, World Wide Web). A pesar del nombre,
el protocolo no se limita a la transferencia de hipertexto, sino que se utiliza para transmitir
ficheros y otro tipo de datos que pueden ser generados dinámicamente. En realidad es un
protocolo para transmitir información con la eficiencia necesaria para realizar saltos de
hipertexto.
La actual especificación del protocolo HTTP versión 1.1 se encuentra en el RFC 2616
(Request For Comments, documentos de recomendación de especificación de estándares).
El funcionamiento del protocolo obedece al modelo cliente/servidor. El servidor Web
mantiene los ficheros y genera dinámicamente información que se da como respuesta al
cliente (el navegador web, por ejemplo) que solicita alguno de los recursos.
Básicamente, la dinámica del intercambio de mensajes que constituyen una transacción se
resume en el envío por parte del cliente de un mensaje de solicitud, y el servidor responde
con el resultado de la operación y el recurso correspondiente si es el caso.
Para localizar un recurso mediante el protocolo http el cliente utiliza la URL (Universal
Resource
Locator, Localizador Universal de Recurso), que sigue la siguiente sintaxis:
http_URL = "http:" "//" host [ ":" puerto ] [ ubicación-del-recurso ]
ejemplo:
http://www.example.com/index.html
Una vez establecida la conexión, el formato básico de mensaje de solicitud para la versión
HTTP/1.1 tendría la siguiente estructura:
línea-de-solicitud = método SP ubicación-del-recurso SP “HTTP/1.1” CRLF
[cabecera-de-solicitud]
CRLF
donde:
método = “GET” | “HEAD”
CR = <retorno de carro (código ascii 13)>
LF = <salto de línea (código ascii 10)>
SP = <espacio (código ascii 32)>
[cabecera-de-solicitud] : lista de cabeceras con información sobre el
cliente que realiza la solicitud y algunos aspectos como el idioma
Algunos valores de cabecera de petición:
Página 5 de 7
Práctica FINAL. Redes de Computadores
•
•
host = "Host" ":" host [ ":" puerto ] ; nombre del servidor
agente = "User-Agent" ":" 1*( producto | comentarios ) ;
descripción del cliente
Es importante destacar que el servidor sabe que la petición ha finalizado, es decir que no
hay más cabeceras, mediante una línea en blanco (con caracteres CRLF, retorno de carro,
fin de línea). En C se representan mediante \r\n en un string…
Ejemplo solicitud:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: nombre-cliente
[Línea en blanco]
La respuesta del servidor está formada por encabezados (finalizan con una línea en blanco)
seguidos del recurso solicitado, en el caso de una página web:
HTTP/1.1 200 OK
Date: Fri, 31 Dec 2003 23:59:59 GMT
Content-Type: text/html
Content-Length: 1221
<html>
<body>
<h1>Página principal de ejemplo.com</h1>
(Contenido)
.
.
.
</body>
</html>
La primera cabecera comienza por la versión del protocolo utilizado (habitualmente
HTTP/1.1) seguido del código de respuesta. Los códigos de respuesta son códigos
numéricos seguidos de un texto que indican cuál ha sido el resultado de la operación
solicitada. Consta de tres dígitos, indicando el primero el tipo de resultado:
• 1xx: código de información, el proceso continúa.
• 2xx: código de operación realizada con éxito.
• 3xx: código de redirección. Son necesarias acciones adicionales.
• 4xx: código de error en la solicitud del cliente.
• 5xx: código de error en la operación del servidor.
Lo códigos completos más usuales son los siguientes:
• 200 OK : operación realizada con éxito.
• 404 NOT FOUND: el recurso que se solicitó no existe.
• 500 Server Error: hubo un fallo en el servidor al intentar completar la acción
solicitada
Página 6 de 7
Práctica FINAL. Redes de Computadores
Otros valores interesantes de las cabecera de respuesta son:
tipo = “Content-Type:” tipo-de-contenido
longitud = “Content-Length:” longitud-en-bytes
Ejemplos completos
Solicitud de página inicial de www.google.es.
Mensaje de solicitud:
GET / HTTP/1.1
Host: tlm101.tlm.unavarra.es
(Salto de línea)
Mensaje de respuesta:
HTTP/1.1 302 Found
Location: http://www.google.es/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Date: Tue, 10 Nov 2009 16:37:46 GMT
Server: gws
Content-Length: 218
X-XSS-Protection: 0
<HTML><HEAD><meta http-equiv="content-type"
content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.es/">here</A>.
</BODY></HTML>
Bibliografía
•
•
•
“Hypertext Transfer Protocol – HTTP/1.1”, R. Fielding et al., RFC 2616.
“Comunicaciones y Redes de Computadores”, William Stallings, Pearson
Educación SA, séptima edición, Madrid 2004.
“www.w3c.org”, World Wide Web Consortium.
Página 7 de 7
Descargar