2010.09.21
 

データグラムおよびチェックサムを理解する

Question

UDP のデータグラムおよびチェックサムに関して質問があります。UDP パケットが誤ったチェックサムとともに着信したため、受信側が送信側に、例えば 28 バイト (IP ヘッダーに 20 バイトおよび UDP ヘッダーに 8 バイト) のホールドする ICMP エラー・メッセージを応答した場合、送信側はその情報を使用して、どの UDP パケットが不良か推測して、そのパケットを再送信できるでしょうか。

Answer

UDP には TCP のように、接続タプル (つまりハンドシェイク) がないため、TCP/IP スタックは、どのアプリケーションが偽造の ICMP メッセージを受信するのか認識できません。(つまり)自分のデータグラムを再送信しているのか、他のアプリケーションのデータグラムを再送信しているのか認識(することは)できないでしょう。

プロトコルによっては (実際は、私が唯一知っているのは TRACEROUTE です) SOCK_RAW ソケットを 監視し、戻ってくるすべての ICMP メッセージを読み取ることができるよう、識別子を UDP データグラムにエンコードするものもあります。識別子を持つ UDP データグラムが検出されると、パケットにエラーがあったことが認識されます。

もちろん、それが絶対確実というわけではありません。多くの企業が「セキュリティー上の理由」からファイアウォールで ICMP メッセージをブロックしています (私に言わせれば、ばかばかしいとは思いますが、頻繁に行われています)。したがって、その場合でも、欠けているデータグラムを検出し、再送信するための別のメカニズム (十中八九、タイムアウトによる確認応答) が必要になるでしょう。

残念ながら IBM i では、UDP データグラムの ID を SOCK_RAW ソケットに設定するツールを作成できません。パケットのこの部分は「保護されており」、識別を設定できないといったエラーが出されます。したがって、この手法は i には使えません。 要するに、そうした考えはやめた方がいいと思います。タイムアウトによる確認応答データグラムを目指せばよいのです。ICMP メッセージを処理しようと思わないことです。せいぜいいくつかのケースで処理できるだけで、(コードを動作させることができるとしても) コードがかなり複雑になってしまいます。

ページトップ

ボタン