2016-09-26 12 views
0

pcapファイルを解析し、パケットを別々にカウントする必要があります(TCP、UDP、IP)。私はpcap、jnetpcapのようなライブラリをたくさん見つけましたが、私は外部ライブラリを使わずにこれをやりたいのです。 私はコードは必要ありませんが、単なる概念的説明です。ライブラリを使用せずにpcapファイル(tcpdump出力)からフレームを抽出する

Question 

どのように私は(それはTCP、UDP、IPこと)フレームを区別する必要があるのpcapファイルの解析中。私はフォーマットについて読むことを試みましたが、私が理解していないことは、特定のフレームに対して何バイト読みなければならないのか、どのようなフレームタイプであるのかを知る方法は何でしょうか。別々にパケットを抽出すると、他の情報を除外することができます。

+1

_ "外部ライブラリを使用せずにこれをやりたがっています" _ - スペックに飛び込み、ホイールを再開発する。そうする方法を私たちに教えても広すぎます。 – CodeCaster

+0

pcapはデータがワイヤ上にあるようにキャプチャします。それがIP、TCP、UDPであるかどうかを調べるには、これらのプロトコルがどのように送信されるかを理解する必要があります。あなたはpcap仕様ではなく、IP、TCP ...仕様でこれらのものを見つけることはできません。 –

答えて

0

各フレームを別々に解析し、カウントしようとしている値ごとにカウンタを設定する必要があります。調べているキャプチャがpcap/pcapng形式であると仮定すると、libpcapが役立つかもしれません。

何の迅速な実行を与えるためにこのコードは壊れやすいです

uint64_t ip_count, tcp_count, udp_count; 

void parse_pkt(uint8_t *data, uint32_t data_len) { 
    uint8_t *ether_hdr = data; 
    uint16_t ether_type = ntohs(*(uint16_t *) (data + 12)) 

    if (ether_type != 0x800) { 
     return; 
    } 
    ip_count += 1; 

    uint8_t *ip_hdr = data + 14; 
    protocol = ntohs(*(uint16_t *) (ip_hdr + 9)) 
    //protocol is either udp/tcp/sctp...etc 
    if (protocol == 0x11) { 
     udp_count++; 
    } else if (protocol == 0x06) { 
     tcp_count++; 
    } 
} 

// foreach pkt from libpcap_open call parse_pkt with the data and data_len 

を(下のレベルはVLANタグなしイーサネットであると仮定)しなければならないかもしれません。適切な長さと型チェックを持たないダイレクトオフセットにジャンプするのは良い考えではありません。

関連する問題