2016-03-19 55 views
0

icmpヘッダチェックサムとIPヘッダチェックサムの計算方法は同じですか?つまり、似ているかもしれません。しかし、私はthisのIPヘッダーチェックサムコードを見つけました。このコードをicmpヘッダチェックサムにも使用できますか?他のどんな助けも素晴らしいだろう。ICMPヘッダとIPヘッダチェックサム計算

 unsigned short cksum(struct ip *ip, int len){ 
     long sum = 0; /* assume 32 bit long, 16 bit short */ 

     while(len > 1){ 
     sum += *((unsigned short*) ip)++; 
     if(sum & 0x80000000) /* if high order bit set, fold */ 
      sum = (sum & 0xFFFF) + (sum >> 16); 
     len -= 2; 
     } 

     if(len)  /* take care of left over byte */ 
     sum += (unsigned short) *(unsigned char *)ip; 

     while(sum>>16) 
     sum = (sum & 0xFFFF) + (sum >> 16); 

     return ~sum; 
    } 
+1

ICMPの "_Header Checksum - ヘッダー内のすべての16ビットワードの1の補数の和の16ビットの1の補数をチェックする必要があります。チェックサムを計算するために、チェックサムフィールドはゼロでなければなりません。将来的に置き換えられます。_ "RFC 1071および1141は、IPチェックサムの実行方法を説明しています。 –

+0

@Ronだから、あなたは(ヘッダチェックサムとIPヘッダチェックサムの計算方法)が同じではないと言いますか? –

答えて

1

RFC 791 - Internet Protocol ...

ヘッダチェックサム:16ビット

のみヘッダのチェックサム。いくつかのヘッダフィールドは (例えば、生存時間)を変更するので、これは再計算され、各点 で検証され、インターネットヘッダが処理される。

チェックサムアルゴリズムである:

The checksum field is the 16 bit one's complement of the one's 
complement sum of all 16 bit words in the header. For purposes of 
computing the checksum, the value of the checksum field is zero. 

これはチェックサムと実験的証拠 を計算するのは簡単であるが、それが適切であることを示し、それは暫定的であり、さらに経験に応じて、CRC手順によって を置き換えてもよいです。

注::「CRC手順」は決して実装されませんでした。

RFC 792 - Internet Control Message Protocol ...

ヘッダチェックサム

The 16 bit one's complement of the one's complement sum of all 16 
bit words in the header. For computing the checksum, the checksum 
field should be zero. This checksum may be replaced in the 
future. 

:繰り返しますが、このアルゴリズムを交換しませんでした。

したがって、両方のアルゴリズムが同じであると仮定することは安全です。はい、同じBSDコードを使用することができます(もちろん、struct ipを変更してICMPヘッダーチェックサムを計算することもできます)。