IPはあて先IPアドレスを見て,転送先を決めるだけでなく,有効期限が切れたパケットを捨てたりもする。これが2番目の役割。IPがなぜパケットを捨てるのかという理由と,どのように期限を決めて,どのタイミングで捨てるのかを確認しよう。

ネットのパンクを防ぐ

 多くのネットワークが相互に接続されてできているインターネットでは,ルーターをだれか一人が一元管理しているのではなく,個々のネットワークの管理者が個別に管理している。だから,どこかのルーターの設定が間違っているかも知れない。IPが期限切れパケットを捨てるのは,こうした設定ミスがあっても,障害がインターネット全体に及ぶのを防ぐためである。

 簡単な例を挙げて説明しよう。もしなんらかの事情で,ルーターの設定を間違い,ルーティング・テーブルの内容が誤っていた。するとルーターのIPは受信パケットの転送先を間違ってしまう。運悪く,地球をぐるっと回って元のルーターに戻ってくるかもしれない。こうなると,ルーターのIPはまた間違った転送先を指示し,パケットはいつまでたっても目的地に届かなくなるだけでなく,無限ループに陥ってしまう。

 こうしたパケットが1個だけならまだいいが,いつかはほかのパケットも障害のあるルーターに届き,また無限ループ状態になる。そして最悪の場合は,無限ループ状態のパケットでインターネットがパンクしてしまう。

 こうした状態になるのを防ぐために設けられたのが,有効期限という考え方である。ルーターのIPは有効期限の切れたパケットを受信したら,ほかに転送せずに捨てる。これでルーターに設定ミスなどがあっても,永遠にさまよい続けるパケットはなくなる。これこそが,IPが2番目の役割を果たす理由である。

図3 ここで登場するIPヘッダー
IPヘッダー中には,パケットの有効期限である「生存時間(TTL)」が書かれている。長さは8ビットである。
図4 パケットの期限切れを見つけて捨てるメカニズム
ヘッダー中の「生存時間(TTL)」を取り出し,1を引く。その結果が0なら廃棄,そうでなければ転送する。ルーターを越えるごとに1ずつ引くので,パケットがインターネットをいつまでもさまようことがなくなる。

255台より先のルーターには行かない

 有効期限は,IPパケットを作る送信元パソコンのIPが決める。有効期限を記述するために8ビットのフィールドがIPヘッダー中に用意されているので,ここに期限を書き込んで送信する(図3[拡大表示])。このフィールドは,TTL(time to liveの略で「生存時間」と訳す)と呼ばれる。

 IPがTTLとして書き込む情報は「○時○分まで」といった時刻ではなく,一種のカウンタような整数値になる。ルーターのIPはパケットを受信すると,TTLの数値を読み出して1だけ減らし,TTLフィールドをその減らした数値に書き換えて,パケットを転送する。

 したがって,IPヘッダーのTTLの値はルーターを経由するごとに1ずつ減り,いつかは0になる。この0になったタイミングが期限切れ。こうなったら,ルーターのIPはほかに転送しないでパケットを破棄する(図4[拡大表示])。

 ちなみにIPの規格書であるRFCでは,TTLの値はルーターの台数ではなく,時間(単位は秒)を書き込むことになっている。ただ,ルーターや回線をパケットが流れる間にどれだけ時間が経過したかを正確に計るのは難しい。そこでRFCでは,ルーターを経由するごとにTTLの時間を1秒ずつ減らす。この結果,最初に説明したようにTTLはルーターを経由するたびに1ずつ減る。捨てるのはいずれにしてもTTLが0(秒)になったタイミングだから,別に支障はない。

 なおTTLのフィールドは8ビットなので,送信元パソコンのIPは,最初に0~255の値をセットして送信することになる。かなり古いバージョンのUNIXだとこの値を30とか60,あるいは128にセットすることがあるが,最近のOS(例えばWindows XPやLinux)は最大値である255にセットして送信する。

 いずれにしても現実のインターネットには,100台以上のルーターを経由しないと目的地へ到達できないようなあて先はない。だから,TTLの初期値が小さいために,あて先に届かなくなるような問題は起こらない。

捨てたら送信元に知らせる

 ルーターのIPはパケットのTTLの値が0になると,そのパケットを破棄するだけではない。IPは捨てたことを送信元に通知することになっている。

 IPヘッダー中には,送信元パソコンのIPが自身のIPアドレスも記しているので,ルーターのIPはこれを手がかりにエラー・メッセージを送信元へ送るのだ。

 このときには,IPの補助的な役割を果たすICMPというプロトコルを使う。このICMPはIPの補佐役で,さまざまなエラー・メッセージを送ることができる。通常,パソコンやルーターのIPモジュールといっしょに組み込まれており,実体はソフトウエアである。

 話を戻そう。ICMPのエラー・メッセージを受信した送信元パソコンのIPは,そのあとどうするか。基本的には何もしない。エラー通知を受信しても無視する。届かないパケットをもう一度送ったりする仕事はIPではなく,TCPなどのプロトコルの仕事である。

TTLを活用するtracerouteコマンド

 TTLの値が0になったというICMPのエラー・メッセージを活用するネットワーク・コマンドがある。trace route(トレース・ルート)コマンドである。このコマンドは,あて先に到達するまでに経由するルーターのIPアドレスなどをリストアップする。

 しくみは単純で,故意にTTLの値を減らし,少しずつTTLの値を増やしながらパケットを何回も送る。

 まず最初は,TTLを1にしてあて先に向けてパケットを送信する。すると,最初のルーターに届いたところでTTLが0になり,捨てられてしまう。そしてルーターのIPからICMPエラー・メッセージが返ってくるので,最初に通過するルーターのIPアドレスがわかる。

 次に,TTLを2にして送信すれば,今度は最初のルーターは通過するが,2番目のルーターでパケットが捨てられ,そこからICMPパケットが届く。このように順番にTTLの値を1ずつ増やしてIPパケットをあて先に届くまで送り続ければ,経由するルーターのIPアドレスをリストアップできるしかけである。