なぜチェックサムで1の補数演算を採用するか
1の補数演算を採用したチェックサムでは、
16ビットごとの 1 の補数和を取り、さらにそれの 1 の補数を取る
1 の補数和の 1 の補数
なぜこのような手法を採用するのか
2の補数ではなく1の補数である理由
?
補数和の補数をとる理由
受信者にとってチェックサムの検証が楽になるから
受信者は、チェックサムの値を含むパケット全体の「1の補数和の1の補数」を計算し、0x0000と一致するか調べるだけでよい
!?
なぜか
パケット全体の 1 の補数和を取ると 0xFFFF になる
チェックサム以外の部分の1の補数和をCとする
Cに対して1の補数をとると、!C
これがチェックサムの値となる
チェックサムとそれ以外の補数和はC + !Cとなり、0xFFFF
0xFFFFに対して1の補数をとると0x0000となる