阅读:3437回复:11
TCP/IP的CHECKSUM问题
我用自己的tcp/ip stack(基于ucip)和研华的一个带TCPIP的PLC通讯。发现PLC发出的IP包的checksum计算不正确,如果我把IP层的checksum检查关闭(TCP层仍然有checksum检查),就可以通讯了。但是IP层和TCP层用同样的计算方法,也就是说我的计算方法应该没问题啊!
另外,我的tcp/ip stack和PC通讯没问题,而研华的PLC和PC通讯没问题!是不是checksum有不同的计算方法呢? |
|
沙发#
发布于:2003-10-13 17:58
可以一起交流吗?
我做过那方面的部分工作 QQ:12278389 |
|
板凳#
发布于:2003-10-13 21:42
IP头的checksum计算和TCP头的checksum计算方法是不同的,但各自的checksum在算法上应该是统一的。
[编辑 - 10/13/03 by right_wind] |
|
|
地板#
发布于: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. |
|
地下室#
发布于: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] |
|
5楼#
发布于:2003-10-14 12:02
2个都连在hub上, 然后用一个pc连在hub上不就可以兼听了么?
|
|
6楼#
发布于:2003-10-14 12:07
2个都连在hub上, 然后用一个pc连在hub上不就可以兼听了么? 应该不行吧!PC的网卡不会接收MAC ADDRESS不匹配的数据包(系统广播除外)。 [编辑 - 10/14/03 by leo_cyl] |
|
7楼#
发布于:2003-10-14 22:28
把网卡设成混杂模式就可以了,建议用sniffer,很好用。
|
|
|
8楼#
发布于:2003-10-14 22:35
怎样才能设成混杂模式?
|
|
9楼#
发布于:2003-10-15 20:00
去下一个sniffer pro,现成的抓包软件,很好用。
|
|
|
10楼#
发布于:2005-03-05 19:05
tcp的checksum包括12个伪头!!!
|
|
11楼#
发布于:2005-05-05 14:25
Checksum是什么来呢?
|
|