Title: Sin t
1Redes (IS20)Ingeniería Técnica en Informática de
Sistemas
http//www.icc.uji.es
Práctica 2- Comunicación de procesos mediante
sockets
1. Protocolos de red IP 2. Protocolos de
transporte UDP, TCP 3. Servidor 4. Cliente
ÍNDICE
2- Queremos realizar comunicaciones entre varios
procesos que pueden tener ubicación en diferentes
máquinas - Usamos para ello los servicios que ofrece el
sistema operativo (llamadas) realizando programas
en C - Porqué en C?
- Es un lenguaje más próximo al estudiante
- El tipo de comunicación que queremos realizar es
sencilla de programar - Puestos a usar un lenguaje, usamos el que ya
conocemos - La implementación en otro lenguaje se hará
prácticamente adaptando las llamadas
correspondientes en dicho lenguaje - El en boletín de prácticas hay una introducción
al protocolo de red IP. - Supondremos que existe este protocolo el cual
permite comunicarse con una cierta garantía - Las máquinas identificadas mediante una dirección
(dirección IP) formada por 4 números separados
por puntos - Ejemplo 150.128.40.100 nuvol
- 150.128.49.69 máquina de la red docente
conectado LAN
1. El protocolo de red IP
3- Usamos las reglas del protocolo para mandar
información de un sitio a otro - sin garantía de entrega en destino y sin
garantía de orden - Ejemplo si primero mando un bloque B1 y luego B2
el protocolo IP no garantiza la llegada al
destino en ese orden. - Ni siquiera garantiza la entrega, (probabilidad
de pérdida muy baja) - TENEMOS que CONFIAR en que el protocolo
transporte la información - Cómo se implementa el protocolo?
- Como un conjunto de rutinas que son capaces de
capturar información y enviarla donde nosotros le
digamos - El S.O. necesita saber a quién enviar y qué
enviar - Coge los datos a enviar los empaqueta y las
rutinas (software) del protocolo envían la
información por la red, encaminándolo hasta que
llegue al destino - Para qué aplicaciones es útil?
- Aplicaciones básicas que no requieran alta
fiabilidad, p.eje correo electrónico - Por encima del protocolo IP están otros
protocolos que organizan el problema de
comunicación
1. El protocolo de red IP
4- El protocolo UDP es un recubrimiento de IP básico
- En cada máquina podemos tener varios procesos en
ejecución - Supongamos 2 máquinas cada una con diferentes
procesos - M1 P1 y P2 M2 P3 y P4
- Si un proceso en M1 intenta mandar información a
M2 el protocolo UDP se ocupará de la manera de
organizar el envío - El SO de M2 recibe la información pero no sabe a
quien entregársela - Si algún proceso de M2 avisa al SO que se hace
cargo de atender la comunicación (tarea de
recepción) no habrá problema - Si varios procesos de M2 quieren atender la tarea
el SO no sabrá a quien asignarla - A los dos
- A uno de los dos arbitrariamente
- Un trozo a cada uno
- Alguien debe decidir que proceso acepta las
peticiones de comunicación - Más complejo
- qué pasa si varios procesos de M1 mandan
información a M2?
Los protocolos de transporte
5- El protocolo UDP permite organizar el problema
- Añade dos puertos puerto de origen y puerto de
destino (nº de 16 bits) - La información va a tal máquina con tal puerto de
origen y tal puerto de destino - La identificación de máquina y puertos incluida
en la información que envío - Permite multiplexar sobre la misma conexión
diferentes comunicaciones - El SO de M2 mira la información recibida de M1 y
mira el puerto de destino que ESTARA ASOCIADO A
UN PROCESO de M2 - Si el puerto asignado está ocupado el SO podrá
asignar otro - También puede estar asignado un puerto a varios
procesos estos compiten por la información. El SO
lo asigna al primero que la pida. - Los procesos tienen que reservar los puertos que
quieran utilizar - Qué ocurre si quiero entrega de paquetes (nivel
de red) ordenada? - Nuevo protocolo TCP, garantiza la entrega y en
orden - Ejemplo
- en una aplicación que lea fotogramas de video y
los envía a otro, si cada 30 sg se pierde un
fotograma no ocurre nada (USO DE UDP) - Si quiero que no se pierda nada aunque el sistema
sea más lento (USO TCP)
Los protocolos de transporte
6- Recordemos
- IP servicio sin conexión (conexión virtual usando
protocolo) - UDP sabemos dirección origen, dirección destino,
puerto origen (proceso que manda) y puerto
destino (proceso que recibe) - El SO sabe a quien (proceso que tiene asignado
puerto) darle la información - El puerto será un descriptor de archivo
Los protocolos de transporte
7- Cómo funciona TCP?
- Si al cabo de un tiempo la información no llega
avisa - Garantiza entrega fiable (se entrega y en orden)
- No hay comunicación real es ficticia, SO crea
unas estructuras de datos para manejar la
información - Conexión virtualSistema Operativo
- Fase inicial de conexión P1 quiere conectarse con
P3. SO envia un paquete a M2 para asegurarse que
existe la máquina. - M2 contesta enviando un paquete de confirmación a
M1 - SO en M1 manda paquete a M2 para indicar que está
conectado (devuelve un descriptor de archivo) - SO de M2 se informa de que alguien se ha
conectado y confirma la conexión (devuelve un
descriptor de archivo) - Conexión establecida
- P1 escribe en el descriptor y aparece información
en M2 - P3 escribe en su descriptor y aparece información
en M1 - Estos descriptores se conocen como SOCKET
Los protocolos de transporte
8- Para asegurarnos de la entrega de información
ordenada existen mecanismos (protocolos)
especiales - Acuse
- Incluir acuse en la trama de vuelta para
optimizar el uso del canal..etc - La desconexión segura tiene 4 fases
- Inicio de desconexión M1 paquete indicando que
ya no mando nada más - M2 contesta yo tampoco te mando más
- M1 dice adios
- M2 dice adios
- Todas estas facilidades las ofrece el sistema
operativo como llamadas al sistema - Quién empieza la conexión? Quién acepta la
conexión? - Si alguien quiere conectarse alguien debe estar
dispuesto a oirle - NODO PASIVO servidor, que está dispuesto a que
alguien se conecte a el - NODO ACTIVO cliente que quiere conectarse a
alguien
Los protocolos de transporte
9- SERVIDOR
- Pide un socket al SO (punto o puerto de conexión
a un proceso) - Llamada al sistema
- ssocket(dominio, tipo, protocolo)
- Dominio AF_UNIX rutas de ficheros (especifica
conexión local en la misma máquina) y AF_INET
para direcciones de internet (en máquina remota) - Tipo para mandar datagramas SOCK_DGRAM o
orientado a conexión SOCK_STREAM - Protocolo 0 indica IP, SOCK_STREAM para TCP y
SOCK_DGRAM UDP - El SO devuelve ese sockets que es un descriptor
de archivo asociado al proceso que lo creo y con
las propiedades que se pasan como argumento - Informar al SO que estoy dispuesto a recibir
conexiones - Llamada al sistema
- bind(descriptorsocket, dirección, longitud)
- Especifica al SO la dirección asignada al socket
por donde puedo recibir cosas (puerto 7000)
Servidor
10- SERVIDOR
- Tabla para guardar peticiones pendientes
- Llamada al sistema
- estadolisten(descriptorsocket, longitud)
- Reserva de zona de memoria para guardar
peticiones que llegan para atenderlas
posteriormente - Resumen El proceso servidor
- Quiero recibir
- en tal puerto
- sino puedo atender guarda petición en memoria
- Además debe esperar que alguien se conecte para
ello usa la llamada - Nuevo socketaccept(antiguosocket, direccion,
longitud) - El descriptor nuevo socket (que es el usado para
comunicar) es idéntico al antiguosocket. Recibe
la dirección del socket activo (el del cliente)
en direccion - Si no conexiones pendientes antiguosocket bloquea
al proceso hasta que lleguen - Al acabar se debe cerrar nuevo socket close()
para dar fin a comunicación - El antiguosocket sigue abierto por si llegan
otras peticiones, close() para fin de peticiones
(fin de conexión) - Para intercambiar información llamadas read,
write, .....
Servidor
11- CLIENTE
- Pide un socket al SO (punto o puerto de conexión
a un proceso) - Llamada al sistema
- rsocket(dominio, tipo, protocolo)
- Llamada al sistema
- connect(descritorsocketactivo, direccion,
longitud) - Establece la conexión entre socket activo y el
pasivo para mandarle información - Direccion y longitud se refieren al socketpasivo
o de destino - En el boletín de prácticas se nos dan dos
programas client.c server.c - Estudiar el programa intentando identificar su
funcionamiento - Compilar primero servidor, ejecutarlo en una
terminal de vuestro ordenador - Compilar el cliente y ejecutarlo en otra terminal
de vuestro ordenador - pasandole los parámetros necesarios
- Nombre máquina a la que quiero conectar
- Puerto donde escucha el servidor
- Palabra o frase (si es frase entre comillas
dobles) a enviar - Por qué aparecen unos caracteres extraños?
Cliente
12Próxima sesión de prácticas Programa que envíe
un pequeño correo Basado en el programa del
cliente En web de asignatura enlaces a tutorial
de SMTP
13- Hemos visto la relación cliente-servidor
- qué significa realmente el concepto
cliente-servidor? - La arquitectura cliente servidor intenta
descargar la actividad de servidor. - El servidor tiene que atender a multitud de
clientes o nodos (con listen creaba una lista de
espera) - A mayor potencia de un servidor mayor coste
- Objetivo minimizar número de nodo que requieren
servicio del servidor. - Si número de nodos (peticiones de cliente)
disminuye el servidor aliviará su carga ya que no
tiene que poner en marcha tantos servicios.
SMTP
14- La separación entre los procesos que corren en el
servidor y cliente ha evolucionado con el tiempo - Inicialmente clientes grandes, y con el tiempo se
redujo el tamaño - Ejemplo pasarela web para proporcionar servicios
- (avance tecnológico para optimizar sistema
cliente-servidor) - Pasarela web para correo
- conectamos cliente a servidor
- vemos las páginas con mensajes que están en el
servidor. - El cliente no las descarga
- Protocolo en navegador web se adaptan con el
tiempo a estas funciones - Navegador web permite conexión a servidor para
mostrar información - Permiten servicio directo sin necesidad de
software específico - La separación cliente-servidor para correo será
- Cliente pide a servidor ? servidor contesta
- Después de separadas las tareas cliente-servidor
vimos que hay que establecer comunicación - Quién hace open pasivo? Nodo PASIVO ??
- Quién hace open activo? Nodo ACTIVO ??
SMTP
15- Nodo PASIVO ?SERVIDOR ejecuta accept
- Nodo ACTIVO ? CLIENTE ejecuta connect
- Cómo enviamos un correo?
- Conexión a estafeta (máquina que corre software
específico de envío y recepción de correo) - Necesarias direcciones de origen y destino y
cuerpo del mensaje a enviar - Protocolo específico de envío de correo SMTP
(Simple Mail Transfer Protocol), recuperación de
mensajes POD (post office protocol), otros MIME
(Multipurpose Internet Mail Extensions) - Se usa el puerto 25 de recepción de correo
- Qué es un protocolo?
- Una forma de entendernos definida por unas
reglas?Estándar - Ejemplo
- alumno-profesor (cliente-servidor)
- Servicio tutorías
- Protocolo
- alumno pregunta es hora de tutorías
- Profesor responde
- Si, alumno entra y se sienta
- No, alumno se va
SMTP
16- Un protocolo se basa en un intercambio de
mensajes - Hay mensajes inteligibles para el usuario
- Ejemplo, pasos de conexión a un servidor
- Cliente se conecta
- Servidor dice Hello 200 (el 200 indica que ha
funcionado conexión) - Servidor se bloquea esperando peticiones
- Hay situaciones del protocolo opcionales Ej
- Alumno pregunta hay tutorías-profesor contesta si
- Alumno entra en tutorías
- Alumno en tutorías pegunta si puede fumar
(opcional, puede no estar estandarizado) - Veremos luego que el cuerpo del mensaje
- DATA
- --- texto ltltENTERgtgt
- ---- texto ltltENTERgtgt
- . Punto que indica final mensaje
- ltltENTERgtgt
- A partir de las reglas y los servicios que quiero
obtener se genera un programa del cliente. - Si servidor usa el mismo estándar (protocolo)
funcionará
SMTP
17- El protocolo SMTP es un protocolo sencillo hay
una negociación previa mínima - Para más eficiencia la negociación debe ser más
fina - Ej si se comparte ancho de banda y se quiere
mandar un archivo grande rápidamente debe hacer
una negociación que optimice la velocidad de
transferencia. - SMTP no necesita identificador de usuario,
- en el mail recibido aparentemente no se indica el
emisor. - Generalmente se preserva la dirección IP desde
donde se manda - Detección de anónimos?responsabilidad
- Veamos el problema de envío de correo
- Qué hará el cliente, open pasivo o activo?
SMTP
18- Análisis del programa
- Comprobación de número de argumentos argc (número
de argumentos 1) - Cliente crea conexión,
- ssocket(dominio, tipo, protocolo)
- Dominio AF_UNIX rutas de ficheros especifica
conexión local (en la misma máquina y AF_INET
para direcciones de internet en máquina remota - Tipo para mandar datagramas SOCK_DGRAM o
orientado a conexión SOCK_STREAM - Protocolo 0 indica IP, SOCK_STREAM para TCP y
SOCK_DGRAM UDP - Hace open activo
- connect(descritorsocketactivo, direccion,
longitud) - Establece conexión entre socket activo (s) y
pasivo para mandarle información - Dirección y longitud se refieren al socketpasivo
o de destino - Dirección del puerto 25? se construye la
estructura ADDR que rellena los datos para
connect.
SMTP
19- Análisis del programa
- RESULTADO El sistema devuelve un socket y se
conecta al servidor que hemos pasado como
argumento - LEER HELLO-DECIR HELLO
- Se lee del socket un vector (buffer) de 256 bytes
- Strcpy(bufferleidos, \0) termina la cadena
leída (longlt256bytes) - Printf para ver lo que hemos leído (mensaje del
servidor) qué vemos? - Formar el string que queremos enviar (cadena)
textoterminación - IMPORTANTE el protocolo espera como terminador
del mensaje \r\n - \r\n equivale a pulsar ENTER (retorno carro y
salto de línea) - Con write se escribe cadena en el socket
- Leo respuesta de servidor (256 bytes) y la
imprimo qué vemos?
SMTP
20- ENVIAR MAIL
- Formar el string que queremos enviar (cadena)
textoterminación \r\n - Con write se escribe cadena en el socket (mensaje
de quién soy) - Leo respuesta de servidor (256 bytes) y la
imprimo qué vemos? - Se construye el cuerpo del mensaje
- DATA
- --- texto ltltENTERgtgt
- ---- texto ltltENTERgtgt
- . Punto que indica final mensaje
- ltltENTERgtgt
- Leo respuesta servidor y la imprimo qué vemos?
- DESPEDIDA
- Formar el string que queremos enviar (cadena)
textoterminación \r\n - Con write se escribe cadena en el socket (mensaje
de quit) - Leo respuesta servidor y la imprimo qué vemos?
- Cierro el socket del cliente
SMTP
21- Compilar y ejecutar programa
- Hay que pasar como argumento al programa la
máquina a la que me quiero conectar anubis.uji.es - Probar programa enviándote un mail a tu cuenta en
anubis - Modificar el programa para que nos pida por
teclado o le pasemos como argumento la dirección
de correo donde quiero enviar el mail
SMTP
22Próxima sesión de prácticas Problema de conexión
simultanea de un Host (con 2 tarjetas de red) a 2
ordenadores
23- Supongamos un Host M con 2 tarjetas de red que
quiere hablar (proceso P) con dos ordenadores
diferentes (procesos P1 y P2 en máquinas M1 y M2) - P se conecta con P1 abre un socket s1
- P se conecta con P2 abre un socket s2
- Orden de llegada de información a M procedente de
M1 y M2 es aleatoria. - No hay un método de sincronización que
especifíque quien debe enviar - Si P hace read en uno de los socket se queda
bloquea hasta que haya algo que leer - cómo escoger cual de los socket debo
inspeccionar primero?
Select
24- La única forma de recuperar información de un
socket es hacer read - Si no hay datos se bloquea
- Los socket tienen una opción para indicar lectura
no bloqueante - Así sino hay datos se devuelve el control
- Podemos saltar de uno a otro proceso hasta que en
alguno haya datos - Consumo innecesario de CPU
- Otra solución crear dos procesos P y P uno lee
de P1 y el otro de P2 - Cada proceso atiende a un nodo
- Los procesos tienen espacios de memoria disjuntos
- Nuestro espacio de datos es común?espacio de
memoria compartida?requiere semáforo - Otra solución usar threads procesos con memoria
compartida, necesito un semáforo
Select
25- Problema Tenemos un escenario en el que un
proceso tiene varios socket abiertos y debe
manejar los datos de entrada o salida en ellos. - No sabemos si llegan o no datos ni el orden en
que llegaran por los socket. (puede haber
bloqueos de lectura o escritura). - Solución Usar la llamada al sistema select para
chequear el estado de varios descriptores de
archivo (descriptores de los socket) a la vez y
en diferentes modalidades lectura, escritura,
excepción. Hay que monitorizar socket en lectura,
escritura y excepciones - Parámetros
- select(n, fd_set readfds, fd_set writefds,
fd_set exceptfds, struct timeval timeout ) - 3 listas
- Lista de descriptores de archivo que queremos
monitorizar en lectura - Descriptores de archivo que quiero monitorizar en
escritura - Lista de descriptores en los que se produjo
alguna excepción (ejemplo estoy leyendo un
archivo y se cierra la conexión) - Una estructura
- Indica tiempo que queremos que este esperando a
que uno de sus descriptores cambie de estado
(listo para leer o escribir)
Select
26- Parámetros
- select(n, fd_set readfds, fd_set writefds,
fd_set exceptfds, struct timeval timeout ) - Último parámetro puntero a una estructura
compuesta por dos punteros largos, en una
segundos y en otra microsegundos. - Especifica cuanto tiempo estará monitorizando los
descriptores sin que se produzca ningún evento - Si queremos siempre bloqueado hasta evento,
usamos NULL - Argumentos 2,3,4 son punteros a (fd_set) un
vector de bits - En cada posición del vector de bits un 1 o 0
indica si se desea monitorizar el descriptor que
ocupa esa posición 1 SI , 0 NO - Para la monitorización de vectores de bit
disponemos de Macros - FD_CLR (int fd, fd_set set) pone a cero la
posición del vector de bit de fd - FD_ISSET (int fd, fd_set set) indica si la
posición de fd está o 1 o 0 - FD_SET (int fd, fd_set set) pone a uno la
posición del vector de bit de fd - FD_ZERO (fd_set set) pone a cero todo el vector
de bits fd_set - Primer argumentos hace referencia a
- 1 el descriptor más alto que queremos
monitorizar - Ej para un vector de bit de 8 bits 01234567
- monitorizar 5 descriptores 01001111
- Primer argumento 718
Select
27- Programa
- Actúa como servidor accepta 2 conexiones e
inmediatamente ejecuta select para determinar la
conexión por donde llegán antes los datos - PUERTO SERVIDOR 7000
- Crea dos conexiones sc0, sc1 Socket -gt
bind -gt 2 accept (2 clientes) - Sólo se podrán conectar Inicialización de vector
de bit usando FD_ZERO - Se pone a 1 los dos descriptores sc0,sc1 para
monitorizarlos - Ponemos un tiempo de tv para el desbloqueo aunque
no lo usamos ponemos NULL siempre bloqueado
hasta evento - Ejecutamos select nos devuelve un entero que
indica si hay o no descriptores para ser leídos - Si se desbloquea por llegada de algo será
positivo - Si se desbloquea por timeout devuelve cero
- Testeo retval!0
- Miro si bit asociado al sc0 está a 1
- Si, escribimos mensaje datos en descriptor del
primer socket - No, datos en el segundo socket
- Cerrar socket y acabar
Select
28- Funcionamiento
- Escribir programa select.c, compilar y ejecutar
(sin argumentos) - Ejecutar dos clientes que quieran mandar cosas al
servidor - telnet labtecxx.act.uji.es 7000 (ejecutar en
dos shells diferentes) - El primero en que escriba algo y pulse ENTER
desbloqueara a select y se imprimira el mensaje. - Modificación
- Cambiar o añadir lo necesario para que el
servidor con dos conexiones - si recibe algo por sc0 lo envíe (escriba) en sc1
- si recibe algo por sc1 lo envíe (escriba) en sc0
- while (1)
- FD_ZERO....
- ...........
- Else printf(No hay datos\n)
-
- Al ejecutar lo que envío por cliente 0 se escribe
en cliente 2 y viceversa
Select
29- Utilidad
- Por ejemplo tres redes conectadas por routers
- Quiero comunicar la de un extremo con el otro
extremo pero está es una red privada - No permitirá conexiones de entrada desde internet
(SEGURIDAD) - Solución
- Usar un servidor en la red intermedia de forma
que las conexiones de las redes extremas son de
salida de las mismas y entrada a la red central y
no se viola la seguridad
Select