有关ip校验和代码的问题

时间:2010-04-05 19:17:56

标签: header checksum ip-protocol

unsigned short  /* this function generates header checksums */
csum (unsigned short *buf, int nwords)
{
  unsigned long sum;
  for (sum = 0; nwords > 0; nwords--) // add words(16bits) together
  {
      sum += *buf++;
  }
  sum = (sum >> 16) + (sum & 0xffff);  //add carry over
  sum += (sum >> 16);                  //MY question: what exactly does this step do??? add possible left-over   
                                       //byte? But hasn't it already been added in the loop (if 
                                       //any)?
  return ((unsigned short) ~sum);
}
  1. 我假设nbits在16位字的数量,而不是8位字节(如果有奇数字节,nword被舍入到下一个大),它是否正确?说ip_hdr总共有27个字节,那么nword将是14而不是13,对吧?
  2. 行sum =(sum>> 16)+(sum& 0xffff)是添加进位以使16bit补码
  3. sum + =(sum>> 16);这一步的目的是什么?添加剩余字节?但是循环中已经添加了剩余字节?
  4. 谢谢!

1 个答案:

答案 0 :(得分:0)

你是对的。步骤3将总和(32位长)压缩为16位无符号短路,这是校验和的长度。这是出于性能目的,允许人们在没有跟踪溢出直到结束时计算校验和。它在步骤2和步骤3都执行此操作,因为它可能已从第2步溢出。然后它只返回反转的低16位和。

这有点清楚: http://www.sysnet.ucsd.edu/~cfleizac/iptcphdr.html