IP数据报检验和计算
在进行计算之前先补充一下基础知识。
一、原码,反码和补码
原码
原码是计算机机器数中最简单的一种形式,数值位就是真值的绝对值,符号位位“0”时表示正数,符号位为“1”时表示负数,原码又称带符号的绝对值。为了方便整数和小数区别,整数的符号位与数值位之间用“,”隔开,小数的符号位与数值位之间用“.”隔开。
举例: 以8位机器数为例,整数的“+0”原码为0,0000000;整数的“-0”原码为1,0000000;小数的“+0”原码为0.0000000,小数的“-0”原码为1.0000000
反码
正数的反码就等于原码,负数的反码相当于除了符号位之外,其他位取反。
举例: 整数的“+0”反码为0,0000000;整数的“-0”原码为1,1111111;小数的“+0”原码为0.0000000,小数的“-0”原码为1.1111111
补码
正整数的补码是其二进制表示,与原码相同;
负整数的补码为反码加1;
举例: +1的补码为0,0000001;
-1的补码为1,111 1111
二、IP数据报中,首部检验和计算方法
这个字段用来检验数据报的首部,不包括数据部分。数据报每经过一个路由器,路由器都要重新计算首部检验和。不检验数据部分可以减小计算量。
计算方法: 先把IP数据报首部化为许多16位的序列,并把检验和字段置零。用反码运算把所有16字相加后,将得到的和的反码写入检验和字段。接收方收到数据后,将首部的所有16位子序列再使用反码算术符相加一次,将得到的和取反码。如果首部未发生任何变化,那么这个和肯定为0。否则认为出差错,并将此数据报丢弃。
反码相加:从低位向高位计算,0 0 得0 ,0 1 得1 ,1 1 得0 进1,如果最高位相加后产生进位,最后得到的结果加1。
例题:设IP数据报使用固定首部,其个字段的数值如图。计算下列IP数据报首部的检验和,各字段的数值如图
4 5 0 —>01000101 00000000
28 —>00000000 00011100
1 —>00000000 00000001
00 —>00000000 00000000
4 17 —>00000100 00010001
10.12.14.5 —>00001010 00001100 00001100 00000110
12.6.7.9 —> 00001110 00000101 0000111 00001001
反码运算:
01110100 01001110
取反,得到检验和字段:
10001011 10110001
使用16进制算法(每16位二进制数字,转换为4个十六进制数字表示)
4 5 0 —>4500
28 ---->001C
1 --------->0001
0 0 —>0000
4 17 ---->0411
10.12.14.5 —> 0A0C 0E05
12.6.7.9 -->0C06 0709
加法结果:744E
反码:8BB1