leo_cyl
驱动牛犊
驱动牛犊
  • 注册日期2001-08-20
  • 最后登录2009-11-02
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望13点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:3437回复:11

TCP/IP的CHECKSUM问题

楼主#
更多 发布于:2003-10-13 11:19
我用自己的tcp/ip stack(基于ucip)和研华的一个带TCPIP的PLC通讯。发现PLC发出的IP包的checksum计算不正确,如果我把IP层的checksum检查关闭(TCP层仍然有checksum检查),就可以通讯了。但是IP层和TCP层用同样的计算方法,也就是说我的计算方法应该没问题啊!
另外,我的tcp/ip stack和PC通讯没问题,而研华的PLC和PC通讯没问题!是不是checksum有不同的计算方法呢?
xudepeng
驱动牛犊
驱动牛犊
  • 注册日期2003-05-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-10-13 17:58
可以一起交流吗?
我做过那方面的部分工作
QQ:12278389
right_wind
驱动中牛
驱动中牛
  • 注册日期2001-10-12
  • 最后登录2018-05-29
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望66点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2003-10-13 21:42
IP头的checksum计算和TCP头的checksum计算方法是不同的,但各自的checksum在算法上应该是统一的。

[编辑 -  10/13/03 by  right_wind]
good good study, day day up。
pkucoffee
驱动牛犊
驱动牛犊
  • 注册日期2003-06-02
  • 最后登录2003-11-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-10-14 00:03
计算checksum是用一个函数的,
只是在计算的范围不同而已。
具体的函数可以在网上搜到的,下面给你贴一个
static unsigned short int in_cksum ( unsigned short int *addr, int len )
{
    int                 nleft  = len;
    int                 sum    = 0;
    unsigned short int *w      = addr;
    unsigned short int  answer = 0;

    /*
     * Our algorithm is simple, using a 32 bit accumulator (sum), we add
     * sequential 16 bit words to it, and at the end, fold back all the
     * carry bits from the top 16 bits into the lower 16 bits.
     */
    while ( nleft > 1 )
    {
        sum   += *w++;
        nleft -= 2;
    }
    /*
     * 4mop up an odd byte, if necessary
     */
    if ( nleft == 1 )
    {
        *( unsigned char * )( &answer )  = *( unsigned char * )w ;
        sum                             += answer;
    }
    /*
     * 4add back carry outs from top 16 bits to low 16 bits
     */
    /*
     * add hi 16 to low 16
     */
    sum     = ( sum >> 16 ) + ( sum & 0xffff );
    /*
     * add carry
     */
    sum    += ( sum >> 16 );
    /*
     * truncate to 16 bits
     */
    answer  = ~sum;
    return( answer );
}  /* end of in_cksum */



你遇到的问题怀疑是tcp的checksum也不对,只不过被忽略了而已
建议使用ethereal听一下包,看看你的checksum到底那个不对。
good luck.
leo_cyl
驱动牛犊
驱动牛犊
  • 注册日期2001-08-20
  • 最后登录2009-11-02
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望13点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-14 08:59
感谢各位的回复。我觉得我的checksum算法没有问题。(完全基于《TCPIP协议详解 2》中延迟进位技术的例子)
用我的算法可以和PC正常的通讯。并且我用IRIS捕获的数据包都显示checksum正确!另外研华的PLC和PC单独通讯也没问题。
但我的板子和PLC单独通讯IP包效验就有问题(TCP包就没问题,我可以肯定)。
另外我想问一问:因为我的板子单独和PLC连接,中间不通过PC,用什么工具可以捕获它们之间的TCP/IP数据包?

[编辑 -  10/14/03 by  leo_cyl]
pkucoffee
驱动牛犊
驱动牛犊
  • 注册日期2003-06-02
  • 最后登录2003-11-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-10-14 12:02
2个都连在hub上, 然后用一个pc连在hub上不就可以兼听了么?
leo_cyl
驱动牛犊
驱动牛犊
  • 注册日期2001-08-20
  • 最后登录2009-11-02
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望13点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-10-14 12:07
2个都连在hub上, 然后用一个pc连在hub上不就可以兼听了么?


应该不行吧!PC的网卡不会接收MAC ADDRESS不匹配的数据包(系统广播除外)。

[编辑 -  10/14/03 by  leo_cyl]
right_wind
驱动中牛
驱动中牛
  • 注册日期2001-10-12
  • 最后登录2018-05-29
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望66点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2003-10-14 22:28
把网卡设成混杂模式就可以了,建议用sniffer,很好用。
good good study, day day up。
leo_cyl
驱动牛犊
驱动牛犊
  • 注册日期2001-08-20
  • 最后登录2009-11-02
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望13点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-10-14 22:35
怎样才能设成混杂模式?
right_wind
驱动中牛
驱动中牛
  • 注册日期2001-10-12
  • 最后登录2018-05-29
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望66点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2003-10-15 20:00
去下一个sniffer pro,现成的抓包软件,很好用。
good good study, day day up。
cao_john_cn
驱动牛犊
驱动牛犊
  • 注册日期2005-01-20
  • 最后登录2005-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-03-05 19:05
tcp的checksum包括12个伪头!!!
qiyidi
驱动牛犊
驱动牛犊
  • 注册日期2005-03-22
  • 最后登录2011-08-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-05-05 14:25
Checksum是什么来呢?
游客

返回顶部