3
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. 我假设 nwords 的数量是 16 位字,而不是 8 位字节(如果有奇数字节,则 nword 舍入到下一个大字),对吗?假设 ip_hdr 总共有 27 个字节,那么 nword 将是 14 而不是 13,对吗?
  2. 行 sum = (sum >> 16) + (sum & 0xffff) 是添加进位以使 16 位补码
  3. 总和 += (总和 >> 16); 这一步的目的是什么?添加剩余字节?但是循环中已经添加了剩余字节?

谢谢!

4

1 回答 1

0

你是对的。步骤 3 将 32 位长的 sum 压缩为 16 位无符号短型,即校验和的长度。这是出于性能目的,允许计算校验和而不跟踪溢出直到结束。它在第 2 步和第 3 步都这样做,因为它可能已经从第 2 步溢出。然后它只返回求和的反转低 16 位。

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

于 2010-04-05T19:29:13.290 回答