Cabecera IP
# Cabecera IP

## Formato de la cabecera IP

Formato de la Cabecera IP (Versión 4) :

| 0-3 | 4-7 | 8-15 | 16-18 | 19-31 |
| - | - | - | - | - |
| Versión | Tamaño Cabecera | Tipo de Servicio | Longitud Total | Longitud Total |
| Identificador | Identificador | Identificador | Flags | Posición de Fragmento |
| Tiempo de vida | Tiempo de vida | Protocolo | Suma de Control de Cabecera | Suma de Control de Cabecera |
| Dirección IP de Origen |||||
| Dirección IP de Destino |||||
| Opciones | Opciones | Opciones | Opciones | Relleno |

## Descripción de cada uno de los campos

El tamaño mínimo de la cabecera (ip_pci) es de 20 bytes mientras que el máximo es 60 bytes.

### Versión: 4 bits

Puede variar entre (0100) o (0110) dependiendo si se utiliza IP versión 4 (IPv4) o IP versión 6 (IPv6). Este campo describe el formato de la cabecera utilizada. En la tabla se describe 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 palabras (5x32 = 160 bits, 20 bytes) para una cabecera correcta, y el máximo de 15 palabras (15x32 = 480 bits, 60 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 3 primeros bits están relacionados con la precedencia de los mensajes, un indicador adjunto 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 de estos estados 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.
* Los 5 bits de menor peso son independientes e indican características del servicio.

**Desglose de bits**


    Bits 0 a 2: Prioridad.
    Bit 3: Retardo. 0 = normal ; 1 = bajo.
    Bit 4: Rendimiento. 0= normal; 1= alto.
    Bit 5: Fiabilidad. 0=normal; 1= alta.
    Bit 6-7: No usados. Reservados para uso futuro.

### 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ínimo de los datagramas usados normalmente es de 576 octetos (64 de cabeceras y 512 de datos). Una máquina no debería enviar datagramas menores o mayores de ese tamaño 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.

### Identificador: 16 bits

Identificador único del datagrama. 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. El valor asignado en este campo debe ir en formato de red.

### Flags: 3 bits

Actualmente utilizado solo para especificar valores relativos a la fragmentación de paquetes. Los 3 bits (por orden de mayor a menor peso) son:

    bit 0: Reservado; debe ser 0
    bit 1: 0 = Divisible, 1 = No Divisible (DF)
    bit 2: 0 = Último Fragmento, 1 = Fragmento Intermedio (le siguen más fragmentos) (MF)
    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á.

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

### Tiempo de Vida (TTL): 8 bits

Indica el máximo número de enrutadores que un paquete puede atravesar. Cada vez que algún nodo procesa este paquete disminuye su valor en, como mínimo, una unidad. Cuando llegue a ser 0, el paquete será descartado. Típicamente toma el valor 64 o 128 en los datagramas.

### Protocolo: 8 bits

Indica el protocolo de las capas superiores al que debe entregarse el paquete Vea Números de protocolo IP para comprender como interpretar este campo.

### Suma de Control de Cabecera: 16 bits

    Suma de control de 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 en complemento a 1 cada palabra de 16 bits de la cabecera (considerando valor 0 para el campo de suma de control de cabecera) y hacer el complemento a 1 del valor resultante.

### Dirección IP de origen: 32 bits

    Ver Direcciones IP. Debe ser dada en formato de red.

### Dirección IP de destino: 32 bits

    Ver Direcciones IP. Debe ser dada en formato de red.

### 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:

**Formato de opciones simple**

Se determina con un solo octeto indicando el 'Tipo de opción', el cual está dividido en 3 campos.

* Indicador de copia: 1 bit. En caso de fragmentación, la opción se copiará o no a cada nuevo fragmento según el valor de este campo:

    0 = no se copia
    1 = se copia.
* Clase de opción: 2 bits. Las posibles clases son:

    0 = control
    1 = reservada
    2 = depuración y mediciones
    3 = reservada
* Número de opción: 5 bits. Identificador de la opción.

**Formato de opciones compuesto**

Un octeto para el 'Tipo de opción', otro para el 'Tamaño de opción', y uno o más octetos conformando los 'Datos de opción'.

El 'Tamaño de opción' incluye el octeto de 'Tipo de opción', el de 'Tamaño de opción' y la suma de los octetos de datos.

La siguiente tabla muestra las opciones actualmente definidas:

| Clase | Número | Tamaño | Descripción |
| - | - | - | - |
| 0 | 0 | - | Final de lista de opciones. Formato simple. |
| 0 | 1 | - | Ninguna operación (NOP). Formato simple. |
| 0 | 2 | 11 | Seguridad. |
| 0 | 3 | variable | Enrutado desde el Origen, abierto (Loose Source Routing). |
| 0 | 9 | variable | Enrutado desde el Origen, estricto (Strict Source Routing). |
| 0 | 7 | variable | Registro de Ruta (Record Route). |
| 0 | 8 | 4 | Identificador de flujo (Stream ID). |
| 2 | 4 | variable | Marca de tiempo (Internet Timestamping). |

* 'Final de Lista de Opciones': Se usa al final de la lista de opciones, si ésta no coincide con el final de la cabecera IP.
* 'Ninguna Operación (NOP)': Se puede usar para forzar la alineación de las opciones en palabras de 32 bits.
* 'Seguridad': Especifica niveles de seguridad que van desde "No Clasificado" hasta "Máximo Secreto", definidos por la Agencia de Seguridad Nacional de la Defensa de EE. UU.
* 'Enrutado desde el Origen (abierto) y Registro de Ruta (LSSR)': Esta opción provee el mecanismo para que el originador de un datagrama pueda indicar el itinerario que ha de seguir a través de la red y para registrar el camino seguido.

    Los Datos de Opción consisten en un puntero (un octeto) y una lista de direcciones IP (4 octetos cada una) que se han de alcanzar ("procesar").
    El puntero indica la posición de la siguiente dirección de la ruta, dentro de la Opción; así, su valor mínimo es de 4.
    Cuando un nodo de Internet procesa la dirección de la lista apuntada por el puntero (es decir, se alcanza esa dirección) incrementa el puntero en 4, y redirige el paquete a la siguiente dirección. Si el puntero llega a ser mayor que el Tamaño de Opción significa que la información de ruta se ha procesado y registrado completamente y se redirigirá el paquete a su dirección de destino.
    Si se alcanza la dirección de destino antes de haber procesado la lista de direcciones completa (el puntero es menor que el Tamaño de Opción) la siguiente dirección de la lista reemplaza a la dirección de destino del paquete y es a su vez reemplazada por la dirección del nodo que está procesando el datagrama ("Ruta Registrada"), incrementando, además, el puntero en 4.
    Utilizando este método de sustituir la dirección especificada en origen por la Ruta Registrada se asegura que el tamaño de la Opción (y de la cabecera IP) no varía durante su recorrido por la red.
    Se considera que la ruta especificada por el originador es "abierta" porque cualquier nodo que procesa el paquete es libre de dirigirlo a la siguiente dirección siguiendo cualquier otra ruta intermedia.
    Solo puede usarse una vez en un datagrama, y, en caso de fragmentación, la opción se copiará a los paquetes resultantes.
* 'Enrutado desde el Origen (estricto) y Registro de Ruta (SSRR)': Exactamente igual que LSSR, excepto en el tratamiento que los nodos harán de este datagrama. Al ser la ruta especificada "estricta", un nodo debe reenviar el paquete directamente a la siguiente dirección, es decir, no podrá redireccionarlo por otra red.
* 'Registro de Ruta': Mediante el uso de esta Opción se puede registrar el itinerario de un datagrama. Los Datos de Opción consisten en un puntero (un octeto) y un espacio relleno de ceros que contendrá la Ruta Registrada para el paquete.

    Cuando un nodo recibe un paquete en el que está presente esta opción, escribirá su dirección IP en la posición indicada por el puntero, siempre que ésta sea menor que el Tamaño de Opción, e incrementará el puntero en 4.
    Es preciso que el espacio reservado para la Ruta Registrada tenga una longitud múltiplo de 4; si al intentar grabar su dirección un nodo detecta que existe espacio libre pero es menor de 4 octetos, el paquete no se reenvía (se pierde) y se notifica el error, mediante ICMP, al originador del datagrama.
    Esta Opción no se copia en caso de fragmentación, y solo puede aparecer una vez en un paquete.

### Relleno: Variable

Utilizado para asegurar que el tamaño, en bits, de la cabecera es un múltiplo de 32. El valor usado es el 0.

