La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Departamento de Arquitectura y Tecnología de Computadores E.T.S. Ingeniería Informática Lección 2. La API de Sockets Julio Ortega Lopera. Curso 2004/2005.

Presentaciones similares


Presentación del tema: "Departamento de Arquitectura y Tecnología de Computadores E.T.S. Ingeniería Informática Lección 2. La API de Sockets Julio Ortega Lopera. Curso 2004/2005."— Transcripción de la presentación:

1 Departamento de Arquitectura y Tecnología de Computadores E.T.S. Ingeniería Informática Lección 2. La API de Sockets Julio Ortega Lopera. Curso 2004/2005 REDES DE ALTAS PRESTACIONES Y SUS APLICACIONES

2 INTRODUCCIÓN Los procesos UNIX pueden comunicarse. Si se dispone de una infraestructura de comunicaciones es posible la comunicación entre procesos UNIX en diferentes máquinas. Una posible infraestructura de comunicación puede ser una red TCP/IP sustentada sobre cualquier tecnología de red local, red de área amplia, o combinación de ambas. Se precisa una interfaz de programación de aplicaciones. Dos interfaces de programación de aplicaciones basadas en TCP/IP son los Sockets (UNIX de Berkeley, BSD), y TLI (Transport Level Interface, heredada de UNIX System V) Curso de Doctorado RAPyA (2004/05)

3 Aplicaciones Usuario Núcleo TCP/UDP IP PLIPSLIP Ethernet ARP API Sockets Capa de Transporte Capa de Red Capa de Enlace Sockets INET Sockets BSD Linux implementa los protocolos del conjunto TCP/IP. El acceso a los servicios de red se suele realizare a través de los sockets (es la interfaz entre entre el kernel y la capa de aplicación en las funciones de programación de red) Los sockets BSD son una interfaz de programación abstracta que se implementa sobre la capa de sockets INET, y ésta, a su vez, sobre la capa de transporte TCP/UDP (interfaz entre la capa de transporte TCP/IP y los protocolos que se definan por encima de ésta. Curso de Doctorado RAPyA (2004/05) SOCKETS SOBRE TCP/IP

4 COMUNICACIÓN MEDIANTE SOCKETS (I) La interfaz de Sockets es una interfaz de programación de aplicaciones (API) que permite la comunicación entre procesos en máquinas distintas a través de TCP/IP. Apareció dentro de la versión BSD de UNIX pero está disponible en otros UNIX (Linux) e incluso en los sistemas Windows de Microsoft (API Windows Sockets). Los sockets permiten la comunicación bidireccional, la gestión de las conexiones TCP y el control y ajuste de la pila TCP/IP. Son genéricos: pueden trabajar con otros protocolos distintos de la fanilia TCP/IP: Al definir un socket se puede distinguir entre dominios de comunicación (familia de protocolos utilizadas para intercambiar los datos), y familias de direcciones. Cada proceso, para comunicarse tiene un socket o conector, y cada conector está ligado a una dirección: un proceso puede enviar información a través de un socket propio al socket de otro proceso siempre que conozca la dirección del otro socket. La comunicación se realiza siempre entre una pareja de sockets gracias a una infraestructura de comunicaciones preexistente (constituida por dispositivos hardware y protocolos de comunicación implementados en software). Curso de Doctorado RAPyA (2004/05)

5 Un proceso puede crear un socket utilizando la función socket() #include int socket (int domain, int type, int protocol); Donde: domain = {PF_UNIX, PF_INET}; type = {SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_SEQPACKET}; SOCK_RAW = Sólo protocolos con privilegios de root para acceder directamente a la interfaz de red SOCK_SEQPACKET = Comunicación con datagramas fiable Protocol = Tipo de Protocolo. Si es 0 indica el protocolo por omisión (TCP para comunicación por omisión y UDP para comunicación con datagramas) Curso de Doctorado RAPyA (2004/05) COMUNICACIÓN MEDIANTE SOCKETS (II)

6 COMUNICACIÓN MEDIANTE SOCKETS (III) Dominios: Dominio UNIX (PF_UNIX): Comunicación de procesos en la misma máquina Dominio Internet (PF_INET): Comunicación entre computadores conectados mediante (TCP-UDP/IP) Direcciones Formato UNIX (AF_UNIX): Una dirección de socket es como un nombre de fichero Formato Internet (AF_INET): Una dirección de socket tiene tres campos -Dirección de red de la máquina (IP) -Protocolo TCP o UDP -Puerto correspondiente a TCP o UDP Estilo de Comunicación (comunicación con conexión o sin conexión): SOCK_STREAM (la comunicación pasa por las fases de apertura de conexión, intercambio de datos y cierre de conexión, el intercambio es fiable y orientado a octetos). Es como los pipes SOCK_DGRAM (no hay conexión, cada mensaje es autocontenido y no hay garantía de entrega). Curso de Doctorado RAPyA (2004/05)

7 COMUNICACIÓN MEDIANTE SOCKETS (IV) La API que definen los sockets tiene dos partes: -Un conjunto de funciones específicas de red. -Un procedimiento para hacer corresponder las operaciones de E/S estándar de Linux de forma uqe se pueda enviar y recibir datos con las mismas llamadas que se utilizan para los ficheros de E/S. El socket debe abrirse con la función socket() pero después pueden utilizarse las llamadas read() o write() para mover datos a través del socket abierto. Curso de Doctorado RAPyA (2004/05) Hay tres estructuras de datos importantes: - sk_buff (en /include/linux/skbuff.h) buffer que contiene el paquete de datos. En el código fuente de Linux se designan como skb (struct sk_buff *skb) - socket (en /include/linux/net.h) Estructura genérica (no específica de TCP/IP) que utiliza la capa de sockets para seguir la evolución de cada conexión abierta (hay una estructura socket por cada socket abierto con la llamada socket). Se designa usualmente como sock (struct socket *sock) - sock (en /include/net/sock.h) Estructura compleja que se accede desde el protocolo TCP (struct sock *sk)

8 COMUNICACIÓN MEDIANTE SOCKETS (IV) ReceptorEmisor Socket emisor Socket receptor @ conocida ? El receptor asocia a su socket una dirección conocida. El emisor no necesita realizar esta asociación sendto(int s, const char *msg, int len, int flags, const struct sockaddr *to, int tolen) recfrom(int s, const char *buf, int len, int flags, const struct sockaddr *from, int fromlen) s (socket a través del que se lee o escribe); len (octetos a enviar o se desean recibir); flags (modo de recepción o envío, usualmente 0 para el modo normal); to (dirección del destinatario del datagrama); from (dirección del socket emisor, si no se conoce es NULL); tolen (longitud de la dirección de destino en octetos); fromlen (espacio de memoria reservado para la dirección del emisor). Devuelven el número de octetor enviados o recibidos, o –1 si ha habido error.

9 COMUNICACIÓN MEDIANTE SOCKETS (V) Curso de Doctorado RAPyA (2004/05) Cuando se utilizan los sockets como API, las direcciones de red se almacenan en una estructura sockaddr definida en el fichero linux/include/linux/in.h /* Structure describing an Internet (IP) socket address. */ #define __SOCK_SIZE__16/* sizeof(struct sockaddr)*/ struct sockaddr_in { sa_family_tsin_family;/* Address family*/ unsigned short intsin_port;/* Port number*/ struct in_addrsin_addr;/* Internet address*/ /* Pad to size of `struct sockaddr'. */ unsigned char__pad[__SOCK_SIZE__ - sizeof(short int) – sizeof(unsigned short int) - sizeof(struct in_addr)]; }; #define sin_zero__pad/* for BSD UNIX comp. -FvK*/

10 COMUNICACIÓN MEDIANTE SOCKETS (VI) Curso de Doctorado RAPyA (2004/05) TCP/IP considera que los bytes de los números de puerto y las direcciones de Internet se pasan en el orden de red (big endian). En Linux existen muchas funciones que facilitan la conversión de modos (man byteorder(3)) 1234 4321 Direcciones de byte Little endian Big endian (orden de red) Dato: 4321

11 COMUNICACIÓN MEDIANTE SOCKETS (VII) Curso de Doctorado RAPyA (2004/05) int socket(int domain, int type, int protocol) Debe llamarse antes de que la apicación pueda utilizar las funciones de red y devuelve un identificador (socket) que puede utilizarse como un identificador de fichero (se puede utilizar read y write a ese descriptor) int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen) Permite asociar un puerto y una dirección (un punto de comunicación o endpoint) con un socket int listen(int s, int backlog) Especifica la longitud (backlog) de la cola de peticiones de conexión pendientes mientras el servidor espera que se complete accept

12 COMUNICACIÓN MEDIANTE SOCKETS (VIII) Curso de Doctorado RAPyA (2004/05) int accept(int s, struct sockaddr *addr, socklen_t addrlen) La llama la aplicación cuando está lista para aceptar una solicitus de conexión y devuelve un nuevo socket para cada conexiónl La dirección del que solicita la conexión se almacena en una estrructura sockaddr int connect(int s, const struct sockaddr *serv_addr, socklen_t addrlen) La utiliza una aplicación cliente para establecer una conexión TCP (SOCK_STREAM) con un servidor. La dirección y el puerto del servidor con el que se desea la conexión está en serv_addr int send(int s, const void *msg, size_t len, int flags), int sendto(int s, const void *msg, size_t len, int flags, const ……), int sendmsg(int s, const struct msghdr *msg, int flags) Funciones utilizadas para transmitir datos a través del socket s

13 COMUNICACIÓN MEDIANTE SOCKETS (IX) Curso de Doctorado RAPyA (2004/05) struct msghdr { void *msg_name; /* ptr to socket address structure */ socklen_t msg_namelen; /* size of socket address structure */ struct iovec *msg_iov; /* scatter/gather array */ size_t msg_iovlen; /* # elements in msg_iov */ void *msg_control; /* ancillary data */ socklen_t msg_controllen; /* ancillary data buffer length */ int msg_flags; /* flags on received message */ }; La estructura struct iovec está definida en linux/include/linux/uio.h msg_iov es un array de buffers de datos para ser enviados o para recibir datos, y msg_iovlen es el número de buffers a los que apunta msg_iov. Los otros campos se utilizan para pasar información de control a los protocolos de las capas inferiores

14 COMUNICACIÓN MEDIANTE SOCKETS (X) Curso de Doctorado RAPyA (2004/05) int recv(int s, void *buf, size_t len, int flags) int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) int recvmsg(int s, struct msghdr *msg, int flags) Son funciones utilizadas para recibir un mensaje del socket especificado. Se bloquean hasta los datos que se especifican están disponibles y devuelven la longitud de datos leídos del socket Al terminar recvfrom se tiene la dirección y longitud del emisor en from y fromlen int getsockopt(), int setsockopt() Se utilizan para determinar o fijar las opciones de los protocolos utilizados para la comunicación

15 EJEMPLO DE COMUNICACIÓN MEDIANTE SOCKETS (I) Ejecución del Ejemplo de Datagrama en Internet Se crean los ejecutables correspondientes al emisor y al receptor. Se lanza el receptor en background (nombre_receptor &) y escribirá en pantalla “puerto de receptor  ” y su número Se lanza el emisor después, facilitándole el nombre del computador del receptor y el número de puerto asignado a su socket El receptor debería escribir el mensaje “  Éste es el mensaje” Después, los dos programas terminan Curso de Doctorado RAPyA (2004/05)

16 Datagramas en Internet: Receptor Las direcciones AF_INET se almacenan en estructuras sockaddr_in struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr /* Dir. IP */ char sin_zero[8]; }; El primer campo es AF_INET, el segundo es el número de puerto (UDP por ser SOCK_DGRAM), el tercero es la dirección IP, y el último es relleno. La dirección IP del socket es INADDR_ANY corresponde a de la máquina (al ejecutar bind se asociará al socket). Al poner el puerto a 0 se indica que cualquier puerto libre es el que se asigna al socket. int bind (int s, const struct sockaddr *name, int namelen); Asocia un socket con un nombre (argumentos: un descriptor de socket; una estructura sockaddr; y el tamaño de la estructura con la dirección) getsockname() proporciona la dirección de socket en la estructura name Recepción EJEMPLO DE COMUNICACIÓN MEDIANTE SOCKETS (II)

17 Datagramas en Internet: Emisor #include El emisor consigue la dirección del receptor a partir de la línea de comandos: el nombre de la máquina (argv[1]) y el puerto por el que espera el receptor (argv[2]) (mecanismo poco elegante, otra posibilidad es utilizar un puerto fijo en el receptor) El nombre de la máquina se convierte a su dirección IP mediante gethostbyname() El emisor no tiene que asignar su dirección a un socket mediante bind(), ya que el sistema operativo se la asigna automáticamente (la dirección IP de la máquina local y un puerto libre) si no se le ha asignado Después se proceden a llemar todos los campos con los datos del receptor y se envía con sendto() EJEMPLO DE COMUNICACIÓN MEDIANTE SOCKETS (III)

18 REFERENCIAS Curso de Doctorado RAPyA (2004/05) Herbert, T.F.:”The Linux TCP/IP Stack: Networking for Embedded Systems”. Charles River Media, 2004 (Sección 5.6)


Descargar ppt "Departamento de Arquitectura y Tecnología de Computadores E.T.S. Ingeniería Informática Lección 2. La API de Sockets Julio Ortega Lopera. Curso 2004/2005."

Presentaciones similares


Anuncios Google