IP报文首部校验和计算: 上图为IP首部结构, 16位首部校验和计算方法如下: 将图中按照16位进行分组,然后校验和位清零,将数据按16位一组进行累加,最后得出一个结果,如果此结果高16位为0,则将结果按位取反后填入16位首部校验和位置;如果高16位不为0,则将高16位与低16位相加,再看得出结果高16位是否为0,如果不为零则继续相加,直到高16位为0,然后将结果按位取反后填入16位首部校验和位置。 上图为一个tcp报文的抓包,提取其中ip报文,从第一行45 00到第三行a8 1c为ip报文,按照上述进行累加:4500H+0034H+d7f7H+4000H+4006H+0000H+c0a8H+a81dH+c0a8H+a81cH=46EBAH,此时高16位不为0,则6EBAH+0004H=6EBEH,取反后为9141H,与抓包16位首部校验和一致。
TCP、UDP报文校验和计算: TCP和UDP报文计算方法与IP首部校验和计算方法类似,不过校验内容是伪首部+tcp/udp首部+数据,其中伪首部是从ip报文中提取的部分数据,伪首部是为了计算检验和而设置的,其结构如下: 其中除了16位TCP/UDP长度其余数据均直接取自IP报文首部,16位TCP/UDP长度计算方法:IP首部16位总长度-4位首部长度*4,TCP首部结构如下: 16位校验和计算方法:从伪首部结构开始计算累加到数据末尾,然后对高16位进行判断,不为零则按照IP16位首部校验和方法进行计算,直到高16位为0,然后对数据取反,将数据填入16位校验和。 同样使用IP首部校验和中的抓包数据:c0a8H+a81dH+c0a8H+a81cH+0006H+(0034H-20=20H)+b9f6H+ee4aH+0762H+19f8H+79b2H+19afH+8010H+0559H+0000H+0000H+0101H+080aH+fffeH+d08bH+ffffH+f2b6H=9805CH,805CH+9H=8065,取反后为7F9AH与抓包数据一致。
|