Saltar al contenido

Cálculo de la suma de comprobación UDP

Recuerda que en las ciencias un problema casi siempere puede tener más de una resoluciones, pero nosotros mostramos lo más óptimo y mejor.

Solución:

La suma de verificación UDP se realiza sobre toda la carga útil, y los otros campos en el encabezado, y algunos campos del encabezado IP. Se construye un pseudoencabezado a partir del encabezado IP para realizar el cálculo (que se realiza sobre este pseudoencabezado, el encabezado UDP y el payload). La razón por la que se incluye el pseudoencabezado es para capturar paquetes que se han enrutado a la dirección IP incorrecta.

Básicamente, en el extremo receptor, todas las palabras de 16 bits de los encabezados más el área de datos se suman (ajustándose a 16 bits) y el resultado se compara con 0xffff.

En el lado del envío, es un poco más complejo. Se realiza una suma de complemento a uno en todos los valores de 16 bits, luego se toma el complemento a uno (es decir, se invierten todos los bits) de ese valor para llenar el campo de suma de control (con la condición adicional de que una suma de control calculada de cero se cambiará a todos un bit).

La suma del complemento a uno es no simplemente la suma de todos los valores del complemento a uno. Es un poco más complejo.

Básicamente, tiene un acumulador de 16 bits en ejecución que comienza en cero y agrega cada valor de 16 bits a eso. Cada vez que una de esas adiciones da como resultado un acarreo, el valor se ajusta y agrega uno al valor nuevamente. Esto efectivamente toma el bit de acarreo de la suma de 16 bits y lo agrega al valor.


Aparte, y esto es pura conjetura de mi parte, pero esto probablemente podría hacerse de manera eficiente mediante el uso de la ADC (añadir con llevar) instrucción en lugar de ADD (sorprendentemente, agregue), o cualquier instrucción equivalente que estuviera disponible en su CPU en ese momento.

Si no hubiera acarreo, ADC simplemente agregaría el bit cero del acarreo. En los días en que se hacían estas cosas (y sí, desafortunadamente, yo soy tan viejo), la memoria era mucho más una restricción que la velocidad, no tanto el caso hoy en día, por lo que guardar unos pocos bytes en su código bien podría elevarlo al nivel de semi-dios-emperador-del-universo :- )


Tenga en cuenta que nunca tuvo que preocuparse por cargar la segunda vez (o llevar dos con el siguiente ADC si está utilizando ese método mencionado en el párrafo anterior), ya que los dos valores más grandes de 16 bits, cuando se suman, producen (truncados de 0x1fffe) 0xfffe – agregar uno a eso nunca causará otro acarreo.

Una vez que se calcula la suma del complemento a uno calculada, se invierten sus bits y se inserta en el paquete, eso hará que el cálculo en el extremo receptor produzca 0xffffsuponiendo que no haya errores en la transmisión, por supuesto.

Vale la pena señalar que la carga útil siempre se rellena para garantizar que haya un número entero de palabras de 16 bits. Si se era acolchado, el campo de longitud le indica la longitud real.

RFC768 es la especificación que detalla esto.

Gerd Hoffmann realiza un ejemplo agradable y fácil de entender del cálculo de la suma de comprobación UDP.

Puede buscar en Google “net-checksum.c Gerd Hoffmann” o mirar el archivo aquí:

https://gist.github.com/fxlv/81209bbd150abfeaceb1f85ff076c9f3

Puedes usar net_checksum_tcpudp función, aliméntelo con la longitud de la carga útil UDP, proto, src y dst IP y luego la carga útil UDP en sí misma y hará lo correcto.

Al final tienes que llamar htons() en la suma de comprobación y estás bien.

Comentarios y valoraciones

Recuerda algo, que tienes autorización de añadir un criterio justo si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *