まず、tracerouteの仕組みから説明しましょう。 IPにはパケットの生存期限を管理する仕組みがあります。 具体的には、IPヘッダのTTLという欄に 送信側で適当な値(実際の値は実装によって違います)を入れて送信し ルータで中継する際にカウントダウンして、 TTLがゼロになったら、パケットは期限切れなので廃棄する、というものです。
tracerouteはこの仕組みを利用しています。 まず、TTLに1を入れてパケットを送ります。 すると、最初のルータで期限切れになり、 そこからパケット廃棄を知らせるICMPが返ってきます。 その送信元アドレスを見ることで、最初のルータのIPアドレスが分かります。 以後、TTLを2,3,4,5...と増やしていけば、 2番目、3番目...というように手前から順にルータのIPアドレスが分かります。 それを順番に表示するのがtracerouteです。
次はカプセル化の仕組みです。 カプセル化はパケットを丸ごと全部(ヘッダとデータの両方) 別のパケット(カプセル化用パケットと呼びましょう)のデータ部分に入れて運ぶ仕組みです。 その姿は下のようなイメージになります。
| カプセル化用パケットヘッダ(A) | tracerouteのヘッダ(B) | tracerouteのデータ(C) |
そして、このパケットを中継するルータは カプセル化パケットのデータ部分(上のBとC)をビットの塊として認識するだけで、 その内容は関知しません。
このパケットがトンネルを流れるとどうなるか。
トンネルの入り口のルータがn番目とすると、 TTL=nにしてパケットを送信すると パケットは入り口のルータで廃棄され、 返ってきたICMPから入り口のルータのIPアドレスが分かります。 次、TTL=n+1のパケットを送信すると TTL=n+1のパケットはトンネル入り口でカプセル化され、 トンネルを通って出口に届き、そこでカプセル化を解いて元のパケットに戻り、 そのルータ(出口のルータ)がTTLをカウントダウンしてゼロになり、 パケット廃棄してICMPを返送するはずです。 そして、tracerouteの画面には トンネル入り口のルータの次に出口のルータが表示されます。 tracerouteのパケットの立場から見ると、 トンネル入口のルータ(n番目)の次はトンネル出口のルータ(n+1番目)なのです。 トンネルの中間のルータは見えないというのは、こういうことなのです。
補足すると、 カプセル化されたパケットはTTLカウントダウンの対象にならないのですが、 これをトンネルの中間のルータはTTLをカウントダウンをしない、と誤解してはいけません。 トンネルの中間のルータもTTLのカウントダウンは行います。 ただ、その対象になるTTLは、カプセル化用のパケットのTTL(上記Aの中にある)であって、 データ部分に入れたパケットのTTL(上記Bの中にある)ではない、ということです。
More information about text formats
tracerouteとカプセル化の具体的な動きを考えてみましょう
まず、tracerouteの仕組みから説明しましょう。
IPにはパケットの生存期限を管理する仕組みがあります。
具体的には、IPヘッダのTTLという欄に
送信側で適当な値(実際の値は実装によって違います)を入れて送信し
ルータで中継する際にカウントダウンして、
TTLがゼロになったら、パケットは期限切れなので廃棄する、というものです。
tracerouteはこの仕組みを利用しています。
まず、TTLに1を入れてパケットを送ります。
すると、最初のルータで期限切れになり、
そこからパケット廃棄を知らせるICMPが返ってきます。
その送信元アドレスを見ることで、最初のルータのIPアドレスが分かります。
以後、TTLを2,3,4,5...と増やしていけば、
2番目、3番目...というように手前から順にルータのIPアドレスが分かります。
それを順番に表示するのがtracerouteです。
次はカプセル化の仕組みです。
カプセル化はパケットを丸ごと全部(ヘッダとデータの両方)
別のパケット(カプセル化用パケットと呼びましょう)のデータ部分に入れて運ぶ仕組みです。
その姿は下のようなイメージになります。
| カプセル化用パケットヘッダ(A) | tracerouteのヘッダ(B) | tracerouteのデータ(C) |
そして、このパケットを中継するルータは
カプセル化パケットのデータ部分(上のBとC)をビットの塊として認識するだけで、
その内容は関知しません。
このパケットがトンネルを流れるとどうなるか。
トンネルの入り口のルータがn番目とすると、
TTL=nにしてパケットを送信すると
パケットは入り口のルータで廃棄され、
返ってきたICMPから入り口のルータのIPアドレスが分かります。
次、TTL=n+1のパケットを送信すると
TTL=n+1のパケットはトンネル入り口でカプセル化され、
トンネルを通って出口に届き、そこでカプセル化を解いて元のパケットに戻り、
そのルータ(出口のルータ)がTTLをカウントダウンしてゼロになり、
パケット廃棄してICMPを返送するはずです。
そして、tracerouteの画面には
トンネル入り口のルータの次に出口のルータが表示されます。
tracerouteのパケットの立場から見ると、
トンネル入口のルータ(n番目)の次はトンネル出口のルータ(n+1番目)なのです。
トンネルの中間のルータは見えないというのは、こういうことなのです。
補足すると、
カプセル化されたパケットはTTLカウントダウンの対象にならないのですが、
これをトンネルの中間のルータはTTLをカウントダウンをしない、と誤解してはいけません。
トンネルの中間のルータもTTLのカウントダウンは行います。
ただ、その対象になるTTLは、カプセル化用のパケットのTTL(上記Aの中にある)であって、
データ部分に入れたパケットのTTL(上記Bの中にある)ではない、ということです。