2

我将设计一个用于 WiFi (802.11) 的网络分析器目前我使用 tshark 来捕获和解析 WiFi 帧,然后将输出传递到 perl 脚本以将解析的信息存储到 Mysql 数据库。

我只是发现我在这个过程中错过了很多帧。我检查并在管道期间似乎丢失了帧(当输出被传递到 perl 以在 Mysql 中得到 srored 时)这是怎么回事

(Tshark)--------帧丢失---->(Perl)-------->(MySQL)这是我将 tshark 的输出通过管道传输到脚本的方式:

sudo tshark -i mon0 -t ad -T fields -e frame.time -e frame.len -e frame.cap_len -e radiotap.length | perl tshark-sql-capture.pl 

这是我使用的 perl 脚本的简单模板 (tshark-sql-capture.pl)

# preparing the MySQL
my $dns = "DBI:mysql:capture;localhost";
my $dbh = DBI->connect($dns,user,pass);
my $db = "captured";

while (<STDIN>) {
    chomp($data = <STDIN>);
    ($time, $frame_len, $cap_len, $radiotap_len) = split "  ", $data;
    my $sth = $dbh-> prepare("INSERT INTO $db VALUES (str_to_date('$time','%M %d, %Y %H:%i:%s.%f'), '$frame_len', '$cap_len', '$radiotap_len'\n)" );
    $sth->execute;
}

#Terminate MySQL
$dbh->disconnect;

任何可以帮助提高性能的想法都会受到赞赏。或者可能有一种替代机制可以做得更好。现在我的性能是 50%,这意味着我可以在 mysql 中存储我捕获的大约一半的数据包。

4

3 回答 3

1

写在管道中的东西不会丢失,可能真正发生的事情是 tshark 尝试写入管道,但 perl+mysql 处理输入太慢,因此管道已满,写入会阻塞,所以 tshark 只是丢弃数据包。

瓶颈可能是 MySQL 或 Perl 本身,但也可能是 DB。检查 CPU 使用率,测量插入率。然后选择一个更快的数据库或写入多个数据库。您还可以尝试批量插入并增加管道缓冲区的大小。

更新

while (<STDIN>)

这会将一行读入$_,然后您忽略它。

于 2011-09-13T19:16:11.473 回答
1

对于管道问题,您可以使用 GULP http://staff.washington.edu/corey/gulp/改进数据包捕获

从手册页:

1) reduce packet loss of a tcpdump packet capture:
      (gulp -c works in any pipeline as it does no data interpretation)

        tcpdump -i eth1 -w - ... | gulp -c > pcapfile
      or if you have more than 2, run tcpdump and gulp on different CPUs
        taskset -c 2 tcpdump -i eth1 -w - ... | gulp -c > pcapfile

      (gulp uses CPUs #0,1 so use #2 for tcpdump to reduce interference)
于 2013-03-22T16:35:37.133 回答
0

您可以使用 FIFO 文件,然后使用插入延迟读取数据包并在 mysql 中插入。

sudo tshark -i mon0 -t ad -T fields -e frame.time -e frame.len -e frame.cap_len -e radiotap.length > MYFIFO
于 2012-02-23T19:42:33.833 回答