免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7544 | 回复: 8
打印 上一主题 下一主题

[C] tcp/ip首部校验和的算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-03 21:17 |只看该作者 |倒序浏览
看了一个源代码,里面有个关于tcp/ip首部校验和的算法,不太明白啊,望大家解释下原理

tcp->check=check_sum((unsigned short *)tcp,sizeof(struct tcphdr));

unsigned short check_sum(unsigned short * addr, int len)
{
  register int nleft=len;
  register int sum=0;
  register short *w=addr;

  short answer=0;


  while(nleft>1)
          {
          sum=sum+*w++;
                  nleft=nleft-2;
  }
  if(nleft==1)
          {
             *(unsigned char *)(&answer)=*(unsigned char *)w;
                         sum=sum+answer;
  }

  sum=(sum>>16)+(sum&0xffff);//这里和以下几行啥意思呢?
  sum=sum+(sum>>16);
  answer=~sum;
  return (answer);
}

论坛徽章:
0
2 [报告]
发表于 2009-09-03 21:53 |只看该作者
实际上求的是各个16位的反码之和,采用的是反码加法,即把所有16位数累加求和再取反

sum=(sum>>16)+(sum&0xffff); //高16位加上低16位

sum=sum+(sum>>16);  //执行以上加法后,sum有可能在17位上有进位,再把其加上

answer=~sum;  //对其取反,由于answer是16位数,所以只取了sum取反的低16位

论坛徽章:
0
3 [报告]
发表于 2009-09-04 00:40 |只看该作者
原帖由 rollin7 于 2009-9-3 21:53 发表
实际上求的是各个16位的反码之和,采用的是反码加法,即把所有16位数累加求和再取反

sum=(sum>>16)+(sum&0xffff); //高16位加上低16位

sum=sum+(sum>>16);  //执行以上加法后,sum有可能在17位上有进位,再 ...


明白一些了,但为什么要把所有16位数累加求和再取反呢?

论坛徽章:
0
4 [报告]
发表于 2009-09-04 09:24 |只看该作者
温馨提示:

TCP接受端进行校验方法如下:把各个字节相加,结果会等于多少呢?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2009-09-04 10:41 |只看该作者
http://en.wikipedia.org/wiki/Checksum
Modular sum
A variant of the previous algorithm is to add all the "words" as unsigned binary numbers, discarding any overflow bits, and append the two's complement of the total as the checksum. To validate a message, the receiver adds all the words in the same manner, including the checksum; if the result is not a word full of zeros, an error must have occurred. This variant too detects any single-bit error, but the probability that a two-bit error will go undetected is a little less than 1/n.

论坛徽章:
0
6 [报告]
发表于 2009-09-04 12:32 |只看该作者
原帖由 OwnWaterloo 于 2009-9-4 10:41 发表
http://en.wikipedia.org/wiki/Checksum

如果字的所有位不是全部为零,则发生生错误?是这样理解?

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
7 [报告]
发表于 2009-09-04 16:33 |只看该作者
学习下

论坛徽章:
0
8 [报告]
发表于 2009-09-04 23:26 |只看该作者
原帖由 culuckyabcd 于 2009-9-4 12:32 发表

如果字的所有位不是全部为零,则发生生错误?是这样理解?

同问

论坛徽章:
0
9 [报告]
发表于 2009-09-04 23:27 |只看该作者
原帖由 jxfengzi 于 2009-9-4 09:24 发表
温馨提示:

TCP接受端进行校验方法如下:把各个字节相加,结果会等于多少呢?


把各个字节相加?你啥意思呢,兄弟
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP