La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Clase de Sockets en lenguaje C

Presentaciones similares


Presentación del tema: "Clase de Sockets en lenguaje C"— Transcripción de la presentación:

1 Clase de Sockets en lenguaje C
Prof. Ricardo González

2 Modelo de Programación Cliente-Servidor
Cliente: un programa que envía peticiones. Servidor: un programa que ofrece un servicio que satisface peticiones que provienen de una serie de clientes. La mayoría de servicios de la Internet, tales como la Web, ftp o telnet están basados en el modelo cliente-servidor.

3 Modelo de Programación Cliente-Servidor
Solicitud Conexión Respuesta

4 Modelo de Programación Cliente-Servidor y los Sockets
La mayoría de las comunicación ente procesos siguen el esquema Cliente/Servidor, donde el Cliente y el Servidor son dos procesos independientes que cooperan. El Servidor y el Cliente intercambian mensajes a través de la red usando un API común de Sockets.

5 Modelo de Programación Cliente-Servidor y los Sockets
Ejemplos de programas Web browsers (Navegadores), ftp, telnet, ssh ¿Cómo un cliente encuentra a su Servidor? Mediante una tupla de dos componentes La dirección IP identifica el host o computador El puerto (well-known) identifica el servicio, y de forma implicita al proceso que ofrece dicho servicio. Ejemplos de puerto bien conocidos (well know ports) Puerto 7: Echo server Puerto 23: Telnet server Puerto 25: Mail server Puerto 80: Web server

6 Protocolos de Comunicación
Protocolos Orientados a Conexión

7 Protocolos de Comunicación
Protocolos No Orientados a Conexión

8 Protocolos de Comunicación
TCP Provee una conexión confiable, para transferir bytes entre dos procesos que pueden estar en equipos distitos. UDP Provee una transferencia no fiable de un grupo de bytes entre dos procesos.

9 Sockets Los sockets son un API para la comunicación entre procesos que permiten que un proceso hable ( emita o reciba información ) con otro proceso incluso estando en distintas máquinas. Un socket es al sistema de comunicación entre computadores lo que un buzón o un teléfono es al sistema de comunicación entre personas: un punto de comunicación entre dos agentes ( procesos o personas respectivamente ) por el cual se puede emitir o recibir información. La forma de referenciar un socket por los procesos implicados es mediante un descriptor del mismo tipo que el utilizado para referenciar archivos. Se podrá realizar redirecciones de los archivos de E/S estándar (descriptores 0,1 y 2) a los sockets y así combinar entre ellos aplicaciones de la red. Todo nuevo proceso creado heredará, por tanto, los descriptores de sockets de su padre.

10 Sockets Proceso B Proceso A Compùtador X Compùtador Z Proceso E
Proceso C Proceso G Proceso F Proceso H Proceso I Proceso D

11 Puerto ( dirección, puerto ) Compùtador X Compùtador Z Proceso E
Proceso C Proceso G Proceso F Proceso H Proceso I Proceso D

12 Sockets Los pasos, en general para comunicarse vía sockets son: El servidor crea un socket cuyo nombre conocen otros procesos. Abre una conexión a un puerto bien conocido. Un puerto es un concepto lógico para saber a qué proceso dirigir la petición del cliente. El cliente crea un socket sin nombre y pide una conexión al socket del servidor (con el puerto bien conocido). El servidor acepta la conexión. El cliente y el servidor intercambian información. Cliente Servidor Cliente Conectar a X X X 1) 2) Servidor Servidor Cliente Cliente X 3) 4)

13 Comunicación mediante Socket
Para establecer una comunicación en red debemos conocer: 􀂄 Protocolo de comunicación (TCP o UDP). 􀂄 Dirección del emisor (dirección IP + puerto). 􀂄 Dirección del receptor (dirección IP + puerto).

14 Tipos de Servidores: Seriales
Seriales: reciben la petición y hasta que no terminan con la misma no atienden una nueva petición. for(;;) { listen for client request create a private two-way channel while (no error on communication channel) read request handle request close communication channel } Si el servidor es muy solicitado y las peticiones son largas (transferencia de archivos) los clientes tendrán que esperar para ser atendidos lo cual puede llegar a ocasionar inconvenientes.

15 Tipos de Servidores: Concurrentes
Padre-Hijo: (Servidor concurrente) el hijo maneja la petición del cliente mientras el padre sigue oyendo requerimientos adicionales. for(;;) { listen for client request create a private two-way channel if (!fork) handle the request exit else close the private channel clean up zombies } Servidor Multithreaded: es la estrategia de menor overhead. El servidor crea un thread en su propio espacio de direcciones. Es eficiente cuando las peticiones son pequeñas. El problema es que comparten un único espacio de direcciones y pudiera haber interferencia. Si los threads son CPU bound y no son soportados por el kernel el servidor main thread pudiera no ejecutarse.

16 Tipos de Servidores: Concurrentes
Cliente Servidor X 1) Padre-Hijo: (Servidor concurrente) el hijo maneja la petición del cliente mientras el padre sigue oyendo requerimientos adicionales. for(;;) { listen for client request create a private two-way channel if (!fork) handle the request exit else close the private channel clean up zombies } Servidor Cliente X 2) Cliente Servidor X 3)

17 Esquema general de la comunicación Cliente / Servidor
Create a TCP socket Establish connection Communicate Close the connection Server Create a TCP socket Assign a port to socket Set socket to listen Repeatedly: Accept new connection Communicate Close the connection

18 Esquema general de la comunicación Cliente / Servidor

19 Esquema general de la comunicación Cliente / Servidor

20 Llamadas al sistema asociadas a los Sockets
Include Cualquier programa que emplee socket debe contar con los siguientes include: /usr/include/sys/types.h /usr/include/sys/socket.h Adicionalmente según el dominio empleado se debe contar con los siguientes include Dominio Archivos adicionales a incluir (include) AF_UNIX /usr/include/sys/un.h AF_INET /usr/include/netinet/in.h /usr/include/arpa/inet.h /usr/include/netdb.h

21 Creación de un Socket int socket (int domain, int type, int protocol):
permite crear un socket no nominado y retorna un descriptor de archivo. El socket se liga a un protocolo particular pero no se conecta a nada. Hasta que no está conectado no se puede leer de él o escribir en él. La llamada socket retorna un descriptor de archivo si la llamada ha tenido éxito o -1 si no lo ha tenido. Después que se conecta el socket, el descriptor de archivo puede ser utilizado para leer (read) o escribir (write). Cuando un proceso termina de usar el socket debe cerrarlo para liberar los recursos asociados a él. Como open(), socket retorna un valor que es menor que cero si ocurre un error y un descriptor de archivo que es mayor o igual a cero si tiene éxito. Parámetros: El dominio: indica dónde puede residir el socket del servidor y del cliente. Es el dominio donde las direcciones serán interpretadas. El dominio tiene una familia de protocolos asociada. Un protocolo es un juego de reglas que define la forma en que deben efectuarse las comunicaciones de las redes, incluyendo el formato, la secuencia, tamaño de mensajes, etc.

22 Creación de un Socket int socket (int domain, int type, int protocol):
Parámetros: El dominio: indica dónde puede residir el socket del servidor y del cliente. Es el dominio donde las direcciones serán interpretadas. El dominio tiene una familia de protocolos asociada. Dominio Descripción PF_UNIX Dominio UNIX: el cliente y el servidor deben estar en la misma máquina. PF_INET TCP/IP v4: el cliente y el servidor pueden estar en cualquier lugar en la Internet. PF_APPLETALKAppleTalk DDS AppleTalk DDS

23 Creación de un Socket int socket (int domain, int type, int protocol):
Parámetros: El tipo: Es el tipo de comunicación que puede existir entre el cliente y el servidor. Hay varios tipos pero sólo dos son de interés: SOCK_STREAM: circuito virtual. Garantiza un manejo confiable de los datos en el orden que son enviados. Se envían cadenas de bytes de longitud variable. No se puede enviar datos mientras el circuito no se haya establecido. El circuito permanece intacto hasta que se destruya explícitamente. SOCK_DGRAM: este tipo de conexión se usa para enviar distintos paquetes de información llamados datagramas. No se garantiza que lleguen en orden, no se garantiza siquiera que lleguen. Los mensajes son de longitud fija. No hay conexión privada.

24 Creación de un Socket int socket (int domain, int type, int protocol):
Parámetros: Un protocolo es un juego de reglas que define la forma en que deben efectuarse las comunicaciones de las redes, incluyendo el formato, la secuencia, tamaño de mensajes, etc. El protocolo: está sujeto a las restricciones impuestas por los primeros dos parámetros. Su valor indica la forma de bajo nivel en la que es implementado el socket. Las llamadas al sistema que esperan como parámetro al protocolo acepta el valor 0 para indicar el protocolo correcto, dejando al kernel elegir el protocolo por defecto. Si la familia es PF-INET o AF_INET, TCP es el protocolo orientado a conexión y UDP es el protocolo no orientado a conexión.

25 Rutinas asociadas al servidor: Bind
Asociar un socket a una dirección int bind (int sockfd, struct sockaddr *my_addr, int addrlen): Es como asignar un nombre a un socket. Esta llamada asocia una dirección y un puerto bien conocido al socket identificado por el descriptor de archivo sockfd . Retorna 0 si tiene éxito y -1 si se presenta algún error. sockfd = file descriptor que retorna la llamada a socket struct sockaddr * Las direcciones del dominio UNIX son pathnames del file system. Estas direcciones se pasan a través de la siguiente estructura: struct sockaddr_un { unsigned short sun_family; /* AF_UNIX */ char sun_path[UNIX_PATH_MAX] /* pathname */ }

26 Rutinas asociadas al servidor: Bind
Las direcciones IP empleadas por el dominio INET se cargan en una estructura con el siguiente formato: struct sockaddr_in { short int sin_family; /* AF_INET */ unsigned short int sin_port /* port number */ struct in_addr sin_addr /* IP address */ } El primer elemento indica que es una dirección IP y no el nombre de un archivo. El segundo elemento es el número de puerto. Los puertos son números de 16 bits que identifican unívocamente el punto final de una conexión a un hosts. La combinación de una dirección IP y un número de puerto identifica el punto final de una conexión en cualquier lugar de una red TCP/IP. Aunque los números de puerto van del 0 al 65,535, Linux la divide en dos clases. Los puertos reservados van del 0 al 1024 deben usarlo sólo los procesos o servicios estándares del sistema. El puerto debe ir en el orden correcto de bytes. El número final es la dirección IP de la máquina donde el puerto reside.

27 Direcciones IP v4 Las direcciones IP: cada nodo en una red TCP-IP requiere de una dirección numérica de 4 bytes o 32 bits. Lo más común es escribirla en notación decimal, lo cual se obtiene transformando cada byte a su forma decimal:

28 Direcciones IP v4 Las direcciones IP están asociadas a nombres. Estos nombres se encuentran en una base de datos. A estas BD se accede a través de los servidores de nombres distribuidos por Internet. La base de datos se llama DNS o Domain Name System. El mapping entre nombres y direcciones IP es many to many. Varios sites o servicios pueden usar una misma máquina, por ejemplo el ftp y el web. Pueden tener dos nombres y ftp.some.org y sólo una dirección IP si se ejecutan en una misma máquina. Un router puede tener varias direcciones IP y un solo nombre. Direcciones especiales. local host (el mismo computador donde se esta trabajando) Direcciones que terminan en 0 = una subred Direcciones que terminan en 1= un router.

29 Estableciendo el número máximo de clientes en espera: Listen
int listen(int sockfd, int backlog) Cuando un proceso servidor está dando servicio a un cliente conectado, siempre es posible que otro cliente intente establecer una nueva conexión con el servidor. La llamada al sistema listen permite especificar al proceso servidor el número de conexiones pendientes que deben ser encoladas. Luego de sobrepasar este valor el siguiente cliente que intente conectarse fallaría en su llamada connect. sockfd: file descriptor backlog: cuantas conexiones pueden estar pendientes esperando ser aceptadas. Históricamente se ha colocado el valor de 5, aunque puede colocarse otro valor. Listen retorna 0 si tiene éxito y un valor diferente de 0 si falla.

30 Aceptación de la conexión de un cliente
int accept(int sockfd, struct sockaddr *addr, int addrlen) Una vez que un socket es creado, nominado y el tamaño de la cola de clientes establecido, el paso final es aceptar el requerimiento de conexión de un cliente. Esto lo puede hacer el servidor mediante la llamada accept. El servidor acepta la conexión por un socket. Al llegar a este punto normalmente el servidor detiene su ejecución en espera de que un cliente establezca una conexión. La llamada accept es bloqueante, a menos que se haya especificado no bloqueante en la creación del socket. La llamada al sistema retorna un nuevo socket no nominado, asociado al descriptor de archivo sockfd, que representa al socket que debe usarse para la conexión con el cliente. Este nuevo descriptor hereda los atributos del socket por donde se hizo el listen. Los parámetros addr y addrlen apuntan a datos del cliente que el kernel llena. Al crearse el nuevo socket para el cliente, el socket original puede volver a ser empleado para esperar nuevas conexiones de otros clientes. Accept al igual que open retorna un descriptor de archivo si tiene éxito o un número menor que 0 si ocurre un error. Inicialmente Addrlen debe ser un entero que contiene el tamaño de la estructura addr.

31 Rutinas asociadas al Cliente
Para poder establecer la comunicación vía socket con un servidor, el proceso cliente debe llenar una estructura con dirección del servidor y el puerto, para luego emplear la llamada connect para intentar establecer la conexión con el servidor. int connect (int sockfd, struct sockaddr *seraddr, int addrlen) Si la conexión es exitosa la rutina devuelve el valor 0 y el valor sockfd puede ser empleado como descriptor de archivo para comunicarse con el servidor, mediante las llamadas read y write. Si el socket del servidor no existe o su cola de procesos en espera esta llena, la llamada connect retorna el valor -1, para indicar que la conexión no fue exitosa.

32 Rutinas asociadas al Cliente
int connect (int sockfd, struct sockaddr *seraddr, int addrlen) Los parámetros son el socket del cliente y la dirección a la cuál el cliente se desea conectar pasada a través de la estructura seraddr. Si el socket pertenece al dominio AF_UNIX, el parámetro es un apuntador a una estructura sockaddr_un, en este caso se le debe hacer un cast a sockaddr*, para ser pasado como seraddr. Si el socket pertenece al dominio AF_INET, el parámetro es un apuntador a una estructura sockaddr_in, en este caso se le debe hacer un cast a sockaddr*, para ser pasado como seraddr. El parámetro addrLen debe ser igual al tamaño de la estructura referenciada por sockaddr.

33 Otras Rutinas asociadas a la comunicación de datos
Orden de los bytes Las redes TCP-IP son heterogéneas e incluyen una gran variedad de máquinas y arquitecturas. Una de las diferencias más comunes en las arquitecturas es cómo almacenan los números. Big endian carga el byte más significativo en la dirección más baja y little endian hace justo lo contrario. TPC/IP adopta big-endian para transmitir datos o información del mismo protocolo y sugiere también que se le aplique a los datos. Este orden se conoce como network byte order. Existen una serie de funciones para convertir del orden en el cual son trabajados los números en el computador que ejecuta el código (host) al orden de la red (network) y viceversa.

34 Otras Rutinas asociadas a la comunicación de datos
Todos los valores almacenado en sockaddr_in deben estar en network byte order. sin_port El número del puerto TCP/IP. sin_addr La dirección IP. unsigned int htonl (unsigned int hostlong) Host to network long convierte un entero largo (32 bits), que esta originalmente en el formato de la máquina local, al formato de red. unsigned short htons (unsigned short hostshort) Host to network short convierte un entero corto (16 bits), que esta originalmente en el formato de la maquina local, al formato de red. unsigned int ntohl (unsigned int netlong) Network to host long convierte un entero largo (32 bits), que esta originalmente en el formato de red, al formato de la maquina local unsigned int ntohs (unsigned short netshort) Network to host short convierte un entero corto (16 bits), que esta originalmente en el formato de red, al formato de la maquina local Estas rutinas trabajan con cantidades con signo y sin signo. Aunque se usa el término long las rutinas esperan cantidades de 32 bits.

35 Manejo de las direcciones IP
char * inet_ntoa(struct in_addr address) Toma una estructura del tipo in_addr que contiene la dirección IP binaria (32 bits) y retorna un string conteniendo la dirección en formato decimal (A.B.C.D). int inet_aton(const char *daddress, struct in_addr *address) Espera un string que contiene la dirección IP en decimal y llena la estructura address con la representación binaria. Retorna 0 si ocurre un error y non-zero si la conversión fue exitosa. unsigned long inet_addr(char* dirip) A partir de la variable dirip que contiene la dirección IP de un computador en el formato A.B.C.D retorna la direccion IP en un formato de 32 bits, que está en network-byte order.

36 Manejo de las direcciones IP
Nombres de hosts Para manejar la complejidad del mapping entre direcciones IP y nombres se definen la siguiente estructura: struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; } char *h_name: nombre oficial del host. char **h_aliases: alias para el host int h_addrtype: tipo de dirección (AF_INET en Ipv6 se verán otros tipos de direcciones) int h_length: longitud de la dirección binaria sizeof (struct in_addr) char **h_addr_list: arreglo con direcciones de este host. Cada posición del arreglo apunta a algo del tipo struct in_addr.

37 Manejo de las direcciones IP
Dos funciones de librería convierten entre números IP y hostnames. Gethostbyname: retorna un struct hostent para un hostname que contiene la dirección IP de la máquina especificada en el parámetro name. Gethostbyaddr: retorna información sobre una máquina con una dirección IP en particular. Struct hostent *gethostbyname(const char *name); Struct hostent *gethostbyaddr(const char *addr, int len, int type): el primer parámetro debería apuntar a un struct in_addr. El parámetro len es la longitud de la estructura y type especifica el tipo de dirección. Cuando ocurren errores buscando un nombre de host se establece el valor de la variable h_errno. Se usa entonces herror() que imprime la descripción de error. Retornan un apuntador a una estructura que puede sobreescribirse cuando se vuelva a llamar a la función. El programa debería salvar valores que vaya a necesitar después.

38 Manejo de las direcciones IP
La dirección del host donde se ejecuta el programa se puede obtener mediante la rutina gethostname. int gethostname (char* name, int nameLen); Esta rutina llena el arreglo de caracteres apuntado por name, de longitud nameLen con un string terminado en null que contienen la dirección del host local donde se ejecuta el programa.

39 Programa de Ejemplo

40 Protocolo HTTP 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... Propuesto por Tim Berners-Lee en 1989 HTTP es el protocolo utilizado para intercambio de información entre clientes Web (ej. Mozilla Firefox) y servidores HTTP (ej. Apache) Conexión TCP puerto 80 que escucha pasivamente. Actualmente versión HTTP/1.1 HTTP/1.0 ver RFC 1945 y HTTP/1.1 ver RFC 2616 Más información:

41 HTTP - HyperText Transfer Protocol
Normalmente HTTP utiliza a TCP como medio de transporte. 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.

42 Web y HTTP Algunos términos Una página Web consta de objetos
Los objetos pueden ser un archivo HTML, una imagen JPEG, un applet Java, un archivo de audio,… Una página Web consta de un archivo HTML base que incluye diversos objetos referenciados Cada objeto se direcciona con un URL Ejemplo de un URL: Protocolo Nombre del host Nombre del path

43 Panorámica de HTTP HTTP: Protocolo de Transferencia de HiperTexto
Es el protocolo de la capa de aplicación para el Web Usa el modelo cliente/servidor Cliente: browser o navegador que solicita, recibe y muestra los objetos Web Servidor: Servidor www que envía objetos en respuesta a las solicitudes del browser HTTP 1.0: RFC 1945 HTTP 1.1: RFC 2068 Solicitud HTTP PC ejecutando IE Explorer Respuesta HTTP Solicitud HTTP Servidor ejecutando El servidor Web Apache Respuesta HTTP Mac ejecutando Netscape Navigator

44 Panorámica de HTTP (continuación)
Utiliza TCP: El cliente inicia la conexión TCP (crea el socket) al servidor, puerto 80 El servidor acepta la conexión TCP solicitada por cliente Los mensajes HTTP (mensajes del protocolo de la capa de aplicación) se intercambian entre el browser (cliente HTTP) y el servidor Web (servidor HTTP) Se cierra la conexión TCP HTTP es “stateless” El servidor no mantiene información sobre las solicitudes anteriores del cliente

45 Funcionamiento de HTTP
1. El cliente realiza una petición o apertura activa (request) al servidor (puerto 80, por defecto) 2. Solicita la transacción (request) con HTTP: GET, POST, HEAD, PUT, … 3. El servidor envía la respuesta (response) en HTML 4. Se cierra la conexión (en HTTP/1.0)

46 Ejemplo de transacción HTTP
El navegador solicita recurso Se determina el URL Se resuelve la IP (DNS) Se establece conexión TCP con puerto 80 de la IP destino Se transmite el método GET <URI> <protocolo> (/archivo.html HTTP/1.1) El servidor responde (según extensiones MIME y RFCs) Se cierra la conexión (HTTP 1.0) Se presenta el recurso en el “navegador” Uniform Resource Identifier (URI) es una cadena de caracteres usada para identificar o nombrar un recurso en la Internet.

47 Mensajes HTTP Dos tipos de mensajes usando ASCII (texto plano):
Request (Solicitud) Response (Respuesta) Solicitudes HTTP/1.0

48 Mensajes HTTP Respuestas HTTP/1.0

49 Mensajes HTTP Ejemplo real de mensajes HTTP

50 Mensajes HTTP Códigos de estado:
Identificador del estado de la petición. Los envía el servidor web como respuesta. Entero de 3 dígitos: 1xx: Informativos. 2xx: Operación realizada con éxito. 3xx: Redireccionan al cliente a otra URL. 4xx: Error del cliente. 5xx: Error del servidor. Los más usuales: 200 OK: solicitud exitosa, la respuesta va en el cuerpo. 404 Not Found: el recursos no existe. 303 See Other: el recurso se ha movido a otra URL (ver Header Location). 500 Server Error: error interno del servidor.

51 Mensajes HTTP Métodos:
Operaciones que se pueden solicitar a un servidor. Existen 3 métodos distintos: GET: Se utiliza para recoger cualquier tipo de información del servidor. Esta información va en el cuerpo de la respuesta. HEAD: Solicita información sobre un objeto (fichero). Es igual que GET, pero la información va contenida en la cabecera de la respuesta. NUNCA TIENEN CUERPO. POST: Se utiliza para enviar información al servidor, por ejemplo los datos contenidos en un formulario.

52 HTTP / 1.1 El protocolo HTTP/1.1 es ligeramente diferente a su precedente: Conexiones persistentes vs no-persistentes. Posibilidad de cerrar la conexión cuando se desee. Nuevos métodos como PUT, DELETE, OPTIONS. Nuevas cabeceras.

53 Conexiones HTTP HTTP persistente
Multiples objetos pueden ser enviados sobre una misma conexión TCP entre el cliente y el servidor. HTTP/1.1, por omisión, utiliza conexiones persistentes HTTP no persistente Al menos un objeto es enviado sobre una conexión TCP. HTTP/1.0 utiliza HTTP no persistente

54 HTTP No persistente (contiene texto, referencia a 10 imágenes jpeg) Supongamos que el usuario ingresa el URL 1a. El cliente HTTP inicia la conexión TCPal servidor HTTP (el proceso) en en el puerto 80 1b. El servidor HTTP en el host espera conexiones TCP en el puerto 80. Cuando “acepta” una conexión, notifica al cliente 2. El cliente HTTP envía un request message (que contiene el URL) hacia su socket de conexión TCP. El mensaje indica que el cliente desea el objeto algunaFacultad/index.html 3. El servidor HTTP recibe el mensaje de solicitud, construye un response message que contiene el objeto solicitado, y envía el mensaje hacia su socket tiempo

55 HTTP No persistente (cont.)
4. El servidor HTTP cierra la conexión TCP. 5. El cliente HTTP recibe el mensaje de repuesta que contiene el archivo html, muestra el html. Al recorrer el archivo html encuentra 10 objetos jpeg referenciados tiempo 6. Los pasos 1 a 5 se repiten para cada uno de los 10 objetos jpeg

56 Modelado del tiempo de respuesta
Definición de RRT: tiempo para enviar un pequeño paquete y que este viaje desde el cliente hasta el servidor y que regrese. Tiempo de respuesta: Un RTT para iniciar la conexión TCP Un RTT para la solicitud HTTP y para que los primeros bytes de la respuesta HTTP regresen Tiempo de transmisión del archivo tiempo para transmitir archivo Inicia Conexión TCP RTT solicita recibido tiempo total = 2RTT+tiempo de transmisión

57 HTTP Persistente Aspectos de HTTP No persistente:
requiere 2 RTTs por objeto El OS debe trabajar y asignar los recursos del host para cada conexión TCP En ocasiones un browser abre conexiones TCP paralelas para traer los objetos referenciados HTTP persistente El servidor deja la conexión abierta después de enviar el mensaje de respuesta Los mensajes HTTP que siguen entre el cliente/servidor son enviados sobre la misma conexión TCP Persistencia sin pipelining: El cliente emite una nueva solictud sólo cuando la respuesta anterior ha sido recibida Se requiere un RTT para cada objeto referenciado Persistencia con pipelining: Por omisión en HTTP/1.1 El cliente envía una solicitud tan pronto como encuentra un objeto referenciado Se requiere apenas como un RTT para TODOS los objetos referenciados

58 Mensaje de solicitud HTTP
HTTP tiene dos tipos de mensajes: request, response Mensaje de solicitud: ASCII (formato legible para nosotros) Línea de solicitud (comandos GET, POST, HEAD) GET /algundir/pagina.html HTTP/1.1 Host: User-agent: Mozilla/4.0 Connection: close Accept-language:fr (“carriage return, line feed” adicional) Líneas de encabezado “Carriage return, line feed” Indica el final del mensaje

59 Mensaje de solicitud HTTP: formato general

60 Enviando datos al servidor desde un formulario HTML
Usando el método POST: Las páginas web incluyen a menudo formularios para ingresar datos Los datos ingresados en el formulario son “subidos” o enviados al servidor a través del cuerpo del mensaje (Entity Body) Usando el URL: Utiliza el método GET Los datos ingresados son enviados en el campo del URL de la línea de solicitud

61 Tipos de métodos HTTP/1.0 GET POST HEAD HTTP/1.1 GET, POST, HEAD PUT
Hace una consulta al servidor sobre las características del objeto, pero no transfiere el objeto HTTP/1.1 GET, POST, HEAD PUT Envía un archivo en el cuerpo del mensaje al path especificado en el URL DELETE Borra el archivo especificado en el URL

62 Mensaje de respuesta de HTTP
Línea de estado (código de estado del Protocolo, frase de estado) HTTP/ OK Connection close Date: Thu, 06 Aug :00:15 GMT Server: Apache/1.3.0 (Unix) Last-Modified: Mon, 22 Jun 1998 …... Content-Length: 6821 Content-Type: text/html datos datos datos datos datos ... Líneas de encabezado datos, es decir, archivo HTML solicitado

63 Códigos de estado de HTTP
Se usan en la primera línea del mensaje de respuesta del servidor->cliente. Ejemplos: 200 OK Solicitud exitosa, el objeto solicitado va en este mensaje 301 Moved Permanently El objeto solicitado fue movido, la nueva ubicación se especifica posteriormente en este mensaje (Location:) 400 Bad Request El mensaje de solicitud no fue entendido por el servidor 404 Not Found El documento solicitado no se encontró en este servidor 505 HTTP Version Not Supported

64 Conexión HTTP (cliente) hecha “a mano”
1. Conéctese, a través de telnet al puerto 80, a su sitio Web favorito telnet 80 Abre una conexión TCP al puerto 80 (puerto “bien conocido” de HTTP) en Cualquier cosa que se digite será enviada Al puerto 80 en 2. Digite una solicitud de HTTP con el método GET: Al digitar esto (y oprimir <ENTER> dos veces), se enviará esta solicitud HTTP mínima (pero completa) al servidor HTTP GET /index.html HTTP/1.0 3. ¡Observe el mensaje de respuesta enviado por el servidor HTTP!

65 HTTP Proxy Un proxy es un programa o dispositivo que realiza un acción en representación de otro. Request Servidor Web Cliente Replay Request HTTP Proxy Request Servidor Web Cliente Replay Replay

66

67


Descargar ppt "Clase de Sockets en lenguaje C"

Presentaciones similares


Anuncios Google