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

在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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值