2016-11-22 5 views
1

Ich habe einen HTTP Threading Proxy, d. H. Für jede Anfrage von Clients spawne ich einen Thread: jetzt möchte ich einige Statistiken wie Bits pro Sekunde (bps) und Pakete pro Sekunde (pps) sammeln.Verwenden von libpcap zum Sammeln von Statistiken über Verbindungen

Ich mag meinen Code, nur eine Sache zu tun, also, wenn ein Thread eine Verbindung behandelt, berechnet es nicht bps und pps für jedes Paket, ich überlasse das einem anderen Thread.

Ich erstelle einen Thread für jede HTTP-Anfrage vom Client und wenn der Proxy erfolgreich eine Verbindung zum angeforderten Remote-Server herstellt, sendet der Proxt die eigentliche HTTP-Anfrage an den Server und vor dem Routing von Daten erstellt der Verbindungsthread einen Logging-Thread: Logging-Thread berechnet bps und pps, bis die Verbindung offen ist. Der Verbindungsthread ermöglicht das Protokollieren von Thread-Informationen darüber, welche Pakete gefiltert werden sollen (lokale IP-Adresse, lokaler Port, Remote-IP-Adresse, Remote-Port), sodass jeder Protokollierungsthread nur Pakete aus dem übergeordneten Verbindungsthread filtert.

Ich habe Probleme, bps und pps für jedes Paket zu berechnen.

Hier ist der Pseudo-Code meiner Looping Erfassung von Paketen in Logging-Thread:

// pcap variables 
pcap_t *handle; 
struct pcap_pkthdr *header; 
const u_char *pkt_data; 
// timevals used to calculate delay from last filtered packet 
struct timeval oldTimevalUpload; 
struct timeval oldTimevalDownload;  
memset(&oldTimevalUpload, 0, sizeof(oldTimevalUpload)); 
memset(&oldTimevalDownload, 0, sizeof(oldTimevalDownload)); 

// stopLogging is a boolean flag declared in connection "parent" thread: 
// it is set to false when connection thread has done sending and 
// receiving data and connection is going to be closed 
while (((res = pcap_next_ex(handle, &header, &pkt_data)) >= 0) && (!stopLogging)) { 
    // check res 
    if (packet is upload) { 
     struct timeval difference; 
     timeval_subtract(&difference, &(header->ts), &oldTimevalUpload); 
     long long delay = (difference.tv_sec * 1000000) + difference.tv_usec; 
     long long acceptedPackets = ((long long)(pkt_data)) * 1000000; 
     long long acceptedBits = ((long long)(pkt_data+8)) * 8 * 1000000; 
     long long pps = acceptedPackets/delay; 
     long long bps = acceptedBits/delay; 
     debugRed(host << ", UPLOAD DIVIDE ACCEPTED PKTS " << acceptedPackets << 
      " AND ACCEPTED BITS " << acceptedBits << " PER DELAY " << delay << 
      " IS PPS " << pps << " AND BPS " << bps); 
     oldTimevalUpload.tv_sec = header->ts.tv_sec; 
     oldTimevalUpload.tv_usec = header->ts.tv_usec; 
    } else if (packet is download) { 
     // basically the same as above 
    } 
} 
debug("Quit logging connection " << localIPaddr << ":" << localPort << " and " 
    << remoteIPaddr << ":" << remotePort); 
pcap_close(handle); 

Und hier ist ein Beispiel für die Ausgabe:

www.netflix.com UPLOAD, DIVIDE ACCEPTED PKTS 99239440000000 AND ACCEPTED BITS 793915584000000 PER DELAY 1479811349890053 IS PPS 0 AND BPS 0 
www.netflix.com DOWNLOAD, DIVIDE ACCEPTED PKTS 99239440000000 AND ACCEPTED BITS 793915584000000 PER DELAY 1479811350032141 IS PPS 0 AND BPS 0 
www.netflix.com DOWNLOAD, DIVIDE ACCEPTED PKTS 99239440000000 AND ACCEPTED BITS 793915584000000 PER DELAY 4344 IS PPS 22845174953 AND BPS 182761414364 
www.netflix.com UPLOAD, DIVIDE ACCEPTED PKTS 99239440000000 AND ACCEPTED BITS 793915584000000 PER DELAY 146464 IS PPS 677568822 AND BPS 5420551015 
www.netflix.com DOWNLOAD, DIVIDE ACCEPTED PKTS 99239440000000 AND ACCEPTED BITS 793915584000000 PER DELAY 2815 IS PPS 35253797513 AND BPS 282030402841 
www.netflix.com UPLOAD, DIVIDE ACCEPTED PKTS 99239440000000 AND ACCEPTED BITS 793915584000000 PER DELAY 2808 IS PPS 35341680911 AND BPS 282733470085 
www.netflix.com DOWNLOAD, DIVIDE ACCEPTED PKTS 99239440000000 AND ACCEPTED BITS 793915584000000 PER DELAY 1120 IS PPS 88606642857 AND BPS 708853200000 
www.netflix.com UPLOAD, DIVIDE ACCEPTED PKTS 99239440000000 AND ACCEPTED BITS 793915584000000 PER DELAY 1134 IS PPS 87512733686 AND BPS 700101925925 
www.netflix.com UPLOAD, DIVIDE ACCEPTED PKTS 99239440000000 AND ACCEPTED BITS 793915584000000 PER DELAY 39658 IS PPS 2502381360 AND BPS 20019052498 
www.netflix.com DOWNLOAD, DIVIDE ACCEPTED PKTS 99239440000000 AND ACCEPTED BITS 793915584000000 PER DELAY 176317 IS PPS 562846690 AND BPS 4502773890 
www.netflix.com UPLOAD, DIVIDE ACCEPTED PKTS 99239440000000 AND ACCEPTED BITS 793915584000000 PER DELAY 136687 IS PPS 726034224 AND BPS 5808274261 

Ich weiß, kann mein Haus nie Netzwerk über 500 MBps standhalten, so etwas muss falsch sein.

This page zeigt, wie bps und pps zu berechnen und erklärt die Verschiebung von 8 chars in acceptedBits, aber ich werde es trotzdem melden. Hier können Sie die zweite und dritte Parameter der Funktion pcap_next_ex siehe:

Starting from the beginning of <code>pkt_data</code>, you can see the first <code>long integer</code> bytes represent accepted bytes

Grundsätzlich ich alles tat, was er sagte! Warum bekomme ich so große und seltsame bps und pps?

Unter Ubuntu arbeiten 14.04; weiß nicht, wie libpcap Version zu überprüfen, aber locate libpcap gibt dies:

/home/dexter/Desktop/wireshark-1.99.9/wiretap/libpcap.c 
/home/dexter/Desktop/wireshark-1.99.9/wiretap/libpcap.h 
/usr/lib/x86_64-linux-gnu/libpcap.a 
/usr/lib/x86_64-linux-gnu/libpcap.so 
/usr/lib/x86_64-linux-gnu/libpcap.so.0.8 
/usr/lib/x86_64-linux-gnu/libpcap.so.1.5.3 
/usr/share/doc/libpcap-dev 
/usr/share/doc/libpcap0.8 
/usr/share/doc/libpcap0.8-dev 
/usr/share/doc/libpcap-dev/changelog.Debian.gz 
/usr/share/doc/libpcap-dev/copyright 
/usr/share/doc/libpcap0.8/CREDITS.gz 
/usr/share/doc/libpcap0.8/README.Debian 
/usr/share/doc/libpcap0.8/README.gz 
/usr/share/doc/libpcap0.8/changelog.Debian.gz 
/usr/share/doc/libpcap0.8/copyright 
/usr/share/doc/libpcap0.8-dev/changelog.Debian.gz 
/usr/share/doc/libpcap0.8-dev/copyright 
/var/lib/dpkg/info/libpcap-dev.[list,md5sums] 
/var/lib/dpkg/info/libpcap0.8-dev.[list,md5sums,preinst] 
/var/lib/dpkg/info/libpcap0.8:amd64.[list,md5sums,postinst,postrm,shlibs,symbols] 

Antwort

1

In Ihrem Code:

long long acceptedPackets = ((long long)(pkt_data)) * 1000000; 
long long acceptedBits = ((long long)(pkt_data+8)) * 8 * 1000000; 

Während pkt_data ein Zeiger ist.

Was Sie tun, ist im Grunde die Adresse der Paketdaten, umwandeln in eine long long, Hinzufügen von 8 (für die zweite Zeile), Multiplikation mit einer Konstante und in Betracht, dass Ihr Wert, der semantisch inkorrekt ist . Sie sollten diesen Zeiger unter Berücksichtigung Ihres Datentyps dereferenzieren (konvertieren Sie den pkt_data in einen Zeiger auf long long).

In Code:

long long acceptedPackets = (*(long long*)(pkt_data)) * 1000000; 
long long acceptedBits = (*(long long*)(pkt_data+8)) * 8 * 1000000; 
// this also works: 
//long long acceptedPackets = *(long long*)pkt_data * 1000000; 
//long long acceptedBits = *((long long*)pkt_data + 1) * 8 * 1000000; 

Ein Beispiel finden Sie http://ideone.com/JqmRre

EDIT:

Von this guide:

Das letzte Argument ist die interessanteste von ihnen alle und die meisten verwirrend für den durchschnittlichen Anfänger pcap Programmierer. Es ist ein weiterer Zeiger auf ein u_char, und sie zeigt auf das erste Byte eines Datenblock das gesamte Paket enthält

Es bedeutet, dass die selbst pkt_data Paketinhalte ist. Sofern Ihre ersten 16 Bytes des Pakets nicht die gewünschten Informationen enthalten (was nicht stimmt, da es das rohe Paket enthält, also die Header ETH, IP und TCP/UDP), können Sie diese Daten nicht verwenden. Um die PPS-Metriken zu erhalten, müssten Sie einen einfachen Zähler in Ihrer Schleife implementieren (da Sie diese Metrik in jedem Frame drucken, sollte ein einfacher long long pps = (long long)(1.0/delay); genügen - beachten Sie, dass die Division in Gleitkomma ist. Für Ihre BPS-Metriken .., können Sie die Frame-Header Informationen verwenden, sollten also long long bps = (long long)(header->caplen * 8.0/delay); tun sollten

als Randbemerkung, für die Zeitmetriken, da Sie C++ 11 verwenden, versuchen chrono Verwendung Es ist klarer und sicherer als timeval.

Fügen Sie eine #include <chrono> hinzu

Ihr endgültiger Code sollte in etwa so aussehen:

+0

ich Ihren Rat gefolgt: jetzt habe ich negative Zahlen XD 'www.youtube.com DOWNLOAD DIVIDE PKTS AKZEPTIERT -9153173178195537408 UND AKZEPTIERT BITS -2444556543073261568 PRO DELAY 1479847752267586 IST PPS -6185 UND BPS -1651 www.youtube.com DOWNLOAD DIVIDE AKZEPTIERT PKTS -9153173178195537408 UND AKZEPTIERT BITS -2444556543073261568 PRO DELAY 2745 IST PPS -3334489318104020 UND BPS -890548831720678 www.youtube.com UPLOAD DIVIDE AKZEPTIERT PKTS -1866508824056485888 UND AKZEPTIERTE BITS -2458024441489261568 PRO VERZÖGERUNG 1479847752270362 IS PPS -1261 UND BPS -1660' und s o auf ... – elmazzun

+0

Bitte überprüfen Sie meine Bearbeitung –

0

Wie wäre es mit den PPS- und BPS-Berechnungen für einen anderen Prozess anstelle eines anderen Threads? Ich kann das Dienstprogramm empfehlen, das HTTP-Pakete direkt von der Netzwerkschnittstelle erfasst und pps, bps und viele weitere Statistiken berechnet.

Da es Open-Source ist, können Sie den Code ändern, um Ihre Zwecke zu erfüllen oder verwenden Sie es wie es ist.

Hier ist ein Beispiel für die Ausgabe dieses Dienstprogramm:

STATS SUMMARY 
============= 

General stats 
-------------------- 

Sample time:          18.374 [Seconds] 
Number of HTTP packets:       5662 [Packets] 
Rate of HTTP packets:       291.910 [Packets/sec] 
Number of HTTP flows:        55 [Flows] 
Rate of HTTP flows:        2.836 [Flows/sec] 
Number of HTTP pipelining flows:      0 [Flows] 
Number of HTTP transactions:      322 [Transactions] 
Rate of HTTP transactions:      16.601 [Transactions/sec] 
Total HTTP data:        5916120 [Bytes] 
Rate of HTTP data:       305011.600 [Bytes/sec] 
Average packets per flow:      102.945 [Packets] 
Average transactions per flow:     5.963 [Transactions] 
Average data per flow:      107565.818 [Bytes] 

HTTP request stats 
-------------------- 

Number of HTTP requests:       323 [Requests] 
Rate of HTTP requests:       16.653 [Requests/sec] 
Total data in headers:       188596 [Bytes] 
Average header size:       583.889 [Bytes] 

HTTP response stats 
-------------------- 

Number of HTTP responses:       332 [Responses] 
Rate of HTTP responses:       17.117 [Responses/sec] 
Total data in headers:       119577 [Bytes] 
Average header size:       360.172 [Bytes] 
Num of responses with content-length:    320 [Responses] 
Total body size (may be compressed):   5409410 [Bytes] 
Average body size:       16904.406 [Bytes] 

HTTP request methods 
-------------------- 

| Method | Count | 
--------------------- 
| GET  | 321 | 
| POST  | 2  | 
--------------------- 

Hostnames count 
-------------------- 

| Hostname         | Count | 
---------------------------------------------------- 
| images1.teny.co.qq      | 180 | 
| www.teny.co.qq       | 82 | 
| go.teny.co.qq       | 14 | 
| www.niwwin.co.qq       | 8  | 
| az835984.vo.msecnd.net     | 5  | 
| asset.pagefair.com      | 3  | 
| b.scorecardresearch.com     | 3  | 
| cdn.oolala.com       | 3  | 
| asset.pagefair.net      | 2  | 
| dy2.teny.co.qq       | 2  | 
| ecdn.firstimpression.io     | 2  | 
| pagead2.googlesyndication.com   | 2  | 
| server.exposebox.com      | 2  | 
| totalmedia2.teny.co.qq     | 2  | 
| vrp.mybrain.com       | 1  | 
| trc.oolala.com       | 1  | 
| zdwidget3-bs.sphereup.com    | 1  | 
| vrt.mybrain.com       | 1  | 
| www.googletagmanager.com     | 1  | 
| a.visualrevenue.com      | 1  | 
| tpc.googlesyndication.com    | 1  | 
| static.dynamicyield.com     | 1  | 
| st.dynamicyield.com      | 1  | 
| sf.exposebox.com       | 1  | 
| mediadownload.teny.co.qq     | 1  | 
| cdn.firstimpression.io     | 1  | 
| ajax.googleapis.com      | 1  | 
---------------------------------------------------- 

Status code count 
-------------------- 

| Status Code     | Count | 
---------------------------------------- 
| 200 OK      | 327 | 
| 204 No Content    | 1  | 
| 301 Moved Permanently  | 1  | 
| 302 Moved Temporarily  | 1  | 
| 304 Not Modified    | 2  | 
---------------------------------------- 

Content-type count 
-------------------- 

| Content-type     | Count | 
------------------------------------------ 
| application/javascript   | 11 | 
| application/json    | 1  | 
| application/x-javascript  | 23 | 
| image/gif      | 22 | 
| image/jpeg      | 157 | 
| image/png      | 85 | 
| text/css      | 9  | 
| text/html      | 8  | 
| text/javascript    | 13 | 
------------------------------------------ 
Verwandte Themen