当前位置:   article > 正文

tcp校验和计算校验和例子_wireshark与TCPIP校验和

tcprewrie 加上校验和

在IP协议中有"首部校验和"字段用来校验在传输过程中首部是否正确;在UDP协议中有"校验和"字段用来校验首部和数据;在TCP协议中有"校验和"字段用来校验首部和数据;校验和也称为Internet校验和,其计算方式与采取二进制补码和运算不同,其计算方式见《TCP IP详解卷1:协议 原书第2版》5.2.2节及《计算机网络(第7版)-谢希仁》5.2.2节。其计算方式为:取2个16位(2字节)数据进行二进制补码求和,若最高位还有进位则进位的1加到和的最低位,此时的和为S1,再取2个16位数据与S1进行二进制补码求和,若最高位还有进位则进位的1加到和的最低位,如此反复直到所有数据计算完毕,最后对和取反即得校验和。

说明:(1)若不足16位的需要补0够16位,计算开始时校验和位置置0。

(2)从概述中可以看出UDP和TCP中有校验和,IP层中也有校验和显得IP层中的校验和有点多余,因为上层UDP和TCP会校验,加之现在网络采用光纤传输质量有保证,所以IPv6中取消了校验和,其校验交给了上层协议。

下面以《TCP IP详解卷1:协议 原书第2版》5.2.2节的例子看如何计算

数据为:E3 4F 23 96 44 27 99 F3 00 00 (最后00 00为校验和字段)

ffe057a24d2e4274ba9d4c1bb7f2cec8

计算的和为E500,对其取反~E500=1AFF

故最终传输数据为E3 4F 23 96 44 27 99 F3 1A FF(1A FF为校验和)

接收者收到后校验过程与计算校验和类似

92e93166042f4460aad20019d9935de1

计算的和为FFFF,对其取反~FFFF=0

故校验和为0则说明传输无问题,否则有问题,路由器会丢弃此包。

如何在C程序中进行校验和的计算呢?下面给出示例程序

89fc2ea5a4fb48f2bcb270f04a9a815c
ea38994a54184675ad4d7def880d0519

因为程序中数据是按char数组组织的,而checksum函数是按short进行读取的,即按1个字节组织但按每次2个字节读取,所以要注意大小端模式。

对于要验证的IP头数据,如果在wireshark中可以很方便的提取出来,方法是在IP数据上右击选择show packet bytes,在弹出的对话框中选择C Array就可以方便的得到IP数据了。

a387b08499694dc09cc62088508702ca
852c69db2c9d4672883a27751053dc6f
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/978239
推荐阅读
相关标签
  

闽ICP备14008679号