Cálculo del campo de checksum en el header del datagrama IP

Ejercicio: De acuerdo con el RFC791, Internet Protocol, ¿cúal sería el checksum para el siguiente datagrama IP? (La información mostrada está dentro de un frame Ethernet V2 y no se muestra el checksum del header IP,  ni el CRC ni el preámbulo para Ethernet).

            Offset: Hexadecimal                                ASCII
      ------- -----------                                -----
           0: 00e0 1ede 72d6 0800 2073 5ec6 0800 4500    ....r... s^...E.
          16: 003c 0a1c 4000 ff06 ____ a8b0 0319 a8b0    .<..@...........
          32: 036c 0015 0593 2950 13c0 008a caca 5018    .l....)P......P.
          48: 2398 9b4a 0000 3230 3020 5479 7065 2073    #..J..200 Type s
          64: 6574 2074 6f20 412e 0d0a                   et to A...

Solución: Recordemos que el texto del RFC791 dice lo siguiente acerca del cálculo del campo del checksum para IP:

[...]
Header Checksum:  16 bits
 
    A checksum on the header only.  Since some header fields change
    (e.g., time to live), this is recomputed and verified at each point
    that the internet header is processed.
 
    The checksum algorithm is:
 
      The checksum field is the 16 bit one's complement of the one's
      complement sum of all 16 bit words in the header.  For purposes of
      computing the checksum, the value of the checksum field is zero.
 
    This is a simple to compute checksum and experimental evidence
    indicates it is adequate, but it is provisional and may be replaced
    by a CRC procedure, depending on further experience.
[...]
Es decir que el checksum para IP sólo se calcula sobre los octetos que componen el header de IP.

También debemos recordar los formatos del frame Ethernet y el header IPv4:

  • Formato del frame Ethernet (el tamaño de los campos está en bytes)
  • Formato del header de IPv4
  • Ahora debemos separar del frame el header IPv4 (que es el que nos interesa para hacer nuestros cálculos):
            4500 003c  \
            0a1c 4000  |
            ff06 ____   > Header IPv4
            a8b0 0319  |
            a8b0 036c  /
    Ahora debemos sumar, con aritmetica complemento a uno, todos los campos que componen el header IP, como palabras de 16 bits

    Suma con aritmética complemento a uno del header IP

    Nota: En este momento el campo de checksum está en 0000000000000000 (además, el cálculo se hace con sumas parciales para facilitar el manejo del los acarreos que ocurran, pues en la aritmética complemento a uno, cuando una operación genera un acarreo (carry) en el bit más significativo, se debe incrementar el resultado).

    Primero sumaremos los primeros 5 enteros de 16 bits que conforman el header IP:

       [Hex]    Binario
       [4500]   0100010100000000
       [003c]   0000000000111100
       [0a1c]   0000101000011100
       [4000]   0100000000000000
       [ff06]   1111111100000110
      [18E5E]  11000111001011110  --> 1000111001011110 + 1 = 1000111001011111 [8E5F]

    Ahora sumaremos los otros campos que faltan del header IP:

       [Hex]    Binario
       [0000]   0000000000000000
       [a8b0]   1010100010110000
       [0319]   0000001100011001
       [a8b0]   1010100010110000
       [036c]   0000001101101100
      [157E5]  10101011111100101   --> 0101011111100101 + 1 = 0101011111100110 [57E6]

    Finalmente sumamos los dos resultados parciales para obtener el total:

       [Hex]    Binario
       [8E5F]   1000111001011111
       [57E6]   0101011111100110
       [E645]   1110011001000101
     

    Y por fin, el checksum...

    Para calcular el checksum debemos calcular el complemento a uno del resultado obtenido antes. El complemento a uno se obtiene convirtiendo todos los ceros en unos y todos los unos en cero. De esta forma, el complemento a uno de 1110011001000101 es 0001100110111010. Que vendría a ser el checksum: el hexadecimal 19BA.

    Así que el frame completo sería:

               Offset: Hexadecimal                                ASCII
          ------- -----------                                -----
               0: 00e0 1ede 72d6 0800 2073 5ec6 0800 4500    ....r... s^...E.
              16: 003c 0a1c 4000 ff06 19ba a8b0 0319 a8b0    .<..@...........
              32: 036c 0015 0593 2950 13c0 008a caca 5018    .l....)P......P.
              48: 2398 9b4a 0000 3230 3020 5479 7065 2073    #..J..200 Type s
              64: 6574 2074 6f20 412e 0d0a                   et to A...

    [Algoritmo de checksum de Internet]
    [Checksum en IP]
    [Checksum en UDP]
    [Checksum en TCP]



    ©Oscar Agudelo.  2000-2003. Todos los derechos reservados.