Direcciones IP, Números de Puertos y Sockets

Dirección IP

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).

Direcciones MAC

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.

DHCP

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.

Dotted Quad Address

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

Netmask

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.

Clases de Redes

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.

Direcciones IPs Reservadas

Hay una serie de direcciones reservadas:

Rangos IP Reservados

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:

Classless Inter-Domain Routing

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

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>

Zonas

Una zona es una porción del espacio de nombres DNS cuya responsabilidad ha sido delegada a una organización.

Puertos y Sockets

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.

Socket

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.

Sockets Stream

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 .

Sockets Datagram

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.

Puertos TCP y UDP

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.

Disponibilidad del Puerto

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



Subsecciones
Casiano Rodríguez León
2010-03-22