Archivo de la categoría 'Redes'


Obtener la ciudad y el país de una dirección IP

Domingo, 24 may, 2009 @ 15:24 | Por Gustavo Cantero (The Wolf) | ASP.NET, GIS/Geolocalización, Redes

Muchos habrán notado que al ingresar en algunos sitios web éstos modifican su contenido, incluyendo idioma, publicidad, textos, etc., dependiendo del país desde el que estamos ingresando, por ejemplo, al ingresar en www.linksys.com desde Argentina éste nos redirecciona a www-ar.linksys.com, o al ingresar a www.google.com nos reenvía a www.google.com.ar. Para poder hacer esto la aplicación web busca la IP con la que estamos ingresando en una base de datos donde previamente se cargaron rangos de IP con su respectivo país.

Hasta acá todo parece muy obvio, el problema surge cuando nos preguntamos: ¿Dónde conseguimos estas bases de datos? La respuesta es sencilla: en internet.

En internet hay varios sitios que ofrecen, gratuitamente o como servicio pago, archivos con rangos de IP con su respectivo país. Muchos de estos sitios ofrecen además web services para poder consultar contra su base de datos la ubicación correspondiente a una dirección IP sin necesidad de tener los datos alojados en nuestro sitio. En este artículo voy a mostrar cómo obtener la ubicación consultando los datos en una base de datos local.

Uno de los sitios desde donde se pueden bajar estos datos es WebHosting.Info (www.webhosting.info), un sitio dedicado a dar servicios y estadísticas sobre ISP, WHOIS, Reverse IP Lookup, etc. Los datos que estos sitios ofrecen casi siempre están en archivos CSV, donde el país está codificado en ISO 3166 y la dirección IP está como un entero sin signo de 4 bytes llamado “número IP”.

Para obtener la lista de códigos de países según la ISO 3166 pueden ver en el sitio mismo de ISO, http://www.iso.org/iso/country_codes, o en Wikipedia, http://es.wikipedia.org/wiki/ISO_3166-1.
Para convertir la dirección IP en un número IP (un entero de 4 bytes) es una simple fórmula matemática donde lo que tenemos que hacer es un “shift left” de cada número para “posicionarlo” en el octeto correspondiente o, en español, moverlo hasta el byte correspondiente. Como cada byte representa 256 números (de 0 a 255), lo que debemos hacer es multiplicar cada octeto de la dirección por 256 elevado a la posición de ese byte. Supongamos que nuestra dirección a convertir es A.B.C.D, entonces lo que debemos hacer es:

(A * 256^3) + (B * 256^2) + (C * 256^1) + (D * 256^0)

Si reemplazamos las constantes por su resultado nos quedaría lo siguiente:

(A * 16777216) + (B * 65536) + (C * 256) + D

Ahora supongamos que la IP de mi cliente es la 190.2.8.88, entonces deberíamos hacer:

(190 * 16777216) + (2 * 65536) + (8 * 256) + 88 =
   3187671040    +   131072    +    2048   + 88 = 3187804248

Cabe mencionar que para obtener la dirección IP del usuario que se está conectando a nuestro sitio se debería leer el encabezado de la petición http. Para los desarrolladores de .NET esto se puede hacer simplemente utilizando la propiedad UserHostAddress del objeto Request del Page, por ejemplo, en C# sería:

string strIP = Page.Request.UserHostAddress;

o, para los usuarios de Visual Basic.NET:

Dim strIP as string = Page.Request.UserHostAddress

Obviamente la IP está en un string, con lo cual debería dividir cada octeto de la dirección, convertirlo a un tipo de dato numérico y hacer la fórmula. A continuación les dejo un ejemplo en C#:

//Convierto la IP a un entero de 32 bits
string[] strBytes = Page.Request.UserHostAddress.Split('.');
uint intNumeroIP=
    (uint.Parse(strBytes[0]) * 16777216) +
    (uint.Parse(strBytes[1]) * 65536) +
    (uint.Parse(strBytes[2]) * 256) +
    uint.Parse(strBytes[3]);

y, para los usuarios de Visual Basic.NET:

'Convierto la IP a un entero de 32 bits
Dim strBytes As String() = Page.Request.UserHostAddress.Split('.')
Dim intNumeroIP As UInteger = _
    (UInteger.Parse(strBytes(0)) * 16777216) + _
    (UInteger.Parse(strBytes(1)) * 65536) + _
    (UInteger.Parse(strBytes(2)) * 256) + _
    UInteger.Parse(strBytes(3))

Nótese que en el ejemplo utilicé un entero sin signo, esto es porque el número IP no lleva signo. También cabe notar que, aunque cada octeto se puede representar con un byte, yo lo convierto a un entero sin signo para evitar la conversión del tipo de dato al almacenarlo en la variable final.

Ahora con este número en mente lo podemos buscar en el archivo con la información de la localización de las IPs.  Obviamente lo mejor es guardar previamente la información de este archivo en una base de datos. Como mínimo deberíamos guardar la dirección IP y el país. Muchos de estos archivos de IP nos traen una “dirección desde” y una “dirección hasta” por cada línea del archivos, pero con almacenar la “dirección desde” ya nos alcanza.
Para los usuarios de motores de bases de datos como Oracle o MySql no tendrán problema con guardar los números IP en campos enteros de 4 bytes sin signo, pero para los usuarios de SQL Server se nos complica, ya que este motor no permite utilizar este tipo de datos. Para solucionar este inconveniente podemos hacer dos cosas: guardar el número en un campo del tipo entero de 8 bytes o a cada número IP restarle 2147483648.

Ahora sólo nos quedaría buscar la IP del usuario en la base, con un script sencillo como el siguiente para SQL Server:

SELECT TOP 1 Pais
FROM ListaIPs
WHERE IP >= 3187804248
ORDER BY IP DESC

Si en SQL Server elegimos utilizar un entero de 4 bytes (int) y restarle la mitad para no utilizar un entero de 8 bytes (bigint) habría que utilizar el valor 1040320600 en lugar de 3187804248.

Si quisiéramos hacer esta misma consulta pero utilizando MySql como motor de base de datos deberíamos utilizar un script como el siguiente:

SELECT Pais
FROM ListaIPs
WHERE IP >= 3187804248
ORDER BY IP DESC
LIMIT 1

Bien, hasta acá ya sabemos cómo obtener el país correspondiente a una dirección IP pero, como el título bien dice, también podemos obtener la ciudad correspondiente a esta dirección. Para esto la solución vuelve a ser sencilla, solamente tenemos que buscar en internet donde se puede conseguir una lista de IPs correspondiente a cada ciudad.  Un lugar donde se puede obtener esta lista es en IP Location Tools (http://iplocationtools.com), donde se puede conseguir la lista de país por IP y ciudad por IP, en formato CSV y en SQL. La única diferencia con el proceso anterior es que en la base de datos, además o en lugar de guardar el país, se debería guardar la ciudad.

Espero que este artículo les haya sido de utilidad y, como siempre, los animo a escribir sus consultas, sugerencias y comentarios.

VN:F [1.7.3_972]
Rating: 9.1/10 (14 votos cast)

Clases de direcciones IP

Martes, 18 nov, 2008 @ 21:43 | Por Gustavo Cantero (The Wolf) | Redes

Nuestras computadoras están la mayor parte del tiempo (si no todo) conectadas a una red IP, por ejemplo, a internet, en la cual se identifican ante los demás dispositivos a través de una dirección IP. Muchas son las veces que oímos hablar de direcciones IP pero no todo el mundo conoce las distintas clases en las que están divididas ni las restricciones que existen al utilizarlas, por lo cual se me ocurrió escribir una serie de artículos sobre redes IP y me pareció que lo mejor sería comenzar con la clasificación de las mismas.
En la actualidad hay dos tipos de direcciones IP que se utilizan: la IPv4 y la IPv6. Debido a que Internet y la gran mayoría de las redes actuales utilizan IPv4 este artículo se focalizará en esta versión del protocolo.

Cada dirección IP es en realidad (en la versión IPv4), un número de 32 bits, dividido en 4 octetos (números de 8 bits), separados por un punto. Una dirección IP de ejemplo podría ser la que muestro a continuación: 192.168.1.1 o, en su formato binario (tal como lo utiliza la computadora), 11000000. 10101000.00000001.00000001.
Para quienes no saben cómo convertir un número binario a uno en base 10 acá les acerco una fórmula sencilla: hay que tomar cada dígito, contando desde la derecha hacia la izquierda, y multiplicarlo por 2 elevado a la posición – 1, y luego sumar los valores obtenidos. Para que quede más claro se los muestro gráficamente convirtiendo el segundo octeto de nuestra dirección IP 10101000:

1 x 27 = 1 x 128 = 128
0 x 26 = 0 x 64 = 0
1 x 25 = 1 x 32 = 32
0 x 24 = 0 x 16 = 0
1 x 23 = 1 x 8 = 8
0 x 22 = 0 x 4 = 0
0 x 21 = 0 x 2 = 0
0 x 20 = 0 x 1 = 0

Si sumamos 128 + 32 + 8 nos da 168, o sea, el segundo octeto de la IP 192.168.1.1.

Una vez que se entendió como convertir números decimales a binarios seguro se preguntarán para que puede servirnos: la respuesta es que todos los cálculos y datos en computación se almacenan en binario, por lo tanto siempre es bueno saber esto, además de que nos permite entender algunas cosas como el número límite que se puede colocar en cada octeto de la dirección o a qué tipo de clase IP pertenece (esto lo veremos más adelante en este artículo). Como en binario el mayor número es el 1, el mayor número que puede ingresarse en un octeto va a ser 11111111, y si usamos la fórmula anterior para pasar este número a decimal vamos a llegar a la conclusión que es igual a 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1, o sea, es igual a 255, por lo tanto, la mayor (numéricamente hablando) dirección IP que se puede utilizar debería ser 255.255.255.255. Con este número en mente podemos decir la cantidad máxima de computadoras que se pueden conectar en una red IP lo podemos obtener multiplicando 255x255x255x255, o haciendo 2554 (o 322, ya que la dirección IP es un número binario de 32 posiciones), lo cual nos devuelve 4.228.250.625 computadoras, más de cuatro mil millones, aunque esto no es verdad ya que no se pueden utilizar todas las posibles combinaciones de octetos para escribir una dirección IP, sino que generalmente se utilizan sólo tres de las cincos clases de IP existentes (las cuales se detallan más abajo).

Cada dirección IP está también está dividida en dos partes: la dirección de red (network address) y la dirección del host (host address). La dirección de red también es conocida como “prefijo de red” (network prefix), ya que lo comparten todos los integrantes de una red.

En que parte de la dirección se “divide” entre la dirección de la red y del host depende de la máscara de subred (subnet mask), la cual depende de la clase de dirección IP.

Clases de direcciones IP

Para tener la flexibilidad de poder soportar redes de distinto tamaño las direcciones IP están divididas en cinco clases: A, B, C, D y E, aunque sólo se utilizan las tres primeras, ya que las D y E son usadas para multicast y experimentación respectivamente.

Para saber a qué clase pertenece una IP basta sólo con ver sus primeros bits:

  • Si el primer bit es 0, entonces la IP es de clase A
  • Si el primer bit es 1 y el siguiente es 0, entonces es de clase B
  • Si los dos primeros son 1, y el tercero es 0, entonces es de clase C

La clase C utiliza sus primeros tres octetos (los primeros 24 bits) para definir su dirección de red, dejando los últimos 8 (el último octeto) para definir su dirección de host. Esto nos dejaría, teóricamente, la posibilidad de conectar 256 (28) dispositivos pero, debido a que hay dos números reservados para la dirección de red y para la dirección de broadcast, nos deja un total de 254 dispositivos conectados con la misma dirección de red. Esta es la clase utilizada en la mayoría de las redes hogareñas y de las pequeñas o medianas empresas.
La clase B utiliza sus primeros dos octetos (16 bits) para definir la dirección de red y los dos restantes para la dirección del host, lo que nos da, quitando las dos direcciones mencionadas anteriormente, 216 – 2 = 65.534.
La clase A, al utilizar su primer octeto (8 bits) para definir la dirección de red, deja los 3 restantes para la dirección del host, o sea, 224 – 2 = 16.777.214 dispositivos por red.

A continuación muestro gráficamente como se componen las distintas clases de direcciones IP:

Cabe mencionar que aunque las direcciones IP de clase A tengan en su primer octeto el primer digito binario en 0, no se pueden utilizar direcciones IP donde su primer octeto sea 0, o sea, la dirección siempre debe comenzar con un número mayor o igual a 1.

Ya que la clase A posee el primero octeto para la dirección de red, la B los dos primeros, y la C los tres primeros, éstas direcciones también son conocidas como “/8”, “/16” y “/24” respectivamente por la cantidad de bits utilizados para el prefijo.

Basados en que los primeros dígitos binarios de las direcciones IP pueden ser 0, 10, o 110, podemos deducir la siguiente tabla de asignación de direcciones según la clase IP:

Clase de dirección IP Rango de direcciones
A o /8 1.xxx.xxx.xxx hasta 126.xxx.xxx.xxx
B o /16 128.0.xxx.xxx hasta 191.255.xxx.xxx
C o /24 192.0.0.xxx hasta 223.255.255.xxx

En el próximo artículo hablaré un poco de la máscara de redes y de subredes.
Los invito a dejar sus dudas o comentarios.

VN:F [1.7.3_972]
Rating: 9.4/10 (35 votos cast)

Warriors of the net – IP for the peace

Jueves, 09 oct, 2008 @ 14:30 | Por Gustavo Cantero (The Wolf) | Redes

Este video de la empresa Cisco (no comercial) explica de forma gráfica, muy sencilla y en español el funcionamiento de las redes, las capas OSI, el envio de paquetes, los routers y switchs, etc.

VN:F [1.7.3_972]
Rating: 9.5/10 (2 votos cast)