Slides de la clase - UTN

Anuncio
HyperText Transfer Protocol
Ing. Carlos A. Barcenilla
c.a.barcenilla@ieee.org
Basado en HTTP Made Really Easy
http://www.jmarshall.com/easy/http/
1
¿Qué es HTTP?
HTTP significa Hypertext Transfer Protocol.
Es el protocolo de red que se utiliza para transferir los
archivos (llamados recursos) que forman parte de la
World Wide Web. Ya sean estos archivos HTML,
imágenes, sonidos, etc...
Normalmente HTTP utiliza a TCP como medio de
transporte.
2
¿Qué son los Recursos?
HTTP se utiliza para transferir Recursos, no solo archivos.
Un recurso es un trozo de información que puede
identificarse a través de un URL.
La clase más común de recursos son los archivos, pero
también pueden ser datos generados dinámicamente.
3
Estructura de las Transacciones HTTP
HTTP utiliza el modelo cliente/servidor.
Un cliente HTTP abre una conexión hacia un servidor
HTTP y envía un mensaje de petición (request message),
luego el servidor envía un mensaje de respuesta
(response message) el cual contiene el recurso que se
solicitado.
Luego de enviar la respuesta el servidor cierra la
conexión.
Por ende el protocolo no mantiene estado (stateless)
entre las distintas transacciones de un mismo cliente.
4
Mensajes HTTP
Los mensajes HTTP pueden ser:
Solicitudes
Respuestas
Tanto las solicitudes como las respuestas utilizan el
formato genérico de e-mails (RFC-822)
Ambos tipos de mensajes consisten de
Una línea inicial
Cero o más encabezados (headers)
Una línea en blanco
Un cuerpo del mensaje (opcional, ej. archivo, datos de una
consulta).
5
Mensajes HTTP
Resumiendo el formato de un mensaje HTTP es:
<línea inicial, distinta para solicitudes y respuestas>
Encabezado1: valor1
Encabezado2: valor2
…<más encabezados>…
Encabezado N: valor N
<línea en blanco>
<cuerpo de mensaje opcional, contenidos de un archivo,
de una consulta, datos binarios, etc>
6
Mensajes HTTP: Línea inicial (Solicitud)
La línea inicial de una solicitud tiene tres partes separadas
entre sí por un espacio.
El método (GET, PUT, POST, OPTIONS, TRACE, DELETE,...)
El identificador del recurso (URI).
La versión del protocolo HTTP en uso.
Ejemplos:
GET /directorio1/directorio2/index.html HTTP/1.0
GET / HTTP/1.1
7
Mensajes HTTP: Línea inicial (Respuesta)
La línea inicial de una respuesta (llamada línea de estado)
tiene tres partes separadas entre sí por un espacio.
Versión de HTTP
Código de estado
Frase explicativa (legible por humanos)
Ejemplos:
HTTP/1.0 200 OK
HTTP/1.0 404 Not Found
8
Mensajes HTTP: Códigos de estado
El código de estado es un entero de 3 dígitos.
1xx:
2xx:
3xx:
4xx:
5xx:
Informativos
Éxito
Redirección
Error de cliente
Error de servidor
Los más comunes:
200 OK
Solicitud exitosa, la respuesta se envía en el cuerpo.
404 Not Found
El recurso no existe.
303 See Other
El recurso se ha movido a otra URL (Dada en el header Location)
500 Server Error
Error no esperado en el servidor.
9
Líneas de encabezado
Estas líneas proveen información acerca de la solicitud o
respuesta.
Cada línea de encabezado consiste de un nombre de
campo seguido por un carácter dos puntos “:” y el valor
para ese campo.
El orden de los campos no es importante.
Ejemplos:
User-Agent: Mozilla/6.0
From: juan@perez.com
Content-Type: text/html
10
Líneas de encabezado
HTTP 1.0 define 16 headers (ninguno es obligatorio).
HTTP 1.1 define 46 headers (solo Host: es obligatorio).
En las solicitudes suelen incluirse los siguientes:
User-Agent: (Identifica al software del cliente y la versión).
From: (La dirección de e-mail de quien envía la solicitud).
En las respuestas algunos encabezados comunes son:
Server: (análogo a User-Agent:, ej. Server: Apache/1.3.14).
Last-Modified: (fecha de última modificación del recurso, se utiliza
para mantener actualizados los cachés, ej. Last-Modified: Fri, 31
Jan 2000 12:12:12 GMT)
11
Cuerpo del mensaje
Luego de las líneas de encabezado un mensaje HTTP
puede contener un cuerpo (body).
En las respuestas el cuerpo es la sección en donde se
envía el recurso solicitado.
En las solicitudes el cuerpo se utiliza para subir datos que
ingresó el usuario o para transferir archivos hacia el
servidor.
Las líneas de encabezado más comunes que definen el
cuerpo son:
Content-Type: (Da el tipo MIME de los datos del cuerpo, ejemplo:
text/html image/gif).
Content-Lenght: (Especifica el número de bytes en el cuerpo).
12
Ejemplo de sesión HTTP
El cliente desea obtener
http://www.ieee.org/numero/uno.html
El cliente establece una conexión TCP al puerto 80 de
www.ieee.org y envía la solicitud con el método GET.
GET /numero/uno.html HTTP/1.0
User-Agent: MiBrowser/2.0
[línea en blanco]
El server responde por la misma conexión con:
HTTP/1.0 200 OK
Date: Sat, 18 Nov 2000 15:18:02 GMT
Content-Type: text/html
Content-Lenght: 52
[línea en blanco]
<html><body>
<h1>Mi Archivo HTML</h1>
</body></html>
13
El método HEAD
Una solicitud con el método HEAD es similar al
GET con la diferencia que en este caso la
respuesta solo contiene los encabezados y no el
cuerpo.
Es útil para verificar las características de un
recurso sin necesidad de transferirlo.
Las respuestas a métodos HEAD nunca contienen
cuerpo.
14
El método POST
Una solicitud POST se utiliza para enviar datos al
servidor (por ejemplo para enviar un formulario).
El método POST se diferencia del GET pues
Hay un bloque de datos que se envía con la solicitud
(en el cuerpo de la misma).
Hay normalmente headers que describen el cuerpo que
se envía (ej. Content-Type y Content-Lenght).
El URI que se solicita no es un recurso sino
normalmente un script al que se le envían los datos.
La respuesta HTTP normalmente es generada
dinámicamente.
15
El método POST (Ejemplo)
El método POST se usa comunmente para enviar un
formulario HTML a un script que se ejecuta en el servidor.
En este caso Content-Type toma el valor
application/x-www-form-urlencoded y Content-Lenght
indica su longitud.
Ejemplo (enviar las variables nombre=Juan y
Apellido=Perez):
POST /directorio/script.cgi HTTP/1.0
User-Agent: TuBrowser/1.7
Content-Type: application/x-www-form-urlencoded
Content-Length: 26
nombre=Juan&Apellido=Perez
16
HTTP 1.1
HTTP 1.1 fue definido para atacar nuevas necesidades y
solucionar problemas de HTTP 1.0. Las mejoras incluyen:
Respuesta más veloz (permite que en una sola
conexión se realicen varias transacciones
solicitud/respuesta).
Ahorro de ancho de banda a través del uso de caché.
Respuesta más rápida para páginas generadas
automáticamente, permite que una respuesta se envíe
aún cuando no se sepa su longitud total (chunked
response).
Uso eficiente de las direcciones IP (permite servidores
virtuales basados en nombres).
17
HTTP 1.1: Clientes
Para cumplir con HTTP 1.1 los clientes deben:
Incluir el encabezado Host: en cada solicitud.
Aceptar respuestas en modo chunk.
Soportar conexiones persistentes o incluir el
encabezado “Connection: close” en cada solicitud.
Ser capaces de manejar la respuesta “100 Continue”.
18
HTTP 1.1: Encabezado “Host”
A partir de HTTP 1.1 un server en una dirección IP puede
manejar múltiples sitios webs virtuales.
Para que ello sea posible cada solicitud debe incluir el
encabezado “Host”.
Ejemplo:
GET /directorio/archivo.html HTTP/1.1
Host: www.sitio.com
[línea en blanco]
Host es el único encabezado obligatorio en una solicitud
HTTP 1.1.
19
HTTP 1.1: Chunked Transfer-Encoding
Si un servidor desea comenzar a enviar la respuesta antes
de conocer su longitud total puede hacerlo incluyendo el
encabezado Transfer-Encoding: chunked.
El cuerpo de un mensaje con esta codificación contiene
una serie de trozos (chunks) seguidos con una línea con
un “0” (cero), seguido de una serie de footers (iguales a
los headers).
Cada trozo contiene dos partes:
Una línea con el tamaño de ese trozo (en hexadecimal).
Los datos en si mismos (al final se agrega CRLF).
20
HTTP 1.1: Chunked Transfer-Encoding
Ejemplo:
HTTP/1.1 200 OK
Date: Sat, 18 Nov 2000 13:29:14 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
1b; ignorar lo que va luego del punto y coma
Este es un ejemplo de trans
12
ferencia en trozos
0
Footer1: valor1
Footer2: valor2
[línea en blanco]
21
HTTP 1.1: Chunked Transfer-Encoding
El ejemplo anterior equivale a:
HTTP/1.1 200 OK
Date: Sat, 18 Nov 2000 13:29:14 GMT
Content-Type: text/plain
Content-Length: 45
Footer1: valor1
Footer2: valor2
Este es un ejemplo de transferencia en trozos
22
HTTP 1.1: Conexiones Persistentes
En HTTP 1.1 las conexiones son persistentes por
defecto, esto significa que luego de una
transacción el servidor no cierra la conexión sino
que espera otra solicitud.
El cliente puede incluir el encabezado
“Connection: close” en una solicitud para indicar
que se luego de enviar la respuesta el servidor
debe cerrar la conexión.
Un cliente que no soporta conexiones
persistentes debe incluir siempre el encabezado
“Connection: close”.
23
HTTP 1.1: El encabezado “Date”
Para implementar cachés HTTP es necesario
registrar las fechas y horas de
creación/modificación de los recursos
(timestamps).
Para ello se incluye el encabezado “Date”. Los
servers deben incluir la fecha y hora actual
utilizando este encabezado.
Ejemplo:
Date: Sun, 19 Nov 2000 19:39:22 GMT
24
HTTP 1.1: If-(un)modified-since
Para ahorrar ancho de banda, HTTP 1.1 define los
encabezados “If-Modified-Since” y “If-Unmodified-Since”.
If-Modified-Since
Indica que solo se debe enviar el recurso solicitado si ha
cambiado luego de la fecha especificada. Se utiliza con el método
GET. Si no ha cambiado el servidor responde con “304 Not
Modified”.
Ejemplo: If-Modified-Since: Sun, 12 Dec 1999 21:59:59 GMT
If-Unmodified-Since
Indica que solo se debe enviar el recurso solicitado si éste no ha
cambiado luego de la fecha especificada. Puede usarse con
cualquier método. Si el recurso ha cambiado el servidor responde
con “412 Precondition Failed”.
Ejemplo: If-Unmodified-Since: Sun, 12 Dec 1999 21:59:59 GMT
25
Ejemplo
GET /Xasx/tnt/private.htm HTTP/1.1
Accept: */*
Accept-Language: es-ar
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
Host: ultimateanarchy.com
Connection: Keep-Alive
HTTP/1.1 200 OK
Date: Sat, 18 Nov 2000 20:41:27 GMT
Server: Apache/1.3.12 (Unix) mod_bwlimited/0.5 PHP/4.0.2 mod_perl/1.24
mod_log_bytes/0.2 mod_frontpage/3.0.4.3 mod_ssl/2.6.6 OpenSSL/0.9.5a
Last-Modified: Sat, 18 Nov 2000 16:36:33 GMT
ETag: "22ff8-53e-3a16b011"
Accept-Ranges: bytes
Content-Length: 1342
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html
<form method=post action="http://www.ezgreen.com/_cgi/subscriber.cgi">
.........................................................................................................................
</form>
26
Ejemplo
GET /estilos/estilos.css HTTP/1.1
Accept: */*
Referer: http://www.datosenlaweb.com/
Accept-Language: es-ar
Accept-Encoding: gzip, deflate
If-Modified-Since: Mon, 25 Sep 2000 19:49:47 GMT
If-None-Match: "8f010-5ba-39cfac5b"
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
Host: www.datosenlaweb.com
Connection: Keep-Alive
Cookie: PHPSESSID=1191dab4f547c4a02a85143a4c918fd6
HTTP/1.1 304 Not Modified
Date: Sat, 18 Nov 2000 19:42:20 GMT
Server: Apache/1.3.12 Ben-SSL/1.40 (Unix) PHP/3.0.15
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100
ETag: "8f010-5ba-39cfac5b"
27
Ejemplo
GET /server/ad/DatosenelWeb/ROS/974579848720? HTTP/1.1
Accept: */*
Referer:
http://ads.clickexperts.net/hserver/SITE=DEW/AREA=TEI.NOT.UNIV.PROE/D
EW=HOME/LANG=ES/EI=3/ES=4/POS=T/AAMSZ=FULL
Accept-Language: es-ar
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
Host: ad-adex3.flycast.com
Connection: Keep-Alive
Cookie: atf=1_2521127420
HTTP/1.0 302 Moved Temporarily
Server: DWExtension
Location: http://crs.clickexperts.net/sites/dew/data54.gif
Ad-Reach: EngageMedia
28
Ejemplo
GET / HTTP/1.1
Accept: application/vnd.ms-excel, application/msword, image/gif, image/x-xbitmap,
image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, */*
Accept-Language: es-ar
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
Host: www.datosenlaweb.com
Connection: Keep-Alive
HTTP/1.1 200 OK
Date: Sat, 18 Nov 2000 19:42:18 GMT
Server: Apache/1.3.12 Ben-SSL/1.40 (Unix) PHP/3.0.15
X-Powered-By: PHP/3.0.15
Set-Cookie: PHPSESSID=1191dab4f547c4a02a85143a4c918fd6
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html
ecd
<HTML><HEAD........................................................................................ </td>
ffb
<form .................</html>
0
29
Ejemplo
HEAD / HTTP/1.0
HTTP/1.0 302 Found
Content-Length: 155
Connection: Close
Server: GWS/2.0
Content-Type: text/html
Date: Mon, 07 Oct 2002 14:04:01 GMT
Location: http://www.google.com.ar/
Set-Cookie:
PREF=ID=66e653d35b020a90:TM=1033999441:LM=1033999441:S=
bGZmIPqKlM23W25B; expires=Sun, 17-Jan-2038 19:14:07 GMT;
path=/; domain=.google.com
30
Ejemplo (Request)
GET /docs/php/buscador.php3 HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, application/msword,
*/*
Accept-Language: es-ar
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: sg.rec.utn.edu.ar
Connection: Keep-Alive
31
Ejemplo (Response)
HTTP/1.1 200 OK
Date: Mon, 07 Oct 2002 14:26:49 GMT
Server: Apache/1.3.23 (Unix) (Red-Hat/Linux) mod_ssl/2.8.7 OpenSSL/0.9.6b
DAV/1.0.3 PHP/4.1.2 mod_perl/1.26
X-Powered-By: PHP/4.1.2
Set-Cookie: PHPSESSID=35bf915272e201ec63e2adfbbd9322f4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html
e0b
<html><head>…….. ……………..</
19a
table><hr size="1">………………….</
19
center></body></html>
0
32
Ejemplo
GET /docs/images/logohpgif.gif HTTP/1.1
Accept: */*
Referer: http://sg.rec.utn.edu.ar/docs/php/buscador.php3
Accept-Language: es-ar
Accept-Encoding: gzip, deflate
If-Modified-Since: Tue, 18 Jun 2002 20:21:04 GMT
If-None-Match: "7e5a-a5d-3d0f9630"
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: sg.rec.utn.edu.ar
Connection: Keep-Alive
Cookie: PHPSESSID=35bf915272e201ec63e2adfbbd9322f4
HTTP/1.1 304 Not Modified
Date: Mon, 07 Oct 2002 14:26:51 GMT
Server: Apache/1.3.23 (Unix) (Red-Hat/Linux) mod_ssl/2.8.7 OpenSSL/0.9.6b DAV/1.0.3
PHP/4.1.2 mod_perl/1.26
Connection: close
ETag: "7e5a-a5d-3d0f9630"
33
Ejemplo (Request)
GET /docs/php/login.php3?PHPSESSID=35bf915272e201ec63e2adfbbd9322f4
HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/vnd.ms-excel, application/vnd.ms-powerpoint,
application/msword, */*
Referer: http://sg.rec.utn.edu.ar/docs/php/buscador.php3
Accept-Language: es-ar
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: sg.rec.utn.edu.ar
Connection: Keep-Alive
Cookie: PHPSESSID=35bf915272e201ec63e2adfbbd9322f4
34
Ejemplo (Response)
HTTP/1.1 200 OK
Date: Mon, 07 Oct 2002 14:26:55 GMT
Server: Apache/1.3.23 (Unix) (Red-Hat/Linux) mod_ssl/2.8.7 OpenSSL/0.9.6b
DAV/1.0.3 PHP/4.1.2 mod_perl/1.26
X-Powered-By: PHP/4.1.2
Pragma: no-cache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html
921
<html><head>……</html>
0
35
Descargar