インターネットチェックサムの計算方法に関して質問があります。私は本から良い説明を見つけることができなかったので、ここでそれを尋ねます。これが尋ねるべき正しい場所であるかどうかはわかりませんので、間違った場所で尋ねた場合は申し訳ありません。
次の例をご覧ください。次の2つのメッセージが10101001および00111001に送信されます。チェックサムは1の補数で計算されます。これまでのところ理解しました。しかし、合計はどのように計算されますか?最初はXORかもしれないと思っていましたが、そうではないようです。
10101001
00111001
--------
Sum 11100010
Checksum: 00011101
そして、メッセージが正常に到着したかどうかを計算するときに。そしてもう一度、合計はどのように計算されますか?
10101001
00111001
00011101
--------
Sum 11111111
Complement 00000000 means that the pattern is O.K.
加算を使用するため、「sum」という名前が付けられます。 10101001 + 00111001 = 11100010。
例えば:
+------------+-----+----+----+----+---+---+---+---+--------+
| bin value | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | result |
+------------+-----+----+----+----+---+---+---+---+--------+
| value 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 169 |
| value 2 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 57 |
| sum/result | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 226 |
+------------+-----+----+----+----+---+---+---+---+--------+
インターネットのチェックサムでTCPチェックサムを意味する場合、適切な説明 ここ 、さらには コード があります。
チェックサムを計算するとき、それはデータの機能だけでなく、ソースIP、宛先IP、プロトコル、およびTCPパケットをチェックサムするデータに入れるこれにより、tcpメタデータがIPヘッダーの一部のデータに結び付けられます。
TCP/IP Illustrated Vol 1 はこのための良いリファレンスであり、すべて詳細に説明しています。
インターネットチェックサムの計算には、1の補数演算が使用されます。チェックサムされるデータが8ビット整数のシーケンスであると考えてください。最初に、1の補数演算を使用してそれらを追加し、結果の1の補数を取る必要があります。
注:数字の1を追加すると算術演算が補完され、MSBからのキャリーオーバーを結果に追加する必要があります。たとえば、3(0011)および5(0101)の追加を考慮してください。
3 '-> 1100 5'-> 1010 0110キャリーが1であるため、0111(-8の1の補数表現)があります。
チェックサムは、前のステップで得られた結果の1の補数です。したがって、1000になります。キャリーが存在しない場合は、加算段階で得られた結果を補完するだけです。
UDPチェックサムは、送信側で、セグメント内のすべての16ビットワードを合計することで作成され、オーバーフローがラップされた後、1の補数が実行され、結果がセグメント内のチェックサムフィールドに追加されます。受信側では、パケット内のすべてのワードが追加され、結果が1111 1111 1111 1111の場合はチェックサムが追加され、セグメントは有効です。そうでない場合、セグメントにエラーがあります。例:0110 0110 0110 0000 0101 0101 0101 0101
1 0100 1010 1100 0001 //オーバーフローがあるので、まとめて合計に追加します。合計= 0100 1010 1100 0010ここで、1の補数チェックサム= 1011 0101 0011 1101を取ります。
受信側で合計が計算され、チェックサムに追加されます0100 1010 1100 0010
1111 1111 1111 1111 //それが答えでなければならないことは明らかです。もしそうでなければ、エラー参照があります:コンピュータネットワークトップダウンアプローチ[Ross-kurose]