martes, 12 de febrero de 2013

Clase de Telecomunicaciones - Tarea 2

Tarea 2 - Protocolos

Hola, para la tarea 2 de la clase de telecomunicaciones se nos pidió realizar un protocolo a nivel de aplicación usando sockets UDP. El propósito de mi protocolo es simular el funcionamiento del protocolo DHCP, es decir lo que quiero es que cuando los clientes hagan un address request, el servidor responda asignándoles una IP, obviamente no debe mandar direcciones repetidas (el escenario es simulado).



Bien, lo que primero que debemos establecer es un servidor, el servidor estará escuchando siempre las peticiones que los cliente hagan, y para cada petición que recibe el servidor, mandará al cliente que halla mandado la petición una dirección IP que yo genero y que voy aumentando de numero conforme voy entregando las direcciones.

La otra cara de la moneda es el cliente. El cliente mandará un address request cada vez que quiera conectarse a la red (esto es lo que pasa en una red cualquiera, siempre y cuando esté configurado DHCP),  de manera que el servidor atenderá la petición enviando una IP cualquiera que no esté ocupada (a veces, sobre todo en los routers de telmex, solo configuran un pool de 100 direcciones IP para asignar, para este caso dejaré un pool de 10 direcciones IP para asignar).

A continuación les dejo con el código en git y las capturas de pantalla del protocolo en funcionamiento:

Liga a git con mis trabajos de la clase: https://github.com/eddypre/Telecomunicaciones

La siguiente captura de pantalla corresponde a la ejecucion del servidor escuchando las peticiones de 4 clientes, inicialicé a proposito las direcciones a 192.168.1.252, para que al cuarto cliente que haga el IP request le mande un mensaje de que ya no hay mas direcciones para asignar (debido a que el cuarto cliente sería la IP 192.168.1.255, y tal dirección es de broadcast, por lo cual no es posible asigarse a un host)

Mientras que al cliente 1, 2 y 3 les asignó las direcciones 192.168.1.252, 192.168.1.253 y 192.168.1.254 respectivamente.

(Para apreciar mejor la imagen, hacer click sobre ella)
 




Código relevante del lado del servidor:

Como mencioné antes, este solo está a la espera de las peticiones de direcciones de los clientes, cuando recibe una petición, este manda una dirección IP al cliente, en caso de que el pool (rango de direcciones asignables) de direcciones esté lleno, el server envia un mensaje de que "Ya no es posible mandar más direcciones"

while True:

 #Recibir mensaje del cliente con parametros (mensaje, ip)
 print "\nRecibiendo peticion de direccion"
 informacion = miSocket.recvfrom(1024)
 informacion1 = informacion[0]
 informacion2 = informacion[1]

 if not informacion: #Por si no le llega info al servidor
  break

 if ultimoOcteto < 255: #Para enviar direcciones ip que esten dentro del rango, osea menos de 255(que es la direccion de broadcast, en caso de mascara /24)
  direccionEnString = str(ultimoOcteto) 
  enviar = estatico + direccionEnString
  miSocket.sendto(enviar, informacion2)
  print "Envie esta direccion: ", enviar
  ultimoOcteto = ultimoOcteto + 1
 else:
  print "No hay mas direcciones para asignar"
  MensajeAlerta = "Ya no es posible mandar mas direcciones, el pool esta lleno"
  miSocket.sendto(MensajeAlerta, informacion2) #Enviar al cliente que envio su IP request un mensaje que ya no hay IP disponibles



Código relevante del lado del cliente (esto es casi todo el código):

Del lado del cliente solo se envian peticiones de dirección y obviamente también se reciben las direcciones mandadas por el server, en el caso que ya no haya más direcciones, el cliente recibe un mensaje del server que dice: "Ya no es posible mandar más direcciones".

mensaje = "ip request"
#Enviar el mensaje al server de la peticion de direccion ip
miSocket.sendto(mensaje, (ip, puerto))
print "IP request enviada"

time.sleep(3)
#Recibir informacion
informacion = miSocket.recvfrom(1024)

informacion1 = informacion[0]
informacion2 = informacion[1]
print "La ip que me asignaron es: ", informacion1



Cualquier duda o aclaración pueden ponerla en comentarios.

Saludos a todos!

1 comentario: