Práctica 1: sockets en Python



Documentos relacionados
COMUNICACIÓN ENTRE PROCESOS SOCKETS

Problemas de Redes de Computadores. Conjunto de problemas 1

Práctica GESTIÓN Y UTILIZACIÓN DE REDES LOCALES. Curso 2001/2002. TCP/IP: protocolo TCP

DHCP. Dynamic Host Configuration Protocol. Protocolo de Configuración Dinámica de Host. Administración de Redes de Computadores

Migrando aplicaciones a IPv6

Redes (IS20) Ingeniería Técnica en Informática de Sistemas. CAPÍTULO 8: El nivel de transporte en Internet

MICQ. Trabajo Práctico Final Seminario de Ingeniería en Informática I Facultad de Ingeniería, UBA. Junio Cátedra: Pablo Cosso

Aplicaciones Cliente/Servidor en Gambas Prof: Mileti, P.

Computadores y Comunicaciones. Práctica de Laboratorio: Diseño de una aplicación basada en el modelo cliente-servidor

Práctica 1: Configuración de una Red Local. Estaciones de Trabajo

Guía de uso del Cloud Datacenter de acens

TELEPROCESO Y SISTEMAS DISTRIBUIDOS

Problemas de Redes de Computadores. Ingeniería Técnica en Informática de Gestión Conjunto de problemas 1

Introducción de Sockets en C.

Tutorial BMS Server Studio UDP

Nos pedirá el usuario y contraseña de nuestro MODEM, estos datos se los proporciona su proveedor de Internet.

WINDOWS : TERMINAL SERVER

Activación de un Escritorio Remoto

Instrucciones de instalación de IBM SPSS Modeler (licencia de usuario autorizado)

REDES DE ÁREA LOCAL. APLICACIONES Y SERVICIOS EN WINDOWS

PROGRAMACIÓN CLIENTE-SERVIDOR MEDIANTE SOCKETS EN JAVA

Práctica 3 de Redes de Área Local Cliente y Servidor de ficheros concurrente

Iptables, herramienta para controlar el tráfico de un servidor

ATAQUE CON SLOWLORIS A SERVIDORES APACHE VULNERABLES

Configuracion Escritorio Remoto Windows 2003

Introducción a la programación con sockets en C

pchelpware, asistencia remota libre

1.- FUNDAMENTOS FUNCIONAMIENTO GENÉRICO JAVA SOCKETS Creación de Streams de Entrada...7

Implantar Microsoft Software Updates Service (SUS)

Instalación, creación y configuración del servicio FTP

Objetivo: Introducción conceptual y aplicación básica de los lenguajes del lado del servidor.

4.2- Instalación y Configuración de un Servidor DNS Dnsmasq en Ubuntu sin DHCP

15 CORREO WEB CORREO WEB

Patrones para persistencia (I) Ingeniería del Software II

IS23 Mantenimiento de Instalaciones Informáticas Práctica 6. Acceso remoto a ordenadores tipo PC

Modelo de Objetos Distribuidos

PRACTICA DE REDES Redes Ad Hoc

Existen dos formas básicas de publicar una página web, a través de un cliente FTP (Ej. NicoFTP) o a través de FrontPage.

Arquitectura de Redes y Servicios de Telecomunicación

Escáner de puertos. Módulo 11: Seguridad Informática: Estudio del caso de las Comunicaciones Móviles

Telnet Comunicaciones 1. Luis Alfredo da Silva Gregori Gonzalez Rhamin Elrhouate July 2014

CONFIGURACIÓN TERMINAL SERVER EN WINDOWS 2003

Arquitecturas cliente/servidor

Bibliotecas Escolares. Perfil de Lector.

pchelpware, asistencia remota libre

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

ARQUITECTURAS CLIENTE/SERVIDOR

Práctica 9: Configuración de NAT y DHCP

Resumen ÁREA DE FACTURACIÓN::INFORMES::Pedidos Detalle Resumen ÁREA DE

DOCENTES FORMADORES UGEL 03 PRIMARIA

Tema 4.1: - TRANSPORTE-

D.T.Informática S.L. [Sistema hada] hilo Administrador Desarrollo Activo

PRACTICA CAPITULO 2 MODULO 1 PROTOCOLOS Y LA FUNCIONALIDAD DE LA CAPA DE APLICACIÓN

INTERNET 4º ESO INFORMATICA / DEP. TECNOLOGIA

COMO INSTALAR Y CONFIGURAR UN SERVIDOR DNS

Sockets (UDP) Tema 2.- Nivel de aplicación en Internet

Comunicación entre Procesos y Sockets

Práctica 1: Herramientas básicas:

LABORATORIO DE RC: PRÁCTICA 4: IMPLEMENTACIÓN DE UN CLIENTE DE CORREO

Ingeniería del Software Arquitectura Física en 3 niveles

ENVÍO DE POR MEDIO DE SMTP

UNIVERSIDAD DE ALCALÁ - DEPARTAMENTO DE AUTOMÁTICA Área de Ingeniería Telemática LABORATORIO DE COMUNICACIÓN DE DATOS (CURSO 2011/2012)

Práctica 3: Estudio de los protocolos HTTP, SMTP, POP3 e IMAP mediante un analizador de red: Wireshark

Explotación de Sistemas Informáticos IES Murgi PRÁCTICA 9: SERVICIO WEB Y FTP DE INTERNET INFORMATION SERVICE

Servicio de resolución de nombres (DNS)

Internet Information Server

Ubuntu Server HOW TO : SERVIDOR VPN. EN ESTE SE REALIZA LO SIGUIENTE: En este how to se le va a enseñar como usar vpn. Qué es una VPN?

Práctico. Excel para la toma de decisiones. Ayudante : César Villalobos Luengo Profesora : Dra. Angélica Urrutia

Programación de Sockets

Person IP CRM Manual MOBILE

INSTITUTO TECNOLOGICO DE LAS AMERICAS (ITLA) Nombre: Brayhan E. Acosta Hiciano. Matricula: Materia: Sistema Operativo III

Redes Paso a Paso. Descripción. Redes en Educación 2

Migrar una organización Microsoft Exchange 2003 a Microsoft Exchange 2007

Redes Locales: El protocolo TCP/IP

INSTITUTO TECNOLÓGICO DE COLIMA LIC. EN INFORMÁTICA

INSTALACIÓN DE ORACLE 8i (8.1.7) SOBRE NT

Tutorial para la comunicación TCP en el BMS Server

Servidor DNS sencillo en Linux con dnsmasq

MANUAL DE AYUDA MÓDULO GOTELGEST.NET PREVENTA/AUTOVENTA

Introducción a la extensión de scripting en gvsig 2.0

UNIVERSIDAD DE SALAMANCA


Descripción del Sistema: Arbutus Windows Server

Internet Information Server

SERVIDOR WEB PARA ACCESO EN TIEMPO REAL A INFORMACIÓN METEOROLÓGICA DISTRIBUIDA

Enlace web remoto a travez de SSh Juan Badilla Riquelme Anibal Espinoza Moraga Cesar Reyes Pino

Las redes y su seguridad

CONFIGURACIÓN BÁSICA DE UNA VPN EN WINDOWS XP PROFESIONAL

INSTALACION DEL Terminal Services. Instalamos el Terminal Services. Siguiente. Nos saldrá una advertencia, seleccionamos instalar.

Instrucciones de instalación de IBM SPSS Modeler Server 16 para Windows

Servidor Apache. Instalación Configuración Apache con Webmin 24/03/2014. Vicente

Servidor FTP. Ing. Camilo Zapata Universidad de Antioquia

Redes de Área Local: Configuración de una VPN en Windows XP

Manual del Alumno de la plataforma de e-learning.

Usar Epoptes en Huayra

Servidor DNS. DNSmasq. Rocío Alt. Abreu Ortiz

Optimizar base de datos WordPress

Roles y Características

MANEJO DEL VNC Página 1

HOW TO SOBRE REMOTE ACCESS VPN MODE EN LINUX

Transcripción:

Práctica 1: sockets en Python Álvaro Navarro anavarro@gsyc.es Jesús M. González-Barahona jgb@gsyc.es Infraestructura de Redes 5 o Ingeniería Informática 08/09 1. Fase 1: Cliente UDP Esta primera fase tiene como objetivo familiarizarnos con el paquete sockets de Python. Para ello construiremos un sencillo cliente UDP que envíe paquetes a un receptor. Para usar librería de sockets basta con importar el paquete sockets de la siguiente forma: import socket Podemos crear un socket mediante la función socket: s = socket.socket (socket.af_inet, socket.sock_stream) AF INET especifica la familia de procolos que usaremos. Las otras dos posibilidades son AF UNIX y AF INET6, pero quedan fuera del alcance de esta práctica. SOCK STREAM define nuestro socket como TCP. Para definir un socket como UDP usaríamos la constante SOCK DGRAM. Existen más tipos de sockets, como por ejemplos sockets RAW, que no usaremos en esta práctica. Una vez creado el socket, podemos realizar envío y recepciones mediante las funciones send y recv, en el caso de haber definido un socket TCP, o mediante sendto y recvfrom para UDP. Para finaliar cerraremos el descriptor del socket mediante el método close. En este punto conviene leer el manual de Python del paquete sockets 1. En él se describe cómo usar métodos importantes como inicializar la conexión mediante el método connect (para TCP) o el método bind para escuchar peticiones en un puerto. Construye un cliente que envíe peticiones UDP a un host. La dirección IP y el puerto destino serán configurados mediante argumentos en línea de comandos. De esta forma podríamos lanzar nuestro cliente: python clienteudp.py 127.0.0.1 4000 1 http://www.python.org/doc/2.5.2/lib/module-socket.html 1

Donde 127.0.0.1 es la IP destino (localhost en este caso) y 4000 el puerto. El programa nos preguntará qué mensaje (string) queremos enviar. El usuario escribirá una frase que será enviada al servidor. El programa finalizará sólo cuando el usuario escriba quit. Para parsear los argumentos de la línea de comandos utilizamos el paquete sys de Python. Nuestro programa recibirá los argumentos en forma de lista, de forma que podemos acceder a cada elemento de la siguiente forma: sys.argv[0] # referencia al nombre del programa sys.argv[1] # referencia al primer argumento sys.argv[2] # referencia al segundo argumento... Para probar nuestro cliente necesitamos un proceso escuchando peticiones en algún puerto determinado. Como todavía no hemos construido ningún servidor, usaremos la herramienta netcat. Para ello, desde consola ejecutamos: nc -u -l -p 4000 -u indica que esperamos datagramas UDP -l pone netcat en modo escucha -p indica el puerto por donde escucharemos peticiones Por último ejecuta el analizador de redes wireshack y estudia los paquetes que están intercambiando cliente y servidor. Ya que wireshack necesita permisos de root, utilizaremos la herramienta sudo para lanzarlo: sudo which wireshack 2. Fase 2: Servidor UDP En esta fase implementaremos un servidor que realice la misma función que netcat en la Fase1. Crearemos un nuevo programa, servidorudp.py, que implemente un servidor UDP. La estructura del programa es similar al clienteudp.py a diferencia del argumento pasado por línea de comandos: python servidorudp.py 4000 Además debemos usar el método bind para escuchar peticiones en el puerto indicado. El servidor implementará un servicio de echo, es decir, devolverá al cliente el mismo string que éste le envíe pero convertido a mayúsculas. Por ejemplo: 2

# lanzamos primero el servidor en un terminal anavarro@host: /$ python servidor UDP.py 4000 Esperando peticiones... mensaje aceptado! # lamzamos el cliente anavarro@host: /$ python clienteudp.py localhost 4000 Escriba mensaje: luke, soy tu padre El servidor dice: LUKE, SOY TU PADRE Por último vuelve a lanzar tu práctica con Wireshack para estudiar qué está pasando. 3. Fase 3: Cálculo RTT En esta tercera fase calcularemos el Roud Trip Time o RTT entre ambos nodos. Para ello necesitamos construir un cliente y un servidor (fases anteriores), que realicen las siguientes tareas: El cliente enviará una petición de tiempo al servidor tomando el timestamp del momento del envío. El servidor recibe la petición de tiempo y responde al cliente. El cliente recibe el la respuesta del servidor y vuelve a tomar un timestamp tras la recepción. El cliente puede calcular el RTT de la siguiente forma: RTT = timestamp_recepcion - timestamp_envio Para calcular un Timestamp podemos usar el paquete time de Python: import time y ejecutar, por ejemplo: t = time.time() Podéis también echarle un vistazo al paquete datetime 2. Este paquete permite manejar fechas y horas de forma muy cómoda permitiendo el formato y el acceso a cada uno de los elementos del timestamp (día, mes, año, hora, minuto...) 2 http://www.python.org/doc/2.5.2/lib/module-datetime.html 3

4. Fase 4: Intercambio RTTs bidireccional En esta última fase construiremos 2 nodos que envíen y reciban tiempos. Para facilitar la construcción de nodos más complejos, nos serviremos del paquete SocketServer 3 de Python: import SocketServer Este paquete facilita la implementación de servidores mediante la delegación de la lógica de la aplicación a métodos handle. Estos métodos están implementados dentro de una clase, que debe heredar de Base RequestHandler y que incluye variables para el manejo de conexiones y clientes. A continuación se incluye un esqueleto para implementar una aplicación basada en este paquete: import SocketServer import threading # heredamos de BaseRequestHandler class MyUDPHandler(SocketServer.ThreadingMixIn, SocketServer.BaseRequestHandler): # constructor def init (self, request, client_address, server): SocketServer.BaseRequestHandler. init (self, request, client_address, server) # metodo handler def handle (self): data = self.request[0].strip() socket = self.request[1] print "%s wrote:" % self.client_address[0] print data socket.sendto (data.upper(), self.client_address) if name == " main ": cnn = ("127.0.0.1", 4000) server = SocketServer.UDPServer (cnn, MyUDPHandler) server_thread = threading.thread (target=server.serve_forever) server_thread.setdaemon (True) server_thread.start() El objetivo de esta fase es crear dos nodos que calculen sus RTTs e intercambien dicho valor entre ellos. De tal forma que ambos nodos mantendrán dos valores: por un lado el RTT que él mismo ha calculado y el RTT que el otro nodo ha calculado. Suponiendo que n1 y n2 sean dos nodos de nuestra red, tendremos dos operaciones que implementar: Cálculo de RTT (fase 3). n1 calcula el RTT respecto a n2. 3 http://docs.python.org/library/socketserver.html 4

Obtención de RTT: n1 pide a n2 el tiempo que n2 ha calculado anteriormente. En el que supuesto que n2 no haya calculado el RTT todavía, puede enviar 0. Por tanto, cada nodo debería recibir tres argumentos: puerto en el que escuchará peticiones dirección IP de otro nodo puerto del otro nodo Si queremos evitar los dos últimos argumentos, podemos hacer que nuestro nodo nos pregunte en tiempo de ejecución la IP y el puerto del nodo sobre el que queremos calcular y obtener el RTT. Aunque la solución se puede abordar de muchas formas, recomendamos implementar un sistema básico de mensajes. Será el método handler de la clase SimpleRequestHandler el que debería implementar la lógica de la aplicación. El siguiente fragmento de código ilustra un ejemplo sobre cómo discriminar el tipo de mensaje entrante: msg = self.request[0].strip() if msg == "GET_TIME": self.request.send(time) elif msg == "CALCULATE_TIME": self.request.send("ack") else: self.request.send("unknown command") A la hora de enviar y recibir datos que no sean strings, necesitaremos hacer una serialización del envío. Para ello usaremos el paquete struct de Python y los métodos pack/unpack. Aquí se muestra un ejemplo muy sencillo: import struct >> packet = struct.pack(!d, 1294.58) >> @\x94:q\xeb\x85\x1e\xb8 >> struct.unpack (!d, packet) >> (1294.58,) El primer argumento del método pack especifica el tipo de dato sobre el que se realizará la conversión. En este ejemplo indicamos que es un tipo float (d) y que además irán por la red (!), evitando así problemas con el endian. Tenéis más información del paquete struct en la página del manual 4 Para probar la práctica recomendamos lanzar cada nodo en máquinas diferentes y, a ser posible, desde campus diferentes. 4 http://www.python.org/doc/2.5.2/lib/module-struct.html 5