亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: tcp/ip首部校驗和的算法 [打印本頁]

作者: wheniwasyoung    時間: 2009-09-03 21:17
標題: tcp/ip首部校驗和的算法
看了一個源代碼,里面有個關(guān)于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);
}
作者: rollin7    時間: 2009-09-03 21:53
實際上求的是各個16位的反碼之和,采用的是反碼加法,即把所有16位數(shù)累加求和再取反

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

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

answer=~sum;  //對其取反,由于answer是16位數(shù),所以只取了sum取反的低16位
作者: wheniwasyoung    時間: 2009-09-04 00:40
原帖由 rollin7 于 2009-9-3 21:53 發(fā)表
實際上求的是各個16位的反碼之和,采用的是反碼加法,即把所有16位數(shù)累加求和再取反

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

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


明白一些了,但為什么要把所有16位數(shù)累加求和再取反呢?
作者: jxfengzi    時間: 2009-09-04 09:24
溫馨提示:

TCP接受端進行校驗方法如下:把各個字節(jié)相加,結(jié)果會等于多少呢?
作者: OwnWaterloo    時間: 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.

作者: culuckyabcd    時間: 2009-09-04 12:32
原帖由 OwnWaterloo 于 2009-9-4 10:41 發(fā)表
http://en.wikipedia.org/wiki/Checksum

如果字的所有位不是全部為零,則發(fā)生生錯誤?是這樣理解?
作者: cheng_lai_shun    時間: 2009-09-04 16:33
學(xué)習(xí)下
作者: wheniwasyoung    時間: 2009-09-04 23:26
原帖由 culuckyabcd 于 2009-9-4 12:32 發(fā)表

如果字的所有位不是全部為零,則發(fā)生生錯誤?是這樣理解?

同問
作者: wheniwasyoung    時間: 2009-09-04 23:27
原帖由 jxfengzi 于 2009-9-4 09:24 發(fā)表
溫馨提示:

TCP接受端進行校驗方法如下:把各個字節(jié)相加,結(jié)果會等于多少呢?


把各個字節(jié)相加?你啥意思呢,兄弟




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2