回答編集履歴
1
追記
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が結果となる)。
|