TCPSLICE(1)

名称
tcpslice - tcpdump ファイルの切り出し/結合

書式
tcpslice [-dRrt] [-w file] [start-time [end-time]] file ...

解説
tcpslice は、 tcpdump(1) の -w フラグ を用いて作成されたパケットトレースファイルの一部を切り出すプログラムです。 また、以下に示すように、複数のパケットトレースファイルを結合する事も できます。

tcpslice の基本機能は、入力ファイルに含まれるパケットのうち、指定された時間内の ものを stdout に出力する事です。 開始時刻および終了時刻の範囲は、コマンド行で指定できます。範囲は指定した 時刻自身を含みます。デフォルトでは、開始時刻は最初の入力ファイルの一つ目の パケットの時刻です。この時刻を first time と呼びます。デフォルトでは、終了時刻は開始時刻の 10 年後です。 したがって、 tcpslice trace-file というコマンドは単に trace-file を stdout に出力します(ファイルには 10 年分のデータがない事を 想定しています)。

時刻の指定にはいくつかの方法があります。ひとつは sssssssss.uuuuuu の形をとる Unix 時刻形式を用いる方法です (これは、 tcpdump(1) の -tt フラグで指定される形式です)。 例えば、 654321098.7654 は、1990 年 9 月 25 日、午後 8 時 51 分 (PDT) から、 38 秒と 765,400 マイクロ秒後の時刻を示します。

このマニュアルの例は全て PDT の時刻で示しますが、 以下で示すように時刻を表示したり解釈したりする場合、 tcpslice は、 tcpdump(1) のファイルがどのタイムゾーンで生成されたかに関わらず、 ローカルのタイムゾーンを使用します。 夏時間の設定は、対象となる日のローカルのタイムゾーンで適切な物が用いられます。 例えば、夏季の時刻には、夏時間の影響を反映し、冬季の時刻には 影響しません。

時刻は first time から(開始時刻を指定する場合)、 あるいは開始時刻から(終了時刻を指定する場合) の相対的な時刻として指定する事もできます。 指定するには秒数の前に `+' を付けます。 例えば、 +200 は開始時刻が first time から 200 秒後であることを示し、ふたつの引数 +200 +300 は first time から 200 秒後から、 first time から 500 秒後までの範囲を示します。

時刻は、年 (y)、月 (m)、日 (d)、時 (h)、分 (m)、秒 (s)、マイクロ秒 (u) で 指定する事もできます。例えば、上記の Unix 時刻 654321098.7654 は、 90y9m25d20h51m38s765400u と指定する事もできます。

この形式で時刻を指定した場合、省略されたフィールドのデフォルト値は以下 のようになります。最初に指定されたフィールドより 大きい 単位の省略されたフィールドについてのデフォルト値は、 first time (開始時刻を指定する場合) または開始時刻(終了時刻を指定する場合)と同じ 値となります。 最初に指定されたフィールドより 小さい 単位の省略されたフィールドについてのデフォルト値はゼロとなります。 例えば、入力ファイルの first time が Unix 時刻で上記の値、すなわち、1990 年 9 月 25 日、午後 8 時 51 分 (PDT) から 38 秒と 765,400 マイクロ秒後としましょう。この時、同じ日の 午後 9 時 36 分 (PDT) ちょうどを指定するには、 21h36m と表す事ができます。 午後 9 時 36 分 (PDT) から翌日の午前 1 時 54 分 (PDT) までを指定するには、 21h36m 26d1h54m と表す事ができます。

ymdhmsu 形式を使用する時にも相対時刻で指定する事ができます。 この時、省略されたフィールドの単位が指定された最初のフィールドより 大きい 単位ならば、デフォルト値は 0 となり、 省略されたフィールドの単位が指定された最初のフィールドより 小さい 単位ならば、デフォルト値は first time あるいは開始時刻と同じ値となります。 first time が上記の Unix 時刻だった場合、 22h +1h10m はその日の午後 10 時 00 分 (PDT) から 午後 11 時 10 分 (PDT) までを示し、 +1h +1h10m は午後 9 時 51 分 (PDT) の 38.7654 秒後から 午後 11 時 01 分 (PDT) の 38.7654 秒後までを示します。 +0 +1h と指定すれば、ファイルの最初から 1 時間分のデータを取り出す事ができます。

ymdhmsu 形式を用いる場合、 m が、`月' を示すのか `分' を示すのかが曖昧になります。 いずれになるかは、以下のように決定されます。 m フィールドの後に d フィールドが来た場合、月が指定されたと判断します。それ以外の場合は、 分が指定された判断します。

複数の入力ファイルが指定された場合、 tcpslice はまず、最初のファイル内の指定された時刻の範囲にあるパケットを出力します。 次に、範囲の開始時刻を最初のファイルの最後のパケットの時刻の直後に変更し、 次のファイルを処理し、以降これを繰り返します。したがって、時間順に ならんでいないパケットを含む複数のファイルをまとめる事は できません。 与えられたファイルのうち、先に処理されたファイルより新しいパケットに対して のみ処理されます。この機構によりひとつのパケットが複数回出力に現れる 事を防ぐ事ができます。

オプション
-R, -r, -t のいずれかが指定された場合、 tcpslice は、各入力ファイルの最初および最後のパケットの時刻を表示して終了します。 これらの 3 個のオプションのうち、1 つだけを指定することができます。

以下のオプションが指定できます:

-d  指定された範囲の開始時刻と終了時刻を表示して終了します。 このオプションは、指定した範囲が想定している時間と本当に一致しているかどうかを 確認するのに有効です。 -R, -r, -t のいずれかが指定された場合、それらに相当する形式で時刻を表示します。 指定がない場合は、内部形式 (-R) となります。

-R  各入力ファイルの最初および最後のパケットの時刻を内部形式 (つまり、 sssssssss.uuuuuu の形式) で表示します。

-r  -R と同じですが、 date(1) と同様の、読みやすい形式で時刻を表示します。

-t  -R と同じですが、時刻を tcpslice 形式、すなわち、上記に示した ymdhmsu の形で表示します。

-w file
    出力を stdout ではなく、 file とします。

関連項目
tcpdump(1)

作者
Vern Paxson <vern@ee.lbl.gov>, of Lawrence Berkeley Laboratory, University of California, Berkeley, CA.

バグ
数字や `+' で始まるファイル名を入力ファイルとして指定すると、 開始/終了時刻と間違うことがあります。このようなファイル名は、 先頭に `./' をつけて指定します。たとえば、 `04Jul76.trace' というファイル名ならば `./04Jul76.trace' とします。

tcpslice は、入力ファイルをくまなく探すためにランダムアクセスを使用するため、 stdin から入力することはできません。

tcpslice は、出力先が端末 ( isatty(3) で示される) である場合、出力しません。 これはバグではなく、ユーザの端末にバイナリデータをまき散らすことを 防ぐための仕様です。つまり、 stdout をリダイレクトするか、 -w により出力ファイルを指定しなければなりません。

tcpslice は、1 年以上にわたる tcpdump(1) のファイルや、 もともとのパケットの長さが 65,535 バイトを超えるようなパケットの一部を 含むようなファイル、3 パケット未満のパケットしか含まれないファイル に対しては正しく働かないでしょう。 これらのファイルを処理しようとすると、 `couldn't find final packet in file' というエラーメッセージが出力されます。 これらの問題は、大きなトレースファイルを扱う場合に、 tcpslice が処理速度を大きく改善するために使用している機構に起因します。 一方、 tcpslice は、如何なるサイズのトレースファイルでも中央のスライスを効率的に取り出す ことができ、不完全なトレースファイル (例えば、ファイル中の最後のパケットが 途中で切れているファイル、 tcpdump(1) が強制的に終了させられた 場合によくできる) に対しても正しく動作します。