Ejercicio: De acuerdo con el RFC768,
User
Datagram Protocol, ¿cúal sería el checksum
para el siguiente mensaje UDP? (La información mostrada está
dentro de un frame Ethernet V2 y no se muestra el checksum del header UDP,
ni el CRC ni el preámbulo para Ethernet)
0: 0260 8ce8 5533 0800 2073 5ec6 0800 4500
.`..U3.. s^...E.
16: 0039 adab 4000 ff11 785c a8b0 0319 a8b0
.9..@...x\......
32: 0132 e574 0035 0025 ____ 39fa 0100 0001
.2.t.5.%*.9ú....
48: 0000 0000 0000 0377 7777 036d 6b70 0363
.......www.mkp.c
64: 6f6d 0000 0100 0161
om..... .....
Solución: Recordemos que el texto del RFC768 dice lo siguiente acerca del cálculo del campo del checksum para UDP:
[...]Checksum is the 16-bit one's complement of the one's complement sum of a pseudo header of information from the IP header, the UDP header, and the data, padded with zero octets at the end (if necessary) to make a multiple of two octets. The pseudo header conceptually prefixed to the UDP header contains the source address, the destination address, the protocol, and the UDP length. This information gives protection against misrouted datagrams.
This checksum procedure is the same as is used in TCP. 0 7 8 15 16 23 24 31 +--------+--------+--------+--------+ | source address | +--------+--------+--------+--------+ | destination address | +--------+--------+--------+--------+ | zero |protocol| UDP length | +--------+--------+--------+--------+ If the computed checksum is zero, it is transmitted as all ones (the equivalent in one's complement arithmetic). An all zero transmitted checksum value means that the transmitter generated no checksum (for debugging or for higher level protocols that don't care).[...]Es decir que el checksum para UDP se calcula sobre los octetos que componen un seudo-header, el header de UDP y los datos (que se deben completar con ceros al final si es necesario).
También debemos recordar los formatos del frame Ethernet, el header IPv4 y el header de UDP:
Formato del frame Ethernet (el tamaño de los campos está en bytes)
Ahora debemos separar nuestro frame en su componentes: header Ethernet, Header IPv4, Header UDP y Datos:Formato del header de IPv4 Formato del header UDP
0260 8ce8 5533 0800 2073 5ec6 0800 ===> Header del frame Ethernet 4500 0039 \ adab 4000 | ff11 785c > Header IPv4 a8b0 0319 | a8b0 0132 / e573 0035 Header 0025 ____ UDP 39fa 0100 \ 0001 0000 | 0000 0000 | 0377 7777 > Datos... 036d 6b70 | 0363 6f6d | 0000 0100 |
01 /De acuerdo con el RFC768 el seudo-header de este mensaje sería:
a8b0 0319 ===> Dirección IP origen
a8b0 0132 ===> Dirección IP destino
0011 0025 ===> cero + número de protocolo (17
decimal) + longitud UDP (37 decimal, incluye header y datos)
Ahora debemos sumar, con aritmetica complemento a uno, el seudo-header + el header UDP + los datos UDP, como palabras de 16 bits
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
[55E1] 0101010111100001
1
[55E2] 0101010111100010
[Hex] Binario
[e574] 1110010101110100
[0035] 0000000000110101
[0025] 0000000000100101
[0000] 0000000000000000
[E5CE] 1110010111001110
[Hex] Binario
[39fa] 0011100111111010
[0100] 0000000100000000
[0001] 0000000000000001
[0000] 0000000000000000
[0000] 0000000000000000
[0000] 0000000000000000
[0377] 0000001101110111
[7777] 0111011101110111
[036d] 0000001101101101
[6b70] 0110101101110000
[0363] 0000001101100011
[12829] 10010100000101001
--> 10100000101001 + 1 = 10100000101010 [282A]
[6f6d] 0110111101101101
[0000] 0000000000000000
[0100] 0000000100000000
[0100] 0000000100000000
[716D] 0111000101101101
[716D]
Ahora sumamos los subtotales
[Hex] Binario
[282A] 0010100000101010
[716D] 0111000101101101
[9997]
1001100110010111
1. Suma de los resultados obtenidos con el seudo-header, el header UDP y los datos
[Hex] Binario
[55E2] 0101010111100010
[E5CE] 1110010111001110
[9997] 1001100110010111
[1D547]
11101010101000111 --> 1101010101000111 + 1 = 1101010101001000
[D548]
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 1101010101000111 es 0010101010110111. Que vendría a ser el checksum: el hexadecimal 2ab7.
Offset: Hexadecimal ASCII ------- ----------- ----- 0: 0260 8ce8 5533 0800 2073 5ec6 0800 4500 .`..U3.. s^...E. 16: 0039 adab 4000 ff11 785c a8b0 0319 a8b0 .9..@...x\...... 32: 0132 e574 0035 0025 2ab7 39fa 0100 0001 .2.t.5.%*.9ú.... 48: 0000 0000 0000 0377 7777 036d 6b70 0363 .......www.mkp.c 64: 6f6d 0000 0100 0161 om.....
©Oscar Agudelo. 2000-2003. Todos los derechos reservados.