ip协议首部校验及tcp校验计算

Posted 默语先行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ip协议首部校验及tcp校验计算相关的知识,希望对你有一定的参考价值。

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与抓包数据一致。

以上是关于ip协议首部校验及tcp校验计算的主要内容,如果未能解决你的问题,请参考以下文章

如何计算IP或ICMP协议首部里的checksum字段

IP首部校验合

IP数据包首部校验和的计算

ip校验与计算

计算数IP据报的校验和

IP首部校验和的计算     [网络协议分析的作业]