2011-09-13 35 views
1

我要爲WiFi(802.11)設計一個網絡分析儀 目前我使用tshark捕獲和解析WiFi幀,然後將輸出傳輸到perl腳本以存儲解析的信息到Mysql數據庫。如何將網絡數據包捕獲到MySQL

我剛剛發現我在這個過程中錯過了很多幀。我檢查和框架似乎丟失在管道(當輸出傳遞到perl以獲得在Mysql中) 這是怎麼回事

(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; 

任何可以幫助改善性能的想法是ap preciated.Or可能有一個可以做得更好的替代機制。 現在我的表現是50%,這意味着我可以將大約一半的數據包存儲在mysql中。

+0

禁止你在捕捉表有任何按鍵。每次更新都會導致密鑰更新,當您執行插入風暴時可能會導致主要的減速。關閉鍵,然後在完成插入後重建/重新啓用索引。 –

回答

1

寫入管道的東西不會丟失,可能真正發生的是tshark嘗試寫入管道,但perl + mysql太慢而無法處理輸入,因此pipeb已滿,寫入將會阻塞tshark只是丟棄數據包。

瓶頸可能是MySQL或Perl本身,但可能是數據庫。檢查CPU使用情況,測量插入率。然後選擇更快的數據庫或寫入多個數據庫。您也可以嘗試批量插入並增加管道緩衝區的大小。

更新

while (<STDIN>) 

這種讀取一行到$_,那麼你忽略它。

+0

我過濾了我的tshark捕獲,因此我將幀捕獲速率降低到e.x 10每分鐘。問題變得更糟。我在DB中看不到任何框架!看來我的Perl可能有一些問題。我想知道如何使用文本文件作爲Tshark和Perl之間的緩衝區。所以我可以讓它們不同步! thsrak ---> textfile as buffer ---> Perl ----> MySQL 問題是我不知道如何保持文件打開,並在每次寫入新幀時繼續讀取文件文件??! 你有什麼想法嗎? – hra

+0

ahhh。請參閱更新。 –

+0

yey。謝謝!!這就解決了我的第一個問題,現在在重幀率下我幾乎有100%的表現!但是,當我減慢幀速率爲例如每分鐘10幀我無法捕捉幀。你知道當perl腳本退出while循環時以及在tshark捕獲另一個數據包之後(例如10分鐘)會發生什麼。我想我應該去學習更多關於管道是如何在Linux中工作的! – hra

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 
0

管道的問題,可以提高數據包捕獲與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)