【ルーティング⑥】TTLとは

routing-part6

ポン先生

今日はTTLについて勉強するよ。あまり目立たない存在かもしれないけど、縁の下の力持ち的な存在だからちゃんと知っておこう。

TTL?聞いたこと無いわね。一旦どんなモノなのかしら。

チャーチルさん

障害の切り分け等でよくtracerouteというコマンドを打ちます。tracerouteを打てばどこを経由して通信しているかが分かります。通常のデータ通信であればどの機器を経由したかという情報は残らないので非常に貴重な情報です。この記事ではそんなtracerouteの仕組みやそれを支えるTTLについて解説します。

TTLとは

TTL(Time To Live)とはパケットの寿命の事です。厳密にはルータ等のルーティング機器を経由できる回数を指します。例えばPCからパケットが送信された場合、ルータを超える度に1ずつ減って行きます。そしてTTLが0になった場合、そのパケットは破棄されます。

TTL

ポン先生

ちなみに、DNSの世界でもTTLってあるんだけど、こっちは名前の情報をキャッシュ(保持)する時間の事だよ。ネットワーク屋さんとサーバ屋さんでTTLの意味は違うから注意だね。

・サーバの世界でのTTL=時間

・ネットワークの世界でのTTL=回数

ってことなんだね。

チャーチルさん

TTLで出来ること

上記の性質を利用する事でTTLは様々な事に応用されています。順番に見ていきましょう。

TTLの応用
  • ①ルーティングループの防止
  • ②traceroute
  • ③通信先機器のOSの予測

①ルーティングループの防止

TTLはルーティングループを防止します。例えば以下のような構成を想定します。

ルーティングループ
  • PC1からPC2に通信したい
  • 間には3台のルータ
  • ルータ2のルーティング設定にミス有り
  • 本来はルータ2→ルータ3方向へ転送したいが、ルータ1へ転送されてしまう
  • ルータ1は再度ルータ2へ転送するが以降これの繰り返し
  • これがルーティングループ

ルーティングループが発生するとルータのリソース(CPUやメモリ等)や帯域を消費するため他の通信へ影響が出てしまいます。そもそもはルーティング設定をミスするなという話ですが、もし発生した場合はTTLによってルーティングループは収束します。

TTLによるルーティングループ収束
  • ルータ1⇔ルータ2間でルーティングループが発生します。
  • ルータに着信する度にTTLは減少していきます。
  • 最終的にTTL=0となり、そのパケットは破棄されます。

このようにTTLはルーティングループによる恒久的な帯域逼迫を防ぐ事ができます。一方、STPのようなL2ループの防止と異なりループそのものを検知して防ぐ事はできません。TTLは有限な値であり、その有限回数分はループしてしまいます。『パケットに寿命の概念を与え、その寿命以内に宛先に到達しろ。到達できない迷子パケットはずっとネットワーク上にいても邪魔だから捨ててしまえ。』というのがTTLが設定されている意味合いになります。

②traceroute

tracerouteとは送信元から宛先までの間で、どの機器(IPアドレス)を経由したかが分かるコマンドです。
※通常、宛先のアドレスは指定して通信しますが経路上の機器の事は分かりません。

traceroute

上図ではPC1(192.168.1.1)からPC2(172.16.1.1)までのtracerouteを確認しています。この通信経路では途中に192.168.1.254、10.1.2.240がいる事をPC1の画面上で確認する事ができます。例えば障害発生時に10.1.2.240が表示されなければルータ2に何か異常が起きたのか?と予想して調査する事ができます。

また、ルータ等は複数のIPアドレスを持ちますが、一番送信元に近い側のIPアドレスがtracerouteの結果で表示されます(図の●部分)。

そんな便利なtracerouteですがこれはTTLが0になるとパケットが破棄される性質を応用しています。TTLが0になるとルータは送信元に対してパケットが破棄された事を通知します。通知してきたIPアドレスをチェックすることで経路途中の機器が分かります。具体的な動作は下記で説明します。

1発目

  • PC1はTTL=1でPC2(172.16.1.1)へ送信
  • ルータ1にてTTL=0になるため破棄
  • ルータ1は送信元(PC1)にTTLが0になった事を通知
  • この時ルータ1はPC1に一番近いインタフェース(IPアドレス)から送信
  • PC1は通知を送って来たルータ1の192.168.1.254を記録
Traceroute(TTL=1)

2発目

  • PC1はTTL=2でPC2(172.16.1.1)へ送信
  • ルータ1は超える(TTL:2→1)
  • ルータ2にてTTL=0になるため破棄
  • ルータ2は送信元(PC1)にTTLが0になった事を通知
  • この時ルータ2はPC1に一番近いインタフェース(IPアドレス)から送信
  • PC1は通知を送って来たルータ2の10.1.2.240を記録
Traceroute(TTL=2)

3発目

  • PC1はTTL=3でPC2(172.16.1.1)へ送信
  • ルータ1は超える(TTL:3→2)
  • ルータ2も超える(TTL:2→1)
  • この場合、PC2は受信出来るので通常通りPC1に返信
  • PC1は通常の返信がPC2から来たのでtracerouteの完了を認識
  • PC1は172.16.1.1からの返信を記録し処理を完了
Traceroute(TTL=3)

このようにtracerouteではTTLを1つずつ増やして行き、宛先の機器に到達するまで情報を収集します。

③通信先機器のOSの予測

OSによってTTLのデフォルト値が異なります。この事を応用して宛先デバイスのOSをある程度予測することができます。具体的な値は以下の通りです。

OS毎のTTLデフォルト値
  • Linux OS/Mac OS:64

  • Windows OS:128

  • UNIX OS/ネットワーク機器:255

TTLとデバイスOS

例えば上記の構成でXの情報を知りたい場合、PC1からX(172.16.1.1)へpingを打ちます。応答パケットからTTLを確認出来るので値が62ならLinuxやMac、126ならWindowsといった具合です。

注意点としては、TTLはあくまでXから送信する時の値が決まっているという話であって、PC1に着信するまでの経路にルータがあればその分TTLは減ります。そのためPC1の画面上で確認する時はその分を考慮する必要があります。
※とは言え、OSが違えば64や127のレベルで値が離れているのでぱっと見で分かるでしょう。

デバイスのOSを予測するというのは、例えば正体不明なデバイスを捜索するようなシチュエーションで使われます。IPアドレスは分かるが管理台帳等に記載されておらず、ひとまずリモートで確認する時などです。OSが分かれば何の機器か予測出来るケースもありますし参考情報程度にはなります。

ポン先生

とは言えこれはあくまでOS毎のデフォルト値だから設定変更されていたらこの限りでは無いよ(あまり無いと思うけど)。また、これ以外の独自OSのデバイスもあるかもしれないし、あくまで参考程度にしておいた方が良いかな。

まとめ

ポイント
  • TTLとは

    • パケットの寿命を示す数字

    • ルータを超えると1減る

    • 0になるとそのパケットは破棄

  • TTLで出来ること

    • ①ルーティングループの防止 :0になれば消滅する

    • ②traceroute :経路途中の機器を把握出来る

    • ③通信先機器のOSの予測 :OS毎にTTLのデフォルト値が異なる

正直TTLはネットワークの中ではあまり目立たない存在かもしれません。しかしこの記事で紹介した内容はどれも重要な機能です。例えばルーティングループの防止は障害を防ぐ機能であり、tracerouteは障害発生後の切り分けで使うコマンドです。1つの機能で色々応用でき、安定したネットワークを支える重要な存在として覚えておきましょう。あと、pingを打つ度に毎回TTLが顔を出すのでたまには思い出してあげてください。