LoginSignup
4
0

More than 1 year has passed since last update.

ICMPヘッダのチェックサムを求めるメモ

Last updated at Posted at 2020-04-08

メモ

以下ハイライトしている部分がICMPヘッダの内容。
この中のチェックサムの値を求める手順をメモ。
ICMPはEcho Message。

ScreenClip.png

まず、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の補数和の計算が分かりやすい

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0