プロが教えるわが家の防犯対策術!

Linuxでtracerouteを実行して見ていると、ICMPのtime exceededが返ってくるたびに宛先ポート番号が変わっている(インクリメントされている)みたいなのですが、これはどういう意図でこのようになっているのでしょうか?


IP 192.168.1.1.33781 > 192.168.10.0.33434: UDP, length 32
IP 192.168.1.2 > 192.168.1.1: ICMP time exceeded in-transit, length 68
IP 192.168.1.1.51585 > 192.168.10.0.33435: UDP, length 32
IP 192.168.2.2 > 192.168.1.1: ICMP time exceeded in-transit, length 68
IP 192.168.1.1.58491 > 192.168.10.0.33436: UDP, length 32
IP 192.168.3.2 > 192.168.1.1: ICMP time exceeded in-transit, length 68

A 回答 (1件)

tracerouteが送信するUDPパケットのポート番号を変化させているのは、受信したICMP time exceedが、自分送信したどのUDPパケットに対応するものか認識する必要があるためです。


(自分がUDPパケットを送信した順番で、それぞれのUDPパケットに対応するICMP time exceed が返ってくるとは限らないため。さらにtraceroute を複数同時に動かした場合の考慮も必要です。)

どのように自分が送信したUDPと、受信したICMPの照合をとるかというと、

 ICMP time exceed パケットの中には、それの原因となった
 UDPパケットのIPヘッダ+UDPヘッダの先頭8バイトがコピーされている(RFC972)

ということを利用しています。つまり、tracerouteはTTLを増やしながら送信するUDPパケットヘッダの内容を色々変えながら送信しつつ、その内容を覚えておき、受信したICMPパケットにくっついていたIP/UDPヘッダと照合することで認識します。

ここで、アプリケーションが自由に変更でき、重複が発生しない程度に十分広い空間を持つフィールドは、UDPヘッダのポート番号くらいです。他のヘッダフィールドは、ほとんどいじる余地がありません(いじるとだいたい不正なパケットになってしまいます)。UDPポート番号が変化する理由はこれです。

どのように変化させているかの詳細は、tracerouteのソースコードのコメントに記載されています(参考URL)。

参考URL:http://svn.freebsd.org/viewvc/base/head/contrib/ …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>自分がUDPパケットを送信した順番で、それぞれのUDPパケットに対応するICMP time exceed が返ってくるとは限らないため。
なるほど順番が違って届くことを考えていませんでした。
とてもわかりやすい解説ありがとうございました。

お礼日時:2011/02/02 16:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!