jueves, junio 11, 2015

Algoritmos de Enrutamiento

ALGORITMOS DE ENRUTAMIENTO POR VECTOR DISTANCIA Y ESTADO DE ENLACE 

ALGORITMOS DE ENRUTAMIENTO
Estos algoritmos permiten la toma de decisión a nivel de la capa de red, de la línea de salida por donde un paquete deberá ser transmitido, garantizando que éste llegue a su destino por la ruta más eficiente. A continuación mencionaremos dos algoritmos de enrutamiento utilizados en las redes actuales. 

ENRUTAMIENTO POR VECTOR DISTANCIA
El algoritmo de enrutamiento por vector distancia, también conocido como algoritmo Bellman-Ford distribuido y algoritmo Ford-Fulkerson, es el algoritmo utilizado en el protocolo RIP (Routing Information Protocol o Protocolo de Información de Enrutamiento), el IGRP (Interior Gateway Routing Protocol, o Protocolo de enrutamiento de gateway interior) es un protocolo propietario patentado y desarrollado por Cisco que se emplea con el protocolo TCP/IP según el modelo (OSI) Internet y el EIGRP (Enhanced Interior Gateway Routing Protocol, Protocolo de enrutamiento de gateway interior mejorado) que es un protocolo de encaminamiento vector distancia avanzado, propiedad de Cisco Systems, que ofrece lo mejor de los algoritmos de vector distancia y del estado de enlace. Este algoritmo es de tipo dinámico, y su funcionamiento consiste en que cada enrutador mantenga una tabla de enrutamiento que contiene un registro de cada nodo de la subred. El registro contiene por lo general las siguientes entradas, una con la línea con la dirección del destino, un registro con la métrica (distancia al destino) y otro registro con la dirección del nodo vecino a través del cual se llega al nodo destino.

La métrica usada puede contener cantidad de saltos, retardo de tiempo en milisegundos, número total de paquetes encolados o largo de la ruta. El enrutador puede medir los retardos con paquetes especiales ECO que el receptor marca con la hora y lo regresa al enrutador que origina la petición de ECO.

Algoritmo
1. Inicializar la tabla colocando distancia al mismo nodo igual a cero
2. Cada nodo calcula la distancia entre él mismo y sus vecinos, almacenando esta información en una tabla.
3. Cada nodo envía su tabla a todos los nodos vecinos.
4. Cuando un nodo recibe las tablas de distancias de sus vecinos, éste calcula la ruta más corta a los demás nodos y actualiza su tabla para reflejar los cambios.



Principales desventajas del algoritmo de Bellman-Ford:
  • Los cambios en la topología de red no se reflejan rápidamente ya que las actualizaciones se distribuyen nodo por nodo.
  • Cuenta hasta el infinito (si un fallo de enlace o nodo hace que un nodo sea inalcanzable desde un conjunto de otros nodos, éstos pueden estar siempre aumentando gradualmente sus cálculos de distancia a él, y mientras tanto puede haber bucles de enrutamiento)
ENRUTAMIENTO POR ESTADO DE ENLACE
Este algoritmo sustituyó al algoritmo de vector distancia ya que este último tenía dos debilidades, una es que no se consideraba el ancho de banda de las líneas y el dos que el algoritmo podía tardar demasiado en converger problema de la cuenta hasta el infinito). Algunos de los protocolos que actualmente usan el algoritmo de enrutamiento por vector distancia son el OSPF (Open Shortest Path First o El camino más corto primero), su medida de métrica se denomina cost y tiene en cuenta diversos parámetros tales como el ancho de banda y la congestión de los enlaces y el IS-IS (Intermediate System-Intermediate System o sistema intermedio-sistema intermedio) diseñado por DECnet y adoptado por la ISO.

Algoritmo
El concepto utilizado en el que se basa el enrutamiento por estado de enlace puede enunciarse en cinco partes:

1. Descubrir a sus vecinos y conocer sus direcciones
2. Medir el retardo o costo para cada uno de sus vecinos
3. Construir un paquete que indique lo aprendido
4. Enviar el paquete anterior a todos los demás enrutadores
5. Calcular la ruta más corta a todos los demás enrutadores.

Para identificar la ruta más corta el algoritmo de enrutamiento de estado de enlace se apoya del algoritmo de Dijkstra para encontrar la ruta más corta a los demás enrutadores. A diferencia del algoritmo de Bellman-Ford, el algoritmo de Dijkstra requiere que el peso de las aristas no sea negativo, gracias a esto puede resolver el problema en tiempo más reducido.

A diferencia del algoritmo de vector distancia en donde cada enrutador intercambia la información de su propia tabla con la de sus vecinos (nodo a nodo), en el algoritmo por estado de enlace la tabla de cada enrutador es enviado a todos los demás enrutadores en el mismo intercambio de tiempo asignado para la actualización de las tablas, esto evita que se presente el problema de la cuenta al infinito. También, debido a esta manera de proceder, el algoritmo de enlace de estado se comporta de manera mucha más eficiente ante posibles cambios en la topología de la red.

COMPARACIÓN ENTRE ALGORITMOS

  

domingo, mayo 31, 2015

Get my public IP and send it via email periodically

in order to get the Public IP assigned from your Internet provider to your router, you can use the free service offer by dyndns:

http://checkip.dyndns.org

but what if you want to get the ip from console and save this into a text file?, this is usefull if later you wants to send this file to some email. If your need is this, so, just follow the next steps tested in Linux Mint.

first try the command via console and look you get the right answer:

$ curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'  > mi_ip

this will copy the Public IP to mi_ip file, just check your file and see the result:

$ nano mi_ip

you can add the command to crontab in order to periodically send you an email with the ip result. For this create a shell script:

$ nano mi_ip.sh

#!/bin/bash
curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//' $
cat ~/mi_ip.txt | mail -s "My IP address is:" put_your_email_here

save and exit nano. Now configure your crontab jobs:

$ crontab -e

put this at the bottom of the file:

#Send mi public ip to my email
@daily put_here_the_path_to_your_shell_script_mi_ip.sh

save and exit. With the option @daily the scritp would be executed each day at midnight. That's all!


miércoles, mayo 13, 2015

Habilitar servicio Telnet en Ubuntu


1. instalamos los paquetes necesarios:

$ sudo apt-get install xinetd telnetd

2. abrimos el archivo inetd.conf:

$ sudo nano /etc/inetd.conf
colocamos la siguiente línea:

 telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd
3.  editamos el archivo xinetd.conf:

$ sudo nano /etc/xinetd.conf
 colocamos el siguiente contenido:

# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
# Please note that you need a log_type line to be able to use log_on_success
# and log_on_failure. The default is the following :
# log_type = SYSLOG daemon info
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}

includedir /etc/xinetd.d

4. verificar en el archivo services que el servicio este en el puerto deseado y si no es así agregarlo:

$ sudo nano /etc/services
telnet        23/tcp
5. si se desea cambiar la configuración del archivo por default podemos crear el archivo telnet:
$ sudo nano etc/xinetd.d/telnet
colocamos el siguiente contenido:

# default: on
# description: The telnet server serves telnet sessions; it uses
# unencrypted username/password pairs for authentication.
service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}


6. finalmente reiniciamos el servicio:
$ sudo /etc/init.d/xinetd restart

miércoles, marzo 25, 2015

Debugging con gdb y usando Dev-C++

Debugging con gdb

Para poder realizar el debug con gdb de un código en C o C++ tenemos que compilar con la opción -g de la siguiente manera:

$ gcc -g -o nombre_ejecutable archivo.c

donde -g habilita la opció de debug, -o le da al archivo ejecutable el nombre de nombre_ejecutable que creará al archivo nombre_ejecutable.exe y archivo.c es nuestro código fuente.

para realizar l debug con gdb:

$ gdb ./nombre_ejecutable
(gdb)

veamos algunos comandos útiles:
(gdb) break main      (crea un breakpoint en nuestra clase principal main)

(gdb) run                  (ejecutará el código hasta encontrar el primer breakpoint)
 
(gdb) continue         (ejecuta el resto del código hasta el próximo breakpoint)
(gdb) step                (ejecuta próxima línea de código)
(gdb) next               (igual que next pero no ejecuta la línea, la considera como la próxima instrucción)
(gdb) break contar  (crea un breakpoint en la función "contar")
(gdb) archivo.c:22  (crea un breakpoint en la línea 22 del archivo fuente archivo.c)
(gdb) print nombre_variable (imprime la variable "nombre_variable" definida en el código)

(gdb) info breakpoints  (lista los breakpoints existentes)

(gdb) delete breakpoint 1 (elimina el breakpoint 1)
(gdb) delete breakpoint 4-7 (elimina el rango de breakpoints del 4 al 7)

Debugging usando el entorno Dev-C++

es importante que nuestro código corra dentro de un proyecto, es decir, debemos crear el proyecto siguiendo los pasos siguientes:
File -> New -> Project

seleccionar por ejemplo "console application" si nuestro código se ejecutará en consola (o elegir otra opción que corresponda), seleccionar si el código está desarrollado en C o C++, colocar nombre de archivo y luego oprimir OK.

Luego debemos crear nuestro código fuente y posteriormente habilitar la opción de debug, para ello deben seguir estos pasos:

Project -> Project Options -> Compiler - Linker

y en la opción Generate debugging information seleccionar Yes.



ahora debemos crear un breakpoint porque si hacemos el debug sin éste el programa se ejecutará de manera nomal, así que a manera de ejemplo creemos un breakpoint en el main, basta con hacer un click izquierdo sobre el número que indica nuestra línea de instrucción main, veremos que aparece un indicador tipo check, ahora estamos listos, podemos oprimir la tecla F5 para realizar el debug.

En la ventana inferior de Dev-C++ en la pestaña Debug,  tenemos varias opciones que pueden ayudarnos a realizar nuestra depuración.


miércoles, marzo 18, 2015

Supercomputadores

Top500.org

 El primer computador para noviembre del 2014 del TOP500  de los supercomputadores es el Tianhe-2 (MilkyWay-2 o en español VíaLáctea-2) desarrollado por la Universidad Nacional de Tecnología de Defensa de China con un poder de cómputo de 33,86 petaflop/s.


Un petaflops es equivalente a 1015 flop. Flops es el acrónimo de Floating-point Operations per Seconds) y representan una medida de desempeño de computadores.

A continuación se muestra los tres primeros supercomputadores de la lista del Top500:

Rpeak es el pico de desempeño teórico.

Rmax es el desempeño que presenta el computador para la resolución de los cálculos incluidos en las librerías conocidas como LINPACK, estas librerías miden el desempeño de los computadores digitales e incluyen funciones numéricas de algebra lineal específicamente operaciones vectoriales y de matriz.

Computadores Vectoriales en top500

En la época de los 90 fueron muy comunes los computadores vectoriales, que realizaban cálculos con matrices de manera muy rápida. Estos computadores fueron diseñados por CRAY INC, y fueron los supercomputadores predominantes en dicha década, sin embargo los altos costos de producción de estos equipos aunado al auge de la computación distribuida, produjo que el mercado se moviera hacia soluciones más económicas como es el caso de supercomputadores creados a través de cluster de equipos con procesadores escalares.

Cray 2:  4 procesadores vectoriales (1985):




El siguiente gráfico muestra como el procesador escalar ha ido desplazando al vectorial desde el año 1993 hasta el 2002:



Fuentes:
•    http://www.top500.org/list/2014/11/
•    http://en.wikipedia.org/wiki/LINPACK
•    http://www.ehu.eus/ehusfera/hpc/2013/10/21/que-es-un-supercomputador/


Simulación de Red Básica con Virtualización

Simulación de Red básica con Virtualización:

vamos a simular una LAN con VMware, dicha red tendrá dos segmentos de red con los parámetros mostrados en la imagen, para ello usaremos máquinas virtuales, PC1 será una virtualización de Debian y PC2 de Win XP, el router será configurado en una máquina virtual con Debian y a los que previamente se le asignan desde VMware dos Adpatadores de Red.

Para crear los adaptadores de red debe seleccionarse la máquina virtual (de aquí en adelante abreviaré máquina virtual como MV) que configuraremos como router y luego "Edit virtual machine setting


Cuando creemos los adpatadores de red debemos asegurarnos de seleccionar la opción "Bridge: connected directly to the physical network". ver Máquinas Virtuales: adaptadores de red.



Configurar Router Virtual

para configurar los interfaces de red para el router, encendemos la máquina virtual (que en este caso es un debian virtualizado) y ejecutamos los siguientes pasos:

$ sudo nano /etc/network/interfaces

definir interface eth0 y eth1 para lo que serán nuestras dos redes, ver imagen con detalles:


salir guardando cambios. Para que nuestra configuración funcione es decir, para obligar al equipo a trabajar como un router debemos seguir el siguiente paso:

$ sudo nano /etc/sysctl.conf

y descomentar la línea que contiene net.ipv4.ip_forward=1 (en la imagen se muestra ya descomentada). Salir guardandado los cambios

ahora reiniciamos el equipo: $ sudo init 6

Configurar Host:

este paso es muy sencillo, basta con instalar dos máquinas virtuales con los sistemas que deseemos, en este tutorial se montaron dos MV una con windows xp y otra con debian y seguir luego los siguientes pasos:


PC2 (debian):
iniciamos la MV debian y ejecutamos:

$ sudo nano /etc/network/interfaces

y configuramos los siguiente valores:

iface eth0 inet static
        address 192.168.2.12
        netmask 255.255.255.0
        gateway 192.168.2.10


noten que la dirección IP del host será 192.168.2.12 y la del gateway será la del interfaz de red del router (previamente configurado en la sección anterior) que se encuentra en el mismo segmento de red (red: 192.168.2.0), por lo tanto el gateway será: 192.168.2.10

para reiniciar:
$ sudo init 6

PC2 (windows xp):
iniciar la MV y configurar los datos de red en "network connections" tecla derecha del ratón sobre "Local area connection" y seleccionar "properties" y luego "Internet protocols TCP/IP" y luego botón "properties", en la ventana que se desplegará colocaremos los siguientes valores de red para que coinciden con nuestro diagrama de red a simular:

IP address: 200.1.1.5
Subnet mask: 255.255.255.0
Default gateway: 200.1.1.10

la dirección IP de PC1 será 200.1.1.5 y la del default gateway será la del interfaz de nuestro router que se encuentra en el mismo segmento de red por lo tanto deberá ser 200.1.1.10 (red: 200.1.1.0)



Pruebas de conexión:

para probar que los segmentos estén correctamente configurados y los host puedan comunicarse entre si, nos valemos del comando ping para realizar una prueba muy sencilla:

desde el PC1 ejecutar desde consola:

$ ping 200.1.1.5

y deberiamos tener como espuesta algo parecido a esto
PING 200.1.1.5 (200.1.1.5) 56(84) bytes of data.
64 bytes from 200.1.1.5: icmp_req=1 ttl=127 time=5.28 ms
64 bytes from 200.1.1.5: icmp_req=2 ttl=127 time=0.494 ms
64 bytes from 200.1.1.5: icmp_req=3 ttl=127 time=0.447 ms
64 bytes from 200.1.1.5: icmp_req=4 ttl=127 time=0.307 ms
64 bytes from 200.1.1.5: icmp_req=5 ttl=127 time=0.497 ms
64 bytes from 200.1.1.5: icmp_req=6 ttl=127 time=0.487 ms
64 bytes from 200.1.1.5: icmp_req=7 ttl=127 time=0.482 ms
64 bytes from 200.1.1.5: icmp_req=8 ttl=127 time=0.481 ms

luego desde PC2 ejecuta desde consola:

c:\> ping 192.168.2.12

y como respuesta tendrás algo parecido al mensaje anterior,

Con el comando ping enviamos paquetes de 64 bytes al host remoto y medimos el tiempo de respuesta , en caso de que el host no pueda ser localizado (unreachable) obtendremos un mensaje de error que nos indica que los segmentos de red nos están interconectados o que la dirección del host remoto que indicamos es errada.


Si todo sale bien es el momento de realizar pruebas, por ejemplo podemos capturar paquetes con wireshark, para eso bastará con instalar el software en alguna de las MV.

martes, marzo 10, 2015

Configurar Interfaces de Red en Debian

 
Las configuraciones de los interfaces de red se realizan en 
el archivo /etc/network/interfaces
 
Configurar DHCP:
auto eth0
allow-hotplug eth0
iface eth0 inet dhcp
 
Configurar dirección estática
allow-hotplug eth0
auto eth0
iface eth0 inet static
        address 192.0.2.7
        netmask 255.255.255.0
        gateway 192.0.2.254 
 
Levantar interfaz sin dirección:
   iface eth0 inet manual
      pre-up ifconfig $IFACE up
      post-down ifconfig $IFACE down
 
Configuración de cliente DNS:
estas configuraciones se aplican en /etc/dhcp/dhclient.conf
ejemplo: 
supersede domain-name-servers 12.34.56.78, 12.34.56.79;
 
 
Fuente:
https://wiki.debian.org/es/NetworkConfiguration#Configurar_la_interfaz_manualmente 

Máquinas Virtuales: Adaptadores de Red

Cuando trabajamos con virtualización, especialmente cuando deseamos utilizar máquinas virtuales para simular configuraciones de red, es importante conocer lo tipos de configuraciones con los que podemos contar.

Voy a enfocarme en el paquete de virtualización conocido como VMware que nos ofrece tres tipos de conexiones de red básicas que serán descritas a continuación (existe la opción de configuración de red personalizada que no será tratada en esta entrada):

Bridge network
esta opción configura tu maquina virtual como un entidad única y separada dentro de la red , por lo tanto será completamente independiente del host (anfitrión), es decir del equipo donde estamos corriendo la máquina virtual.

 Link to bridged_1.png

la red bridge es configurada automáticamente al seleccionar Use bridge networking en el wizard de  instalación de nuevas máquinas virtuales "New Virtual Machine Wizard" o si es seleccionada la opción Typical setup.

Como generalmente nuestro host estará en una red Ethernet, la configuración como bridge network es la opción más sencilla para darle acceso a la red a nuestra máquina virtual. La máquina virtual necesitará tener su identificación propia en la red (su propia dirección IP) que generalmente le será asignada por DHCP o también podríamos asignarsela de manera manual. La máquina virtual una vez configurada su IP, será un nodo más dentro de la red (como si fuera un nodo físico) que podrá contactar a otros nodos de la red y a su vez podrá ser contactada por el resto de los equipos.

Si elegimos esta configuración debemos asegurarnos que cada máquina virtual posea su propia dirección.

Network Address Translation
 con este tipo de configuración la máquina virtual compartirá la MAC y la dirección IP del host (equipo anfitrión). Ambas tendrán una única identificación de red que no será visible fuera de dicha red. La configuración NAT puede ser útil si solo se dispone de una única dirección IP o MAC. También podríamos tener diferentes máquinas virtuales compartiendo la misma IP del host pero manejando servicios diferentes, por ejemplo una para requerimientos HTTP y otra FTP.

Link to nat_1.png

Cuando se configura NAT, como ya se dijo la máquina virtual no tendrá su propia dirección para red externa, a cambio se establece una red privada sobre el computador host. La máquina virtual obtendrá la dirección IP que le asignará un VMware virtual DHCP server. Existe un módulo interno conocido como VMware NAT device que se encarga de parsar los datos entre una o varias máquinas virtuales y la red externa.

Con NAT la máquina virtual podrá utilizar protocolos TCP/IP estandard para conectarse a otras máquinas en red externa, por ejemplo podríamos navegar via WEB por HTTP y transferir archivos via FTP y realizar Telnet a otros computadores, sin embargo la configuración por defecto no permite que equipos externos puedan contactar con máquinas virtuales NAT, lo que podría tener como consecuencia que si una máquina virtual es establecida como servidor Web nunca podrá enviar páginas a equipos que se encuentren en la red externa.


Host-only network
esta opción configura la máquina virtual para que solo podamos tener acceso desde la red al host. Esta configuración provee una conexión de red entre la máquina virtual y el computador anfitrión usando un adpatador Ethernet vitual que es visible por el sistema operativo del anfitirión. Esta opción puede ser útil si queremos configurar una red virtual aislada.

Link to host-only_1.png

si usamos este tipo de configuración para el adaptador de red,  la máquina virtual y el anfitrión se conectarán por una red privada virtual y las direcciones de dicha red serán asignadas por un módulo conocido como VMware DHCP server.


Fuente:
https://www.vmware.com/support/ws5/doc/ws_net_basics.html

sábado, febrero 21, 2015

Warriors of the net (Guerreros de la red)

Excelente animación que muestra, de manera muy creativa y a un público no técnico, como funciona la Internet.

Particularmente me pareció genial la ejemplificación de como el firewall destino filtra los paquetes

Disfrútenlo.