メモ
以下ハイライトしている部分がICMPヘッダの内容。
この中のチェックサムの値を求める手順をメモ。
ICMPはEcho Message。
まず、ICMPのヘッダ構造は上から以下となっている。
- 8bit(タイプ)
- Echo Message の場合は 8
- 8bit(コード)
- Echo Message の場合は 0
- 16bit(チェックサム)
- 0x665b
- 16bit(識別子)
- 0x0001
- 16bit(シーケンス番号)
- 0x000e
- 任意Byte(データ)
上記キャプチャの場合に置き換えると
タイプとコードは上記の通り8,0で、0x66 0x5b がチェックサム。残りがデータ部となる。
チェックサムの求め方は参考サイト(1)のものをそのまま利用させてもらうと、
チェックサムフィールドはヘッダの全16ビットワード
について1の補数を合計し、それをさらに16ビットの1の補数にする。
チェックサムの計算ではチェックサムフィールドの値は0とする。
ちなみに1の補数というのはビット反転で、補数和というのは (4) 参照の通りで、補数を足し合わせて16bitからはみ出たものを最下位ビットにまわして足し合わせるもの。
なので、まずは16bit毎の1の補数の合計を求める。このときチェックサムの部分は0に置き換える。
0x0800 + 0x0001 + 0x000e + 0x6162 + 0x6364 + 0x6566 + 0x6768
= 0x199A3
そして 0x199A3
は2進数だと 11001100110100011
これは17bit。
1の補数和は桁上りを最下位ビットに加算するようなので、一番左の 1
を一番右に足して、 1001100110100100
となる。
これを反転すると 0110011001011011
で16進数に直すと 0x665b
で無事キャプチャのチェックサムを求められた。
ちなみにデータ部のバイト数が奇数の場合、例えば、1バイトの場合でデータが0x01の場合は、右側に0埋めして 0x0100
として計算する。
参考
(1)メモ帳 チェックサム
http://specialimpact.blog22.fc2.com/blog-entry-47.html
(2)Internet Control Message Protocol - Wikipedia
https://ja.wikipedia.org/wiki/Internet_Control_Message_Protocol
(3)ICMP
http://pentan.info/doc/rfc/j792.html
(4)
1の補数 ‐ 通信用語の基礎知識 https://www.wdic.org/w/SCI/1%E3%81%AE%E8%A3%9C%E6%95%B0
→ 1の補数和の計算が分かりやすい