回答編集履歴

1

追記

2016/07/09 07:30

投稿

pi-chan
pi-chan

スコア5936

test CHANGED
@@ -7,3 +7,55 @@
7
7
 
8
8
 
9
9
  [IP チェックサムの秘密](http://www.mew.org/~kazu/doc/bsdmag/cksum.html)
10
+
11
+
12
+
13
+ ---
14
+
15
+ コメントを受けて、追記致します。
16
+
17
+
18
+
19
+ すみません、リンクしたページだけでは説明が不十分でしたね。。
20
+
21
+
22
+
23
+ チェックサム計算の大元の定義である [RFC1071:Computing the Internet Checksum(和訳)](http://www5d.biglobe.ne.jp/stssk/rfc/rfc1071j.html) の説明が一番、網羅的に説明されているのですが、参考になる解説のリンクを2つ程貼り付けて置きます。
24
+
25
+ 要するに、「1の補数の数学的な性質を上手く活用することで、計算速度を高めることが出来る」というのが理由です。
26
+
27
+
28
+
29
+ ① CPUが最も得意(処理速度の速い)加算とビット反転しか使用しない
30
+
31
+ ② 「1の補数の和」と言っても、個々の値の補数を取得してから和を計算する必要はなく、単純に和を求めてから、オーバーフローで桁あふれが発生した分を最後にまとめて最下位へ足せば良い
32
+
33
+   ⇒ つまり計算量が少ない
34
+
35
+ ③ 「バイト順独立」という性質により、ビッグエンディアン、リトルエンディアンというCPUのどちらのアーキテクチャにも適用できる
36
+
37
+ ④ 「平行合計」(多分、並行合計が正しい)が可能という性質のため、最近主流の64bitCPUでは、4ワード(4bit)まとめて計算できる
38
+
39
+ ⑤ 「逐次更新」、つまり『チェックサムを更新するために、16のビット整数の差分だけを加算すればよい』
40
+
41
+  ⇒ 個人的には、これが重要だと思いますが、ルーターを通過する度にIPヘッダー部の書き換えが発生します。その際、チェックサムを再計算する必要があるのですが、1の補数を利用する方式では全体を再計算する必要はなく、修正の発生した部分の差だけを計算すれば良いので、処理速度を高めるのに有用!
42
+
43
+
44
+
45
+ 他にも幾つか「高速処理」に役立つ性質があるようですが、自分は数学が苦手なのでまだ腹落ちしていません。。。ただ、上記の「原文(の和訳)」から、そういう設計上の「意図」があったということは、下記ページの解説から気づきました。
46
+
47
+
48
+
49
+ 以下、参考にしたサイトです。
50
+
51
+
52
+
53
+ [IP のチェックサム -- 1の補数演算](http://4049.nwr.jp/comp/ip_csum.html) の最後に記載されている「おまけ」の部分
54
+
55
+ > 32ビット計算を使って行う場合、オーバフローが起きる回数は、単に上位 16ビットで表現されていますので、「シフト2発、足し算2発」(2発なのは補正の補正) で計算できてしまいます。
56
+
57
+
58
+
59
+ [第10回 IPパケットの構造とIPフラグメンテーション (2/3)](http://www.atmarkit.co.jp/ait/articles/0304/04/news001_2.html) の「ヘッダ・チェックサム」フィールド:16bit幅の部分
60
+
61
+ > 途中の計算は4bytesや8bytesずつでもかまない。そのため、計算を高速化できるという特徴がある。計算方法そのものは単純である。単に固定幅でデータを足し込んで、最上位からあふれた1bit(桁上がり)を、最下位bitへ足せばよい(例:0xffff+0xffff=0x1fffeとなるので、0xfffeに1を加えて0xffffが結果となる)。