Cómo calcular el campo de suma de comprobación en el encabezado del protocolo IP o ICMP
Siempre hay un campo de suma de verificación en el encabezado de la capa de protocolo, que el remitente calcula y almacena y el receptor lo verifica para garantizar la integridad del mensaje durante la transmisión.
p>Verificar Hay muchas formas de calcular sumas de verificación, pero para las sumas de verificación en el encabezado IP y el encabezado ICMP, se utiliza el mismo método de cálculo: el algoritmo de suma de verificación aditiva
"
Calcular suma de comprobación
La suma de comprobación en el encabezado IP solo verifica el encabezado IP, no la parte de datos.
La suma de comprobación en el encabezado ICMP verifica el encabezado ICMP y las partes de datos.
Método de suma de código inverso
"
El método de suma de código inverso consiste en encontrar primero la suma y luego encontrar la inversión.
"
Al enviar
Establezca el campo de suma de verificación en 0.
Cada 16 bits (es decir, 2 bytes) forman un número y se suman.
Coge el complemento y rellena el campo de suma de comprobación.
Este tipo de descripción en libros o en Internet es generalmente cierta, pero no resiste el escrutinio y algunos detalles no se han notado.
Por ejemplo, las sumas de verificación en el encabezado IP y en el encabezado ICMP son ambas de 16 bits, y la suma de estos números puede exceder los 16 bits. ¿Qué debo hacer? ¿Se trata simplemente de omitir los dígitos altos?
No
La suma de verificación del encabezado IP solo calcula los 20 bytes de datos en el encabezado IP. Cada dos bytes forman un número, que por supuesto es más fácil de distribuir.
Sin embargo, al igual que la suma de comprobación en el encabezado ICMP, calcula el encabezado y las partes de datos. El número de bytes puede ser un número impar, formando un número cada dos bytes. Al final quedará un byte. ¿Se agrega simplemente este último byte?
Por supuesto que no (especialmente este problema, que me ha preocupado durante mucho tiempo)
Así que resumamos el método de cálculo.
"
Establezca el campo de suma de verificación en 0.
Cada 16 bits (es decir, 2 bytes) forman un número y lo suman. Si excede 16 bits, el valor de bits alto sobrante se agregará al valor de 16 bits y el nuevo valor se agregará al siguiente valor.
Si al final quedan 8 bits, no podemos simplemente. agréguelo al valor de bits bajo. Simplemente trate estos 8 bits como el valor de orden superior, luego complete un valor de 16 bits con 0, súmelo
Finalmente, inviértalo y complete la suma de verificación. campo.
>"
¿Cómo se calcula el capl?
palabra GetOrVerifyChecksumValue(byte de datos[], longitud larga)
{
? int I = 0;
? temperatura de dword = 0;
? suma de comprobación de palabra = 0;
mientras(longitud i lt)
? {
if((I 1) lt; longitud)
{ ?
? temp = suma de comprobación ((datos[I] lt; lt8) datos[I 1]); suma de comprobación = (temp amp0x ffff) (temp gt; gt16);
? I = I 2;
}
Otro
{
? temp=suma de comprobación? (datos[I]lt;lt8);
? suma de comprobación = (temp amp0x ffff) (temp gt; gt16);
? Yo = Yo 1;
}
? }
? suma de comprobación = ~suma de comprobación;?
? Devolver suma de comprobación;
}?
Nota:
"
(data[I] lt; lt8) debe colocarse entre corchetes, de lo contrario, se calculará primero el siguiente signo más.
"
Verificar la suma de verificación
El método de verificar la suma de verificación es simple y claro.
Rellene el campo de suma de verificación Valor de la suma de verificación
Cada 16 bits forman un número y se suman. Si hay más de 16 bits, el exceso se suma al bit bajo y el nuevo valor se suma al siguiente valor. p>El resultado final es 0, lo que significa que todos los valores son correctos.
Si lo expresa la función capl, excepto que el campo de suma de verificación se establece en 0 durante el cálculo, el valor de retorno es una suma de verificación. , igual que la función anterior Al validar, el campo de suma de verificación debe establecerse en el valor de suma de verificación y el valor de retorno es 0.
¿Cuáles son los beneficios de saber esto? p>Capl proporciona un método para ensamblar mensajes. La suma de verificación se calcula automáticamente y no requiere cálculo manual. Sin embargo, la capa de aplicación puede tener algunos protocolos personalizados. Si utiliza este algoritmo, deberá calcularlo manualmente.