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