TCPペイロードが転送中に破損した場合、再計算されたチェックサムは送信されたチェックサムと一致しません。これまでのところ問題ありません。
TCPチェックサムが転送中に破損した場合、再計算されたチェックサムは現在破損しているチェックサムと一致しません。これまでのところ問題ありません。
ペイロードとチェックサムの両方が破損し、再計算されたチェックサムが、本来あるべきものとは異なるものの、現在破損しているチェックサムと一致する場合、どうなりますか?
良いチェックサムアルゴリズム(およびより低いレベルでの追加のチェックサム)でこれを確認できますが、これは非常に、非常にありそうもないことですが、TCPは100%信頼できるものではありませんか?これらのfalseをどのように解決しますか?ポジティブ?
ここで注意しなければならないのは、ほとんどの人が完全に見落としていることですが、TCPチェックサムは実際には非常に貧弱なチェックサムです。
TCPチェックサムは、データの16ビットの1の補数の合計です。この合計は、15ビット以下のバーストエラーと、置き換えられるものを除くすべての16ビットバーストエラーをキャッチします。ある1の補数は別のゼロを補います(つまり、16の隣接する1ビットが16のゼロビットで置き換えられる、またはその逆)。均一に分散されたデータでは、他のタイプのエラーを1 in 2 ^ 16に比例する割合で検出することが期待されます。チェックサムにも大きな制限があります。16ビット値のセットの合計は、値の出現順序に関係なく同じです。
ソース: ftp://ftp.cis.upenn.edu/pub/mbgreen/papers/ton98.pdf
したがって、パケットのデータ部分の任意の数のビットをランダムにフリップすると、チェックサムにまったく触れていなくても、新しいデータとして、このエラーがまったく検出されない可能性が1〜65536です。破損しており、実際には古いチェックサムと同じです。データ部分の2つの16ビット値を交換するだけで、どれがどれほど頻繁であるかに関係なく、16ビット値がデータ部分に表示される順序が原因で、このエラーが検出されない可能性は100%です。パケットは、計算されたチェックサムの値とはまったく関係ありません。
ここで私が言おうとしているのは、データとチェックサムの両方が破損し、破損したチェックサムが破損したデータと一致するため、このエラーが検出されないというかなりまれなケースについてあまり心配する必要がないということです。インターネット上の何百万ものTCP=パケットにはデータの破損のみがあり、破損していないチェックサムが破損したデータと一致しているため、このエラーは検出されません。
データを転送する必要があり、データが破損していないことを確認したい場合は、TCPチェックサムだけではこのタスクには不十分です。CRCはCRC32は、32ビットを超える行が影響を受けるエラーを検出できない場合があるため、このタスクにはチェックサムでは不十分です(これらのエラーは互いに「キャンセル」される可能性があります)。完璧なデータ転送を保証するために必要な最小チェックサムデータのMD5値です。もちろん、それより優れたもの(SHA-1、SHA-256、SHA-384、SHA-512、ワールプールなど)はさらにうまく機能しますが、MD5で十分です。MD5は、 (過去に何度か壊れているため)暗号化セキュリティのために十分に安全である必要がありますが、データチェックサムとしてはMD5で十分です。
100%信頼できるわけではありません: この文書 は、エラー制御システムによってキャッチされなかった、1600万〜100億のパケットに1つについて言及しています。日/週ごとの発生回数を計算させてください:)
TCPチェックサムで誤検知が発生する可能性はありますか?
はい。チェックサムはパケットよりもかなり小さいため、多くの異なるパケットが特定のチェックサムと一致する可能性があります。
はいの場合、これはどのように処理されますか?
TCPではまったくありません。ただし、ほとんどのデータ破損は上位レベルで顕著になります。 XMLは整形式ではなくなりました。あなたのメールアドレスは英語ではなくなりました。
下位レベルでの追加のチェックサム
これらの一部はチェックサムよりも厳格です。イーサネットは、チェックサムの代わりに [〜#〜] crc [〜#〜] を使用します。
TCPは100%信頼できるものではありませんか?これらの誤検知をどのように解決しますか?
できないと思います。ハードコピーと伝書鳩を介して複製を送信した場合でも、宇宙線または量子効果は理論的にはまったく同じ方法で複製を壊す可能性があります。それは非常に、非常にまれです。
また、アプリケーション層(TCPの上)に任意の強力な整合性チェックを実装することもできます。暗号化署名を使用します。
想定する
パケットペイロード:1000バイト
パケットチェックサム:2バイト
チェックサムのwchichの1つである二重エラーのあるパケットの確率(Pが非常に小さく、1/10 ^ 5未満であると想定):
A = 8P*(1000*8P) = 6*10^4 * P^2
正確なチェックサムの確率:
B = 1/2^16 = 6/10^4
誤検知の確率:
A * B = 40 * P^2
確率は低い(P = 1/10 ^ 6、偽陽性の確率A * B = 4/10 ^ 11)が、どのcrcアルゴリズムでも、ゼロにすることはできません。ランダムな1000バイトのパケットが別のランダムな1000バイトのパケットとして現れる確率は、すべてのバイトにエラーがあるかのように、P ^ 8000です。
Pが1/10 ^ 3から1などのように高い場合、上記の計算は適用されません。その場合、A = 1(すべてのパケットに二重エラーが含まれます)であり、誤検知の確率はちょうどA * B = 6/10 ^ 4です。受信したパケットの99%以上にcrcのエラーが含まれるため、これはあまり関係のないケースです。