Parsing the first checksum of ip protocol
3. The checksum field is filled with zeros when the checksum field is initially calculated
This is how the checksum is calculated for the sender, and for the receiver, the verification is simple:
1. The received IP header is summed up one by one in 16 bits.
two。 If the result is 1, the check is correct, otherwise the error is discarded.
The principle is very simple, the receiver's calculation object is the inverse XOR of An and A, and the result is, of course, 1!
Specific examples of program implementation are as follows:
SHORT checksum (USHORT* buffer, int size)
{
Unsigned long cksum = 0
While (size > 1)
{
Cksum + = * buffer++
Size-= sizeof (USHORT)
}
If (size)
{
Cksum + = * (UCHAR*) buffer
}
Cksum = (cksum > > 16) + (cksum&0xffff)
Cksum + = (cksum > > 16)
Return (USHORT) (~ cksum)
}
IP header:
4500 0046
17d9 0000
4011 ec1d (check field)
Ac1c 0f3b
Ac1c 0f3d
Calculate:
4500 + 0046 + 17d9 + 0000 + 4011 + ec1d + ac1c + 0f3b + ac1c + 0f3d
The sum taken out is the checksum that should be filled.
When receiving an IP packet, to check whether the IP header is correct, check the IP header, using the same method as above:
Calculate:
44500 + 0046 + 17d9 + 0000 + 4011 + ec1d + ac1c + 0f3b + ac1c + 0f3d is added to FFFF again, and the result is all-in-one and correct.