如何进行 TCP 校验和计算?

爆板流 2013-06-04 02:24:16
TCP 数据校验,在网络和资料中找了许多,总结了下:利用TCP 抓包工具抓到的数据如下:

按照:

1、 把校验和字段置为0;
2、 对TCP头部中的每16bit进行二进制求和;
3、 如果和的高16bit不为0,则将和的高16bit和低16bit反复相加,直到和的高16bit为0,从而获得一个16bit的值;
4、 将该16bit的值取反,存入校验和字段。
当接收TCP包时,需要对报头进行确认,检查TCP头是否有误,算法同上2、3步,然后判断取反 的结果是否为0,是则正确,否则有错。
我的校验包括了: TCP伪首部+TCP头部+数据 ;按照上面方法计算,但是计算结果和抓到包的校验和不等。。。。
但是我如果是计算IP包的校验和却是可以的,只是计算TCP校验和的时候不行···不知道是不是进行TCP校验和计算时候哪里没弄明白啊?有木有人知道的额。

下面是我计算的IP校验和,结果是正确的,下下图是我计算的TCP校验和,结果是错误的,就是和抓到的包里的TCP校验和对不上···


如果我将 TCP伪首部+TCP Head +TCP数据 (此时TCP校验位不置0) 相加,得到的结果不是 FFFF 也不是000····这书不是说校验和本来就有错了呢 ?
...全文
3505 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
youxin2012 2014-08-27
  • 打赏
  • 举报
回复
如果我将 TCP伪首部+TCP Head +TCP数据 (此时TCP校验位不置0) 相加,得到的结果不是 FFFF 也不是000···· FFFF是在 接收端将以三部分进行计算得出的结果。 如果是FFFF表明无错,否则错误。 计算规则如你上面说的 1. 对TCP头部中的每16bit进行二进制求和; 2. 如果和的高16bit不为0,则将和的高16bit和低16bit反复相加,直到和的高16bit为0,从而获得一个16bit的值; 计算时伪首部和TCP首部和数据都是原码形式
「已注销」 2014-06-19
  • 打赏
  • 举报
回复
高手的心情,不能理解!
bikongqingyin 2014-01-03
  • 打赏
  • 举报
回复
我计算的也是C597(第一张excel表) 和你的一样
爆板流 2013-06-07
  • 打赏
  • 举报
回复
计算最后还是一样的,就是 PC-->单片机 方向的数据 对不上····
爆板流 2013-06-06
  • 打赏
  • 举报
回复
引用 11 楼 kaly_liu 的回复:
[quote=引用 10 楼 lianzhirong123 的回复:]
你换个内容再抓下包,看看是怎么样的,
你的tcp长度36字节, 减去头部20字节, 后面还有16字节,数据部分你只贴了4字节,其他都是0吗

我的数据只有4字节,高人应该是哪里看错了,这个数据太多太乱啦
你看前面的三张图(我贴出来了)
图1

图2

图3


这三个图片是:
0:表示:PC发送数据 “C222”;
1:是单片机接受到数据后,将这串数据不动的返回;
2:应该是个确认的包;
其实0 1 2 是一次事件抓到的包;
从IP头里看出数据包0、1 (图1、图2)总的长度是 :002C就是44个字节;数据长度=44-20-20=4字节;
从TCP伪首部看到数据包0、1 (图1、图2)的TCP总长度是:0018 就是24个字节;数据长度 = 24-20 =4 字节;
数据包2(图3)的数据时空的。
多谢高手的耐心解答啊,到时候加分加分啊~~哈哈
[/quote]我把数据包直接截图吧:
这是我用iptool 抓的包,截图:(PC机发送 C222 给单片机,单片机收到后,返回 C222给PC机,不知道后面为什么补了两个零(如下图2),但是数据长度还是4的,应该是填充的两个0不计入长度内)
图1

图2

图3

辛苦高手了~~~感谢啊~~

曾有一个人 2013-06-05
  • 打赏
  • 举报
回复


这个是0024吧,可能是这个导致后面所有运算都错了吧
爆板流 2013-06-05
  • 打赏
  • 举报
回复
再加+20分 到80分啦····
爆板流 2013-06-05
  • 打赏
  • 举报
回复
引用 5 楼 Geoff08Zhang 的回复:
这有个计算校验和的源码Checksum,直接看一下吧:
http://download.csdn.net/detail/geoff08zhang/4571358

其实我已经看过许多关于 checksum 的计算了,经过我昨天的海量计算,发现了一个问题,其实不是校验和计算的问题了,不知道是软件BUG还是什么的,问题是这样的:
背景:PC机上 网络调试助手充当TCP客户端IP:192.168.1.101
单片机+控制网络芯片 为TCP服务器 IP:192.168.1.14
可以进行正常的通讯了。
问题:我在PC机发送一串数据到单片机,然后单片机收到数据后原封不动的返回——这个可以实现,没问题
我在PC机发送一串数据到单片机,然后单片机收到数据后修改某位数据,再将这串数据返回——这个出现问题了,发送不回去好像···因为PC机没有显示信息
然后我就用抓包工作,抓包计算校验和了,发现很奇怪:从PC机发送到单片机的数据所有TCP校验和计算都是不对的;然而从单片机发送到PC机的数据,校验和计算都是对的····这个真的很奇怪~~~~~~~




曾有一个人 2013-06-05
  • 打赏
  • 举报
回复
额 ,可能你打错了。


就怕有些你数据打错了,算了半天都不行
你换个数据发一下看看,
爆板流 2013-06-05
  • 打赏
  • 举报
回复
引用 10 楼 lianzhirong123 的回复:
你换个内容再抓下包,看看是怎么样的,
你的tcp长度36字节, 减去头部20字节, 后面还有16字节,数据部分你只贴了4字节,其他都是0吗

我的数据只有4字节,高人应该是哪里看错了,这个数据太多太乱啦
你看前面的三张图(我贴出来了)
图1

图2

图3


这三个图片是:
0:表示:PC发送数据 “C222”;
1:是单片机接受到数据后,将这串数据不动的返回;
2:应该是个确认的包;
其实0 1 2 是一次事件抓到的包;
从IP头里看出数据包0、1 (图1、图2)总的长度是 :002C就是44个字节;数据长度=44-20-20=4字节;
从TCP伪首部看到数据包0、1 (图1、图2)的TCP总长度是:0018 就是24个字节;数据长度 = 24-20 =4 字节;
数据包2(图3)的数据时空的。
多谢高手的耐心解答啊,到时候加分加分啊~~哈哈
曾有一个人 2013-06-05
  • 打赏
  • 举报
回复
你换个内容再抓下包,看看是怎么样的, 你的tcp长度36字节, 减去头部20字节, 后面还有16字节,数据部分你只贴了4字节,其他都是0吗
爆板流 2013-06-05
  • 打赏
  • 举报
回复
引用 8 楼 lianzhirong123 的回复:
这个是0024吧,可能是这个导致后面所有运算都错了吧
多谢耐心指点啊。这里的错误都是我粗心造成的额,可惜不是啊,其实元数据是十六进制 0018的,是我写成二进制时候写错了,呵呵。我计算的时候还是按照十六进制来算的了。 现在的问题是 PC机发给单片机的方向 校验和计算有错;单片机发向PC机的数据校验和计算是没问题的~~
Geoff08Zhang 2013-06-04
  • 打赏
  • 举报
回复
这有个计算校验和的源码Checksum,直接看一下吧: http://download.csdn.net/detail/geoff08zhang/4571358
爆板流 2013-06-04
  • 打赏
  • 举报
回复
要加分了~~
爆板流 2013-06-04
  • 打赏
  • 举报
回复
高人出来吧~~指点指点
yaozhiyong110 2013-06-04
  • 打赏
  • 举报
回复
没研究到那么底层...
  • 打赏
  • 举报
回复
不懂

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧