• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:tracerouteコマンドとポート番号)

tracerouteコマンドとポート番号

このQ&Aのポイント
  • Linuxでtracerouteを実行して見ていると、ICMPのtime exceededが返ってくるたびに宛先ポート番号が変わっている(インクリメントされている)みたいなのですが、これはどういう意図でこのようになっているのでしょうか?
  • tracerouteコマンドを使用すると、ICMPのtime exceededメッセージが返ってくるたびに宛先ポート番号が変わることがあります。これは、tracerouteがネットワークの経路を特定するために送信するパケットを識別するためのものです。
  • tracerouteコマンドを実行すると、まず最初のパケットは宛先ポート番号を持たずに送信されます。次に、最初のルーターでパケットが受信されると、ルーターはICMPのtime exceededメッセージを送信し、その際に宛先ポート番号をインクリメントして返します。これを繰り返すことで、tracerouteはパケットが通過する経路を特定することができます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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/traceroute/traceroute.c?revision=216184&view=markup
mofmof_
質問者

お礼

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

関連するQ&A