飞翔灬吾爱的Blog
华为网络基础 | TCP校验和错误原因及再次实例抓包验证
2018-8-19 fishyoung

前几篇已经讲解了TCP保证可靠性中的,序列号(按序到达)确认应答校验和机制,为了不使空洞的讲解理论,我们又实际用WireShark抓包工具,进行了抓包验证,经过不少时间,我们终于验算完成,但是最终的结果是令我们失望的?为什么呢?因为验算的结果是AF78它是不等于下图红圈圈中的84c6

为什么按照算法一步一步来的,最终是不相等呢?是算法错了?还是我们算错了?其实都没错,我们也没算错,算法肯定是毋容置疑的,不会出错的。以下就是问题所在。[hide]

可以发现上图红圈圈那一行为:checksum:0x84c6[validation disabled]按正常情况来说中括号中出现的应该是[correct]而不是[validation disabled],意思是验证禁用,在Wireshark官网上查询了到了这个问题,大致意思就是:

有时候TCPUDP校验和会由网卡计算,因此wireshark抓到的本机发送的TCP/UDP数据包的校验和都是错误的,这样检验校验和根本没有意义。所以Wireshark不自动做TCPUDP校验和的校验。

那么如何解决这个抓包验证的问题呢?

如果要校验校验和:可以在edit->preference->protocols中选择相应的TCP或者UDP协议,在相应的地方打钩。操作截图如下:

Validate the TCP/UDP checksum if possible复选框勾选上,关于checksumvalidation disabled问题就这么解决了。

接下来,我们再通过抓包来验证一下校验和,如下图是抓包细节:

把以上所抓取的信息划到表格中如下:

还是按照如下过程进行:

1把校验和字段置为0

2、TCP伪首部、TCP头部、数据中的每16bit进行二进制求和;

3、如果和的高16bit不为0,则将和的高16bit和低16bit反复相加,直到和的高16bit0,从而获得一个16bit的值;

4、将该16bit的值取反,存入校验和字段。

接着是计算步骤,这儿就直接运用十六进制进行计算了,不再用二进制了,十六进制速度更快一点。

[/hide]

又是辛辛苦苦大半天,最终终于把校验和算出来了2A96=2A96,和抓包里面的校验和相等,看吧!!算法没问题,我们的计算也没问题的。主要就是WireShark工具那个地方没有勾选上而已。

遇到问题,学会自行解决问题,如果解决不了可以发帖求助,主要还是要自己学会解决问题!!!!!

评论:
网友
2020-03-24 12:58 回复
回复 紫薯补丁
嘿嘿
2020-03-18 11:06 回复
回复
顾涛
2020-03-03 11:21 回复
温故而知新
顾涛
2019-12-31 10:59 回复
查看隐藏内容