web-dev-qa-db-ja.com

pcap struct pcap_pkthdr len vs caplen

Linuxでlibpcapを使用してパケットをスニッフィングしています。各パケットで取得するヘッダーは次のようになります。

struct pcap_pkthdr {
        struct timeval ts;      /* time stamp */
        bpf_u_int32 caplen;     /* length of portion present */
        bpf_u_int32 len;        /* length this packet (off wire) */
};

さて、caplenはキャプチャしたデータの長さであり、lenはネットワーク上のパケットの長さであると理解しています。場合によっては(たとえば、pcapデバイスを開くときにsnaplenを低く設定しすぎる場合)、パケットの一部のみをキャプチャする場合があります。その長さは「caplen」で、「len」は元の長さです。したがって、caplenはlen以下である必要がありますが、lenより大きくなることはありません。

それは適切な理解ですか?一部のマシンではcaplen> lenを使用しています

28
nos

少なくともpcapのmanページに基づいて、あなたの理解は正しいです。

caplenは、キャプチャで使用できるデータの量です。 lenは、パケットの実際の長さでした。

私はあなたにcaplen> lenを与えるようなケースを知りません。私のスナップレンは十分に高いので、私は通常それらが等しいように見えます。

19
Jason

はい、あなたの理解は正しいです。Caplenは常にLenよりも小さいです。パケット全体をキャプチャする必要がない場合もあります。しかし、チャンスがあれば、なぜパケット全体をキャプチャしないのでしょうか。なぜなら、ネットワークトラフィックが多い場合、それは良い考えではないからです。回線に表示されるパケット全体をキャプチャしないと、実際に貴重なデータが失われるのではないでしょうか。いいえ。実際には、目的によって異なります。プロトコルと宛先のアプリケーションに基づいてパケットを分類する場合は、約14バイト(イーサネット)+ 20バイト(Ip)+さらに20(Tcp)が必要です。したがって、プロトコルに基づいてパケットを分類するために必要なデータは明らかに54バイトだけなので、処理サイズをpcappkthdr-> lenからpcappkthdr-> caplenに減らすことで多くの負荷と時間が節約されます:)

パケット内のヘッダーが破損している場合(つまり、headerlength値が何らかの理由で台無しになっている場合)、キャプチャされた長さはパケットの実際の長さよりも長くなります。

5

Caplen> lenの場合、それはバグです。どのバージョンのlibpcapを使用していますか?

3
user862787