LoginSignup
8
7

More than 3 years have passed since last update.

UDPのチェックサムを理解する

Posted at

この記事について

マスタリングTCP/IPの本で勉強していたんですが、UDPのチェックサムの部分がやや難しかったので自分なりにまとめてアウトプットします。

UDPのヘッダフォーマット

UDPは次の4つのヘッダを持ちます

  • 送信元ポート番号
  • 宛先ポート番号
  • パケット長
  • チェックサム

[図1]
udp1.png

チェックサム以外の説明は不要かと思うので省略します。

チェックサム

チェックサムはUDP以外にもIT分野では一般的に利用される単語です。

Wikipediaには

チェックサム(英: checksum)とは、ワード列の各ワードの総和を利用した誤り検出符号の一種である。他の誤り検出符号と比べて信頼性は低いものの、単純計算[注釈 1]で99.6%以上の検出率があるうえにアルゴリズムが簡単であることから、簡易な誤り検出に用いられる

とあります。
簡単に言うと、送信データにある規則性を持たせ、受信時にその規則性が保たれているかどうかで誤り検出を行う。といったものです。

このUDPのチェックサムの役割としても同じです。
このチェックサムの値を用いて、UDPのデータの誤りを検出します。

UDP通信の流れ

送信側

まず送信側において、UDPのデータ全体(UDPヘッダ+UDPボディ)の前に疑似ヘッダを付けます。

[図2]
udp2.png

この疑似ヘッダの中身は次のようなものです。
[図3]
udp3.png

また、図2の全体(疑似ヘッダ+UDPヘッダ+UDPボディ)の全長が16ビットの倍数となるように最後に「0」を追加します。
なお、UDPヘッダのチェックサムの値はすべて0を入れておきます。

この状態で全体(疑似ヘッダ+UDPヘッダ+UDPボディ)を16ビットごとに1の補数を算出し、それらの和を求めます。
またその和の1の補数の値をUDPヘッダのチェックサムの値に挿入します。

そして疑似ヘッダを取り除いた状態で送信します。

受信側

受信側においてはこれと逆の処理を行います。

まず受信したデータのIPヘッダから、送信元IPアドレス宛先IPアドレスを取得します。
このIPアドレスの情報と、受信したデータ長から、送信側で作成した疑似パケットと同じも復元可能となります。

その疑似パケットを用いて、送信側と同じようにチェックサムを計算します。
ただ、この時計算される値は、チェックサムにデータが含まれている状態で計算されるものです。
(送信時には、チェックサムの初期値を0として計算している。)

「受信したデータから計算したチェックサム」の値は、「送信時に計算したチェックサムの値」と「送信時のデータのチェックサム以外の和」との和を求めていることになります。
そして「送信時に計算したチェックサムの値」は「送信時のデータのチェックサム以外の和」の1の補数をとったものです。
そのため、1の補数の性質から、これらの和は16ビットすべてが1の値になるはずです。(=1111111111111111)

つまり、受信側で計算されたチェックサムのビットがすべて1であれば、誤りなく通信が行われたと判断可能となります。

まとめ

送信側、受信側でチェックサムがどういう値なのか、どういった意味を持つか着目すると理解しやすいですね。

理解がまちがっていたらご指摘お願いします。

8
7
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
8
7