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:
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]
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
Bitte überprüfen Sie meine Bearbeitung –