Una dirección IP es un número de 32 bits que identifica de manera lógica y jerárquica a una interfaz de un dispositivo (habitualmente una computadora) dentro de una red que utilice el protocolo IP (Internet Protocol).
Dicho número es distinto de la dirección MAC que es un número hexadecimal asignado a la tarjeta o dispositivo de red por el fabricante.
La dirección IP de una máquina puede cambiar con la conexión. A esta forma de asignación de dirección IP se denomina una dirección IP dinámica. DHCP (Dynamic Host Configuration Protocol) es un protocolo para asignar direcciones IP dinámicas.
En la expresión de direcciones IPv4 en decimal se separa cada octeto por un carácter ".". Cada uno de estos octetos puede estar comprendido entre 0 y 255, salvo algunas excepciones. Los ceros iniciales, si los hubiera, se pueden obviar. Por ejemplo: 164.12.123.65
Una dirección IP se descompone de forma arbitraria en una parte de red y una parte de máquina. Por ejemplo 164.12.123 puede ser la parte de red y 65 la parte de máquina (host). Para describir en que punto se parte una IP se usa una máscara de red o netmask la cual es un número cuya representación binaria tiene unos en la parte de red.
Hay tres clases de direcciones IP que una organización puede recibir de parte de la Internet Corporation for Assigned Names and Numbers (ICANN): clase A, clase B y clase C.
Hay una serie de direcciones reservadas:
0.0.0.0
es utilizada por las máquinas cuando están arrancando o
no se les ha asignado dirección.
127.x.x.x
se reservan para pruebas de retroalimentación
(en términos CIDR la subred 127.0.0.0/8).
Se denomina dirección de bucle local o loopback. Cualquier mensaje
que se envía a una de estas direcciones es recibido por localhost
.
Véase un ejemplo:
pp2@mimaquina:/tmp$ ssh 127.232.101.249 The authenticity of host '127.232.101.249 (127.232.101.249)' can't be established. RSA key fingerprint is b6:39:26:69:c3:6e:39:f1:d4:70:36:6c:57:36:98:fa. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '127.232.101.249' (RSA) to the list of known hosts. Linux mimaquina.deioc.ull.es 2.6.18-5-686 #1 SMP Mon Dec 24 16:41:07 UTC 2007 i686 You have new mail. Last login: Thu Apr 24 15:55:41 2008 from mimaquina pp2@mimaquina:~$
Hay ciertas direcciones en cada clase de dirección IP que no están asignadas y que se denominan direcciones privadas. Las direcciones privadas pueden ser utilizadas por los hosts que usan traducción de dirección de red (NAT) para conectarse a una red pública o por los hosts que no se conectan a Internet. En una misma red no puede existir dos direcciones iguales, pero sí se pueden repetir en dos redes privadas que no tengan conexión entre sí o que se sea a través de NAT. Las direcciones privadas son:
El sistema Classless Inter-Domain Routing (CIDR) permite
que la máscara de red no tenga que terminar en una frontera de byte.
Por ejemplo la dirección 216.240.32.0/27
indica que
la máscara de red contiene 27 bits dando lugar a una red de tamaño 32.
El módulo Net::Netmask nos permite calcular las diferentes partes de una máscara en notación CIDR:
pp2@nereida$ perl -MNet::Netmask -wde 0 main::(-e:1): 0 DB<1> $x = Net::Netmask->new('216.240.32.0/27') DB<2> p $x->size() # Tamaño de la red 32 DB<3> p $x->bits() # Número de bits en la máscara 27 DB<4> p $x->hostmask() # Máscara de máquina 0.0.0.31 DB<5> p $x->base() # Primera dirección: red 216.240.32.0 DB<6> p $x->broadcast() # Última: broadcast 216.240.32.31 DB<7> p $x->mask() # Máscara de red 255.255.255.224 DB<8> printf "%b",224 # 3 bits a uno 11100000 DB<9> x $x # El objeto 0 Net::Netmask=HASH(0x848e7e8) 'BITS' => 27 'IBASE' => 3639615488 DB<10> p $x->match('216.240.32.16') # Pertenece 16 DB<11> p $x->match('216.240.29.16') # No pertenece 0 DB<13> p "<".$x->match('216.240.32.0').">" <0 > DB<14> p $x->maxblock # Máscara de la dirección de base 19 DB<18> @a = $x->enumerate # Enumerar direcciones DB<19> p "@a[0..3,-4..-1]" 216.240.32.0 216.240.32.1 216.240.32.2 216.240.32.3 \ 216.240.32.28 216.240.32.29 216.240.32.30 216.240.32.31 DB<20> @b = $x->inaddr() # zonas DNS DB<22> $" = "," DB<23> p "@b[-4..-1]" ,32.240.216.in-addr.arpa,0,31 DB<24>
Una zona es una porción del espacio de nombres DNS cuya responsabilidad ha sido delegada a una organización.
Una vez que el mensaje llega a la IP de destino es necesario conocer a que programa/proceso hay que entregarlo. Esta es la función del número de puerto: un número de puerto es un número de 16 bits (de 1 a 65535) que sirve para identificar el proceso al que entregar el mensaje dentro de la máquina.
Un socket es una interfaz de entrada-salida de datos que permite la intercomunicación entre procesos. Los procesos pueden estar ejecutándose en el mismo o en distintos sistemas, unidos mediante una red. Un identificador de socket es una pareja formada por una dirección IP y un puerto. Cuando un programa crea un socket puede solicitarle al sistema operativo que asocie un número de puerto con el socket.
Hay dos tipos de sockets que son especialmente importantes: Streams y Datagrams.
Los Sockets Stream son los más utilizados, hacen uso del protocolo TCP, el cual nos provee un flujo de datos bidireccional, secuenciado, sin duplicación de paquetes y libre de errores. La especificación del protocolo TCP se puede leer en la RFC-793 .
Los Sockets Datagram hacen uso del protocolo UDP, el cual nos provee un flujo de datos bidireccional, pero los paquetes pueden llegar fuera de secuencia, pueden no llegar o contener errores. Se llaman también sockets sin conexión, porque no hay que mantener una conexión activa, como en el caso de sockets stream. Son utilizados para transferencia de información paquete por paquete.
De hecho hay dos conjuntos de números de puerto: uno para sockets TCP y otro para sockets UDP. Los números de puerto del 0 al 1023 están reservados para servicios bien conocidos. la mayor parte de los servicios usan bien TCP bien UDP pero hay algunos que pueden comunicar con los dos protocolos. Internet Corporation for Assigned Names and Numbers (ICANN) reserva habitualmente ambos números TCP y UDP para el mismo servicio.
En algunas versiones de Unix los puertos del 49152 al 65535 se reservan para la asignación automática de conexiones cuando el número de puerto no se ha explicitado. Los restantes en el rango 1024 a 49151 estan libre para uso por nuestras aplicaciones. Es una buena idea comprobar que el número de puerto solicitado esta libre usando, por ejemplo, netstat :
pp2@unamaquina:~/Lbook$ netstat -t Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 unamaquina:www 200-112-136-16.bbt:3217 SYN_RECV tcp 0 0 unamaquina:www crawl12.exabot.co:35207 TIME_WAIT tcp 0 0 unamaquina:www 122.red-83-58-106:10646 FIN_WAIT2 tcp 0 0 unamaquina:42373 funchal:ssh ESTABLISHED tcp 0 0 unamaquina:41987 funchal:ssh ESTABLISHED tcp 0 0 unamaquina:55541 funchal:ssh ESTABLISHED tcp 0 0 unamaquina:56452 fk-in-f147.google.c:www ESTABLISHED tcp 0 0 unamaquina:56451 mg-in-f83.google.co:www ESTABLISHED tcp 0 0 unamaquina:56462 mg-in-f83.google.co:www ESTABLISHED