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. 8ビットバイトではなく、16ビットワードの数のnwordsを想定しています(奇数バイトがある場合、nwordは次の大きな値に丸められます)、それは正しいですか?ip_hdr が全部で 27 バイトだとすると、nword は 13 ではなく 14 になりますよね?
  2. 行 sum = (sum >> 16) + (sum & 0xffff) は、キャリーオーバーを追加して 16 ビットの補数にすることです。
  3. 合計 += (合計 >> 16); このステップの目的は何ですか? 残りのバイトを追加しますか? しかし、残りのバイトはすでにループに追加されていますか?

ありがとう!

4

1 に答える 1

0

あなたは正しいです。ステップ 3 は、32 ビットの長さの合計を、チェックサムの長さである 16 ビットの unsigned short に圧縮します。これはパフォーマンス上の目的のためであり、最後までオーバーフローを追跡せずにチェックサムを計算できるようにします。これは、ステップ 2 でオーバーフローした可能性があるため、ステップ 2 とステップ 3 の両方で行われます。次に、和の下位 16 ビットを反転したものだけが返されます。

これは少し明確です: http://www.sysnet.ucsd.edu/~cflizac/iptcphdr.html

于 2010-04-05T19:29:13.290 に答える