Short description of the Internet checksum[IP检验和]
来源:互联网 发布:设置图纸软件. 编辑:程序博客网 时间:2024/05/16 03:46
IP checksum definition
The IP checksum is the 16 bit one's complement of the one's complement sum of all 16 bit words in the header.
One question many people may ask is "What is the 1's complement sum ?". This is because all computers utilize the 2's complement representation and the 1's complement is not used. The following gives a short introduction.
2's complement fixed point integers (8-bit)
Binary Decimal Hex 0000 0000 0 00 0000 0001 1 01 0000 0010 2 02 0000 0011 3 03 1111 1111 -1 FF 1111 1110 -2 FE 1111 1101 -3 FDLet's add two intergers:
-3 + 5 = 2
FD + 05 = 01 02
Discarding the carry (01) gives the correct result.
1's complement fixed point integers (8-bit)
Binary Decimal Hex 0000 0000 0 00 0000 0001 1 01 0000 0010 2 02 0000 0011 3 03 1111 1111 -0 FF 1111 1110 -1 FE 1111 1101 -2 FD 1111 1100 -3 FCAdd the same numbers:
-3 + 5 = 2
FC + 05 = 01 01
Adding the carry (01) to the LSB (01) gives the correct result:
01 + 01 = 02
So, the 1's complement sum is done by summing the numbers and adding the carry (or carries) to the result..
Simple Internet checksum example
Suppose we have an 8-bit, 2's complement, machine and send the packet
FE 05 00
where 00 is the checksum field.
Let's calculate and verify the Internet checksum.
FE + 05 = 01 03
This is the result of the normal (2's complement) addition. The 1's complement sum requires the addition of the carry to the 8-bit word (even though we will not get the same result)
03 + 01 = 04
so the 1's complement sum of FE + 05 is 04.
The 1's complement of the 1's complement sum (Internet checksum) will be
~04 = FB
and the packet will be sent as
FE 05 FB
Now, at the receiving end we add all the received bytes, including the checksum (again using the 2's complement representation)
FE + 05 + FB = 01 FE
The 1's complement sum is
FE + 01 = FF = -0
which checks that the transmission was OK (see below).
A more complex example (32-bit machine)
As shown in RFC 1071, the checksum calculation is done in the following way:
(1) Adjacent octets to be checksummed are paired to form 16-bit integers, and the 1's complement sum of these 16-bit integers is formed.
(2) To generate a checksum, the checksum field itself is cleared, the 16-bit 1's complement sum is computed over the octets concerned, and the 1's complement of this sum is placed in the checksum field.
(3) To check a checksum, the 1's complement sum is computed over the same set of octets, including the checksum field. If the result is all 1 bits (-0 in 1's complement arithmetic), the check succeeds.
Packet
01 00 F2 03 F4 F5 F6 F7 00 00
(00 00 is the checksum field)
Form the 16-bit words
0100 F203 F4F5 F6F7
Calculate 2's complement sum
0100 + F203 + F4F5 + F6F7 = 0002 DEEF (store the sum in a 32-bit word)
Add the carries (0002) to get the 16-bit 1's complement sum
DEEF + 002 = DEF1
Calculate 1's complement of the 1's complement sum
~DEF1 = 210E
We send the packet including the checksum 21 0E
01 00 F2 03 F4 F5 F6 F7 21 0E
At the receiving
0100 + F203 + F4F5 + F6F7 + 210E = 0002 FFFD
FFFD + 0002 = FFFF
which checks OK.
Comments
It may look awkword to use a 1's complement addition on 2's complement machines. This method however has its own benefits.
Probably the most important is that it is endian independent. Little Endian computers store hex numbers with the LSB last (Intel processors for example). Big Endian computers put the LSB first (IBM mainframes for example). When carry is added to the LSB to form the 1's complement sum (see the example) it doesn't matter if we add 03 + 01 or 01 + 03. The result is the same.
Other benefits include the easiness of checking the transmission and the checksum calculation plus a variety of ways to speed up the calculation by updating only IP fields that have changed.
The IP Header Checksum is computed on the header fields only.
Before starting the calculation, the checksum fields (octets 11 and 12)
are made equal to zero.
In the example code,
u16 buff[] is an array containing all octets in the header with octets 11 and 12 equal to zero.
u16 len_ip_header is the length (number of octets) of the header.
/*
**************************************************************************
Function: ip_sum_calc
Description: Calculate the 16 bit IP sum.
***************************************************************************
*/
typedef unsigned short u16;
typedef unsigned long u32;
u16 ip_sum_calc(u16 len_ip_header, u16 buff[])
{
u16 word16;
u32 sum=0;
u16 i;
// make 16 bit words out of every two adjacent 8 bit words in the packet
// and add them up
for (i=0;i<len_ip_header;i=i+2){
word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
sum = sum + (u32) word16;
}
// take only 16 bits out of the 32 bit sum and add up the carries
while (sum>>16)
sum = (sum & 0xFFFF)+(sum >> 16);
// one's complement the result
sum = ~sum;
return ((u16) sum);
}
- Short description of the Internet checksum[IP检验和]
- Internet checksum 因特网检验和的算法
- Availability and description of the File Checksum Integrity Verifier utility
- (6)CheckSum检验和
- 如何计算UDP/TCP检验和checksum
- 如何计算UDP/TCP检验和checksum
- 计算UDP/TCP检验和checksum
- 网际校验和算法(Internet CheckSum)
- 网际校验和(Internet Checksum)算法实现
- internet网络 checksum校验和计算方法
- Map of the Internet
- IP首部检验和
- THE HISTORY OF THE INTERNET
- The History of the Internet
- Full Description of the compilation of Scilab
- IP checksum
- 【RefactoringCode】The description of the refactoring book
- 网际校验和(Internet Checksum)算法的特征
- 指针
- Tomcat和Struts2的问题解决(2)
- 我能用Windows PowerShell做什么:日期与时间信息清单
- 范冰冰10年前旧照曝光 身着便装青涩难掩(图)
- Hibernate出错 - could not initialize proxy - the owning Session was closed
- Short description of the Internet checksum[IP检验和]
- 3edfsdfsdfsdffdsf
- 《绿光森林》惹争议 收视冠军也是"挨骂冠军"
- 从XML到Java代码的数据绑定之一
- Oracle 完全卸载手册
- 使用RDLC报表(1) -(4)
- 关于 synchronized 的使用
- jboss 4.2GA Ip无法访问的问题
- 说服