メモの日々


2006年04月17日(月) [長年日記]

  • 今日はスーツを着ている。
  • 昨日は夕方眠ってしまったことにより夜中に眠れなくなってしまった。職場への出勤中立ちながらうとうとしてしまい大変危なかった。職場に着きコーヒーを飲んで少し復活。

[net] traceroute

tracerouteコマンドの挙動を勉強した。たいした話じゃないけど、せっかくだからメモ。

流れ

  1. IPヘッダのTTLフィールド(IPv6の場合はHop Limitフィールド)に1を設定したパケット(プローブパケット)を送信する。
  2. 1ホップ目のルータが時間超過ICMPメッセージを返してくる。
  3. 1〜2を3回繰り返す。
  4. IPヘッダのTTLフィールドに2を設定したプローブパケットを送信する。
  5. 2ホップ目のルータが時間超過ICMPメッセージを返してくる。
  6. 4〜5を3回繰り返す。

のようにしてTTLを増やしながらプローブパケットを送信していく。デフォルトではプローブパケットにはUDPが使われ(WindowsのtracertはICMPエコーリクエストを使うみたい)、パケットを送信する度に宛先ポート番号を1ずつ増加していく(ポート番号の初期値のデフォルトは32768+666)。

プローブパケットが宛先IPアドレスに指定したノードへめでたく到着すると、そのノードがポート到達不能ICMPメッセージを返してくる(はず)。もし終点ノードが宛先ポート番号をリッスンしているとこのメッセージは返ってこず、tracerouteはうまくいかない(それを回避するために毎回プローブパケットのポート番号を変化させ、1ホップにつき3回パケットを送信していると思われる)。

ホップ毎に送信するパケット数

Linuxのtracerouteコマンドはデフォルトで1ホップ毎に3パケット送信するが、このパケット数は -q オプションで変更できる。-q オプションはマニュアルのSYNOPSISには書かれているのにDESCRIPTIONに説明が見当たらない。でも皆このオプションの存在は知っているみたい。

実装例

UNIXネットワークプログラミングの25.6節にtracerouteの実装例が載っている。

やること

  • テーブル生成
  • 歯ブラシ
  • 小型テープ
  • クリーニング