3

RFC1071で説明されているように、バイト数が奇数の状況でチェックサムを計算するときは、最後のバイトに0バイトを追加する必要があります。

ここに画像の説明を入力してください

ただし、「C」コードアルゴリズムでは、最後のバイトのみが追加されます。

ここに画像の説明を入力してください

上記のコードは、[Z、0]がZに等しいリトルエンディアンのマシンでは機能しますが、[Z、0]がZ*256に等しいビッグエンディアンのマシンには問題があると思います。

では、RFC1071の「C」コードの例はリトルエンディアンのマシンでのみ機能するのでしょうか。

-------------新規追加---------------

RFC1071で説明されている「合計を2つのグループに分割する」例がもう1つあります。

ここに画像の説明を入力してください

ここでデータを取得できます(addr [] = {0x00、0x01、0xf2})例:

ここに画像の説明を入力してください

ここで、「標準」は式[ 2 ]で記述された状況を表し、「Cコード」はCコードアルゴリズムの状況を表します。

ご覧のとおり、「標準」の状況では、「スワップ」の後に[Z、0]の抽象形式でエンディアンの問題がないため、エンディアンの違いに関係なく、最終的な合計はf201です。ただし、ビッグエンディアンでもリトルエンディアンでも、f2は常にローバイトであるため、「Cコード」の状況では重要です。

したがって、チェックサムは、異なるエンディアンの同じデータ(addr&count)で可変です。

4

2 に答える 2

2

私はあなたが正しいと思います。RFCのコードは、リッテエンディアンまたはビッグエンディアンのどちらのマシン上にあるかに関係なく、最後のバイトを下位バイトとして追加します。

Web上のこれらのコードの例では、最後のバイトに特別な注意が払われていることがわかります。

https://github.com/sjaeckel/wireshark/blob/master/epan/in_cksum.c

とで

http://www.opensource.apple.com/source/tcpdump/tcpdump-23/tcpdump/print-ip.c

それはこれを行います:

if (nleft == 1)
    sum += htons(*(u_char *)w<<8);

これは、RFCのこのテキストが正しくないことを意味します。

したがって、合計は、基盤となるハードウェアのバイト順序(「ビッグエンディアン」または「リトルエンディアン」)に関係なく、まったく同じ方法で計算できます。たとえば、ネットワーク(「ビッグエンディアン」)の順序でメモリに格納されているデータを合計する「リトルエンディアン」マシンを想定します。各16ビットワードをフェッチすると、バイトがスワップされ、合計が生成されます。ただし、結果をメモリに保存すると、合計がネットワークバイトオーダーにスワップバックされます。

于 2012-12-29T11:03:30.937 に答える
1

元の奇数バイト処理の代わりに次のコードは移植可能であり(つまり、ビッグエンディアンとリトルエンディアンの両方のマシンで機能します)、外部関数に依存しません。

if (count > 0)
{
    char buf2[2] = {*addr, 0};
    sum += *(unsigned short *)buf2;
}

(addrがchar*またはconstchar *であると想定します)。

于 2014-08-13T00:42:46.097 に答える