Title: Presentacin de PowerPoint
1REDES DE ALTAS PRESTACIONES Y SUS APLICACIONES
Lección 2. La API de Sockets
Departamento de Arquitectura y Tecnología de
Computadores
E.T.S. Ingeniería Informática
Julio Ortega Lopera. Curso 2004/2005
2INTRODUCCIÓ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)
3SOCKETS SOBRE TCP/IP
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)
4COMUNICACIÓ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)
5COMUNICACIÓN MEDIANTE SOCKETS (II)
Un proceso puede crear un socket utilizando la
función socket() include ltsys/types.hgt inclu
de ltsys/socket.hgt 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)
6COMUNICACIÓ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 Form
ato 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)
7COMUNICACIÓ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.
- 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)
Curso de Doctorado RAPyA (2004/05)
8COMUNICACIÓN MEDIANTE SOCKETS (IV)
Receptor
Emisor
Socket emisor
Socket receptor
?
_at_ 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.
9COMUNICACIÓN MEDIANTE SOCKETS (V)
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_t sin_family / Address family /
unsigned short int sin_port / Port number /
struct in_addr sin_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 /
Curso de Doctorado RAPyA (2004/05)
10COMUNICACIÓN MEDIANTE SOCKETS (VI)
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))
Dato 4321
1
2
3
4
Little endian
4
3
2
1
Big endian (orden de red)
Direcciones de byte
Curso de Doctorado RAPyA (2004/05)
11COMUNICACIÓN MEDIANTE SOCKETS (VII)
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
Curso de Doctorado RAPyA (2004/05)
12COMUNICACIÓN MEDIANTE SOCKETS (VIII)
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
Curso de Doctorado RAPyA (2004/05)
13COMUNICACIÓN MEDIANTE SOCKETS (IX)
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
Curso de Doctorado RAPyA (2004/05)
14COMUNICACIÓN MEDIANTE SOCKETS (X)
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
Curso de Doctorado RAPyA (2004/05)
15EJEMPLO 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)
16EJEMPLO DE COMUNICACIÓN MEDIANTE SOCKETS (II)
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_zero8 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
17EJEMPLO DE COMUNICACIÓN MEDIANTE SOCKETS (III)
Datagramas en Internet Emisor
El emisor consigue la dirección del receptor a
partir de la línea de comandos el nombre de la
máquina (argv1) y el puerto por el que espera
el receptor (argv2) (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()
include ltsys/types.hgt
18REFERENCIAS
Herbert, T.F.The Linux TCP/IP Stack Networking
for Embedded Systems. Charles River Media, 2004
(Sección 5.6)
Curso de Doctorado RAPyA (2004/05)