miércoles, 26 de marzo de 2014

Protocolo de Mensajes de Control de Internet o ICMP (Internet Control Message Protocol)

Protocolo de Mensajes de Control de Internet o ICMP (Internet Control Message Protocol)

Es el sub protocolo de control y notificación de errores del Protocolo de Internet (IP). Como tal, se usa para enviar mensajes de error, indicando por ejemplo que un servicio determinado no está disponible o que un router o host no puede ser localizado. También puede ser utilizado para transmitir mensajes ICMP Query.

Type(Tipo)
El primer octeto (1 byte) de la parte de datos del datagrama es el campo de tipo ICMP; el valor de este campo determina el formato del resto de los datos. Para este caso particular, es un tipo 8, Mensaje de Eco o de Respuesta de Eco ("Echo or Echo Reply Message"), es decir, se utilizo el comando ping. La dirección del origen en un mensaje de eco será la del destino del mensaje de respuesta de eco. Para componer un mensaje de respuesta de eco, simplemente se invierten las direcciones de origen y destino, el código de tipo se cambia a 0 y se vuelve a calcular la suma de control.

Code(Código)
Corresponde al segundo octeto y es un subtipo al tipo dado. En este caso particular 0. El Tipo 8 solo tiene el Código asociado 0. Otros Tipos, tienen más opciones de Código posibles.

Checksum(Suma de control)
Es el complemento a uno de 16 bits (2 bytes) de la suma de los complementos a uno del mensaje ICMP, comenzando por el Tipo ICMP.  A la hora de calcular la suma de control, el valor inicial de este campo es cero. En este caso el valor del campo es 94A7 en hexadecimal y 1001010010100111 en binario.

Para el cálculo del Checksum se procede de la misma forma que para computar el Checksum del protocolo IP:

La cabecera ICMP mas datos tiene el siguiente valor: 080094A763580000 en hexadecimal, para realizar el cálculo se tiene que colocar el campo del Checksum en 0, es decir: 0800000063580000 y después proceder.

Se realiza la suma a 16 bits:
Operador Hexadecimal Binario
+ 0800 0000100000000000
0000 0000000000000000
Resultado: 0800 0000100000000000

Se vuelve a realizar la suma del resultado anterior con los siguientes 16 bits del datagrama:
Operador Hexadecimal Binario
+ 0800 0000100000000000
6358 0110001101011000
Resultado: 6B58 0110101101011000

Se vuelve a realizar la suma del resultado anterior con los siguientes 16 bits del datagrama:
Operador Hexadecimal Binario
+ 6B58 0110101101011000
0000 0000000000000000
Resultado: 6B58 0110101101011000

Realizando el complemento a uno del último resultado, se tiene:[94A7] 1001010010100111

Que viene a ser el valor del campo Checksum.

Identifier(Identificador) y Sequence number (Número de secuencia)
El identificador (2 bytes) y el número de secuencia (2 bytes) pueden ser usados por el emisor para corresponder con las solicitudes de Eco. Por ejemplo, el identificador podría ser utilizado como un puerto en TCP o UDP para identificar una sesión, y el número de secuencia podría ser incrementado en cada eco de solicitud enviada. El generador de ecos devuelve estos mismos valores en la respuesta de eco.

En este caso particular, al ser este datagrama una solicitud de Eco, se está utilizando el identificador de manera similar a un puerto en TCP. Por ejemplo, si tenemos dos aplicaciones ping corriendo, la única manera de saber a qué aplicación pertenece un datagrama es por el identificador. El número de secuencia esta en 0 y no es utilizado.

En cuanto a las abreviaturas entre paréntesis BE (Big Endian) y LE (Liitle Endian), son formatos del identificador y numero de secuencia que utiliza wireshark para que sea más fácil seguirlos cuando se incrementan de una solicitud/respuesta de Eco a la siguiente. La razón para que ambos formatos se muestren es porque a veces los campos se rellenan como Big Endian (Byte de mayor peso) o Little Endian (Byte de menor peso) y no existe una manera definitiva de saber que formato es a partir de los contenidos del datagrama.

El texto “[Response In: 8]”, no es un campo del datagrama sino información que proporciona wireshark y que quiere decir que hay una respuesta de eco (Echo Reply) en el datagrama numero 8 de la lista de protocolos capturados.

Fuentes de información:
http://es.wikipedia.org/wiki/Internet_Control_Message_Protocol
http://www.rfc-es.org/rfc/rfc0792-es.txt
http://ask.wireshark.org/questions/3172/icmp-sequence-number-be-vs-le
http://en.wikipedia.org/wiki/Internet_Control_Message_Protocol

Enlaces de interes:
Analizando el datagrama IP

jueves, 11 de septiembre de 2008

Analizando el datagrama IP


Versión: 4 bits
Siempre vale lo mismo 4 en hexadecimal y 0100 en binario. Este campo describe el formato de la cabecera utilizada. En este caso es la versión 4.



Tamaño Cabecera (IHL): 4 bits
Longitud de la cabecera, en palabras de 32 bits. Su valor mínimo es de 5 para una cabecera correcta, y el máximo de 15. En este caso particular es 5 y multiplicado por 32 bits da como resultado 160 bits o 20 bytes.


Tipo de Servicio: 8 bits
Indica una serie de parámetros sobre la calidad de servicio deseada durante el tránsito por una red. Algunas redes ofrecen prioridades de servicios, considerando determinado tipo de paquetes "más importantes" que otros (en particular estas redes solo admiten los paquetes con prioridad alta en momentos de sobrecarga). Estos 8 bits se agrupan de la siguiente manera. Los 5 bits de menos peso son independientes e indican características del servicio:


Bit 0: sin uso, debe permanecer en 0.
Bit 1: 1 costo mínimo, 0 costo normal.
Bit 2: 1 máxima fiabilidad, 0 fiabilidad normal.
Bit 3: 1 maximo rendimiento, 0 rendimiento normal.
Bit 4: 1 mínimo retardo, 0 retardo normal.
Los 3 bits restantes están relacionados con la precedencia de los mensajes, un indicador ajunto que indica el nivel de urgencia basado en el sistema militar de precedencia (véase Message Precedence) de la CCEB, un organización de comunicaciones electrónicas militares formada por 5 naciones. La urgencia que estos estados representan aumenta a medida que el número formado por estos 3 bits lo hace, y responden a los siguientes nombres.
000: De rutina.
001: Prioritario.
010: Inmediato.
011: Relámpago.
100: Invalidación relámpago.
101: Procesando llamada crítica y de emergencia.
110: Control de trabajo de Internet.
111: Control de red.

Longitud Total: 16 bits
Es el tamaño total, en octetos, del datagrama, incluyendo el tamaño de la cabecera y el de los datos. El tamaño máximo de los datagramas usados normalmente es de 576 octetos (64 de cabeceras y 512 de datos). Una máquina no debería enviar datagramas mayores a no ser que tenga la certeza de que van a ser aceptados por la máquina destino.
En caso de fragmentación este campo contendrá el tamaño del fragmento, no el del datagrama original.

En este caso la longitud total es de 48 octetos, divididos de la siguiente manera: 20 octetos para la cabecera IP y 28 octetos para los datos.

Identificador: 16 bits
Identificador único del datagrama. También se utilizará, en caso de que el datagrama deba ser fragmentado, para poder distinguir los fragmentos de un datagrama de los de otro. El originador del datagrama debe asegurar un valor único para la pareja origen-destino y el tipo de protocolo durante el tiempo que el datagrama pueda estar activo en la red.

En este caso aunque el datagrama no está fragmentado el identificador del datagrama es: 2A96 en hexadecimal, 10902 en decimal y 0010101010010110 en binario.

Indicadores: 3 bits
Actualmente utilizado sólo para especificar valores relativos a la fragmentación de paquetes:

Bit 0: Reservado; debe ser 0
Bit 1: 0=Divisible, 1=No divisible
Bit 2: 0=Ultimo fragmento, 1=Fragmento intermedio (le siguen mas fragmentos)

La indicación de que un paquete es indivisible debe ser tenida en cuenta bajo cualquier circunstancia. Si el paquete necesitara ser fragmentado, no se enviará.

En este caso el campo tiene un valor de 010 en binario, lo que significa que el paquete no es divisible ó no está fragmentado.

Posición de Fragmento: 13 bits
En paquetes fragmentados indica la posición, en unidades de 64 bits, que ocupa el paquete actual dentro del datagrama original. El primer paquete de una serie de fragmentos contendrá en este campo el valor 0.

En este caso el campo tiene un valor de 0000000000000 en binario, indicando que es el primero, pero también que es el único paquete porque no está fragmentado.

Tiempo de Vida (TTL): 8 bits
Indica el máximo número de direccionadores que un paquete puede atravesar. Cada vez que algún nodo procesa este paquete disminuye su valor en, como mínimo, un direccionador. Cuando llegue a ser 0, el paquete no será reenviado.

En este caso el valor es de 128 en decimal, 80 en hexadecimal y 10000000 en binario. Este número es considerado el óptimo para aprovechar el rendimiento de Internet. Con este valor el datagrama es enviado y será decrementado en 1 por cada uno de los nodos por los que pase antes de llegar al destino.

Protocolo: 8 bits
Indica el protocolo de siguiente nivel utilizado en la parte de datos del datagrama. En este caso el protocolo es TCP, 06 en hexadecimal y decimal y 00000110 en binario.

Checksum Cabecera: 16 bits
Checksum de la cabecera. Se recalcula cada vez que algún nodo cambia alguno de sus campos (por ejemplo, el Tiempo de Vida). El método de cálculo (intencionadamente simple) consiste en sumar el complemento a 1 de cada palabra de 16 bits y hacer el complemento a uno del valor resultante. En este caso el campo tiene el valor d7fe en hexadecimal y 1101011111111110 en binario, el cálculo es el siguiente:

Primero: Asumimos que el valor del Checksum es 0000 en hexadecimal.

Segundo: Realizamos la suma de las palabras de 16 bits de la cabecera del protocolo IP.

[Hex] Binario Suma
[4500] 0100010100000000 0100010100000000
[0030] 0000000000110000 0100010100110000
[2a96] 0010101010010110 0110111111000110
[4000] 0100000000000000 1010111111000110
[8006] 1000000000000110 10010111111001100
0010111111001100 + 1 = 0010111111001101
[0000] 0000000000000000 0010111111001101 (Checksum)
[c80d] 1100100000001101 1111011111011010
[9e29] 1001111000101001 11001011000000011
1001011000000011 + 1 = 1001011000000100
[c869] 1100100001101001 10101111001101101
0101111001101101 + 1 = 0101111001101110
[c992] 1100100110010010 10010100000000000
0010100000000000 + 1 = 0010100000000001

Tercero: Realizamos el complemento a uno al valor de la suma.

Suma: 0010100000000001
Complemento a 1: 1101011111111110 [d7fe]

El resultado es el valor del Checksum: d7fe en hexadecimal o 1101011111111110 en binario.

Dirección IP de origen: 32 bits
El valor es c8.0d.9e.29 en hexadecimal, 11001000.00001101.10011110.00101001 en binario y 200.13.158.41 en decimal.

Dirección IP de destino: 32 bits
El valor es c8.69.c9.92 en hexadecimal, 11001000.01101001.11001001.10010010 200.105.201.146

Opciones: Variable
Aunque no es obligatoria la utilización de este campo, cualquier nodo debe ser capaz de interpretarlo. Puede contener un número indeterminado de opciones, que tendrán dos posibles formatos. Este datagrama no cuenta con este campo.

Relleno: Variable
Utilizado para asegurar que el tamaño, en bits, de la cabecera es un múltiplo de 32. El valor usado es cero. Este caso no cuenta con ese campo.

Referencias
http://es.wikipedia.org/wiki/Cabecera_IP
Protocolo de Mensajes de Control de Internet o ICMP (Internet Control Message Protocol)

jueves, 3 de julio de 2008

Analizando la trama Ethernet II con Wireshark

En este primer caso, se analiza cada una de las cabeceras que tiene una trama Ethernet II con un ejemplo concreto. La trama Ethernet II, se compone de un Preámbulo, Dirección de destino, Dirección de fuente, Tipo de protocolo, Datos y una Secuencia de verificación de trama que se detalla con un ejemplo en Wireshark.


Preámbulo (Preamble)
Este campo contiene 62 bits de 1 y 0 en forma alternada finalizando con dos bits de 1 (en total 8 bytes), permitiendo ajustar los tiempos de ambas tarjetas (computadoras o equipos de comunicaciones) para tener una transmisión digital sincronizada. El campo no es mostrado por el Wireshark pero siempre tiene el formato siguiente: 10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101011.


Dirección de destino(Destination Address)
Corresponde a la dirección Ethernet (6 bytes) de la tarjeta Ethernet de destino de la trama a transmitir. Si esta dirección se compone enteramente de 1, entonces significa que es un mensaje Broadcast, vale decir, un mensaje para todas las estaciones de la red local. Los primeros 3 bytes de esta dirección están normados por la IEEE y cada fabricante de tarjetas Ethernet le corresponde un único trió. En este caso la dirección de destino es 14:9e:20:00:02:00 en hexadecimal o 00010100 10011110 00100000 00000000 00000010 00000000 en binario.

Dirección de origen (Source Address)
Corresponde a la dirección Ethernet (6 bytes) de la tarjeta Ethernet que envía la trama a transmitir. Los primeros 3 bytes de esta dirección están normados por la IEEE y cada fabricante de tarjetas Ethernet le corresponde un único trió. En este caso la dirección de origen es 02:00:02:00:00:00 en hexadecimal o 00000010 00000000 00000010 00000000 00000000 00000000 en binario.

Tipo de protocolo (Ether Type)
Este campo indica el tipo de protocolo que está ocupando el formato de la trama Ethernet versión II. En otras palabras, diferencia los distintos tipos de protocolos de capas superiores que puedan ocupar Ethernet. IP tiene un Ether Type de valor 0x0800, ARP tiene valor 0x0806, IPX tiene 0x8137. Todos los valores son asignados por la IEEE en el RFC 1700 y poseen valores mayores de 0x05DC (1500 decimal). En este caso el protocolo es IP 0x0800 en hexadecimal y el paquete IP viene contenido en el campo DATA de esta trama Ethernet II.

Datos (DATA)
Es en este campo donde reside la información transmitida y que generalmente consiste de paquetes de tramas superiores. En este caso el campo DATA contiene un paquete IP que lo analizare en otro artículo.

Secuencia de verificación de trama (FCS)
Frame Check Sequence (FCS o CRC) es un campo de 4 bytes que contiene un checksum que permite revisar la integridad del paquete recibido para ser entregado a las capas superiores o descartado. Este campo tampoco es mostrado por el Wireshark debido a que la configuración del sistema operativo (Windows XP SP2) no permite capturar el campo FCS de la trama Ethernet II.
Referencias

Enlaces de interes: