2010-02-03 8 views
7

Ich frage mich, ob es eine programmatische Möglichkeit gibt, ein Maß für die volle Bandbreite zu erhalten, die beim Senden von Daten über einen TCP-Datenstrom verwendet wird. Da ich nicht wissen kann, wie der Netzwerkstack den Stream in Pakete aufteilt, oder wenn er ein TCP SYN oder ACK oder viele der Dinge, die er im Hintergrund für Sie tut, sendet, kann ich nur eine grobe Schätzung dafür erhalten.Wie kann der TCP/IP Overhead ohne Sniffing gemessen werden?

Die einzige Lösung, die ich mir vorstellen kann, ist, tatsächlich die Schnittstelle zu schnüffeln, aber ich würde gerne denken, dass der Stapel diese Statistiken bereits für mich sammeln kann.

Dies läuft in Java unter Windows oder Linux (natürlich würde eine portable Lösung bevorzugt), aber ich kann eine C/C++ - Antwort JNI-iize, so dass (und OS API-Aufrufe) ist auch eine gute Antwort . Vielen Dank!

+1

Wenn Sie nach OS-Tools fragen, die verfügbar sein könnten, um diese Informationen zu sammeln, handelt es sich wirklich um eine Server-Fehler-Frage. –

+1

Nein Ich frage nicht nach Betriebssystem-Tools, ich frage nach einer API, die diese Informationen sammeln könnte. –

+0

Nun, irgendeine Lösung für das andere als Sniffing? Ich habe eine App, die Audio-/Video-Streams sammelt, und ich würde wirklich davon profitieren, die genaue Bandbreite zu kennen, die aufgrund von Netzwerküberlastung und TCP-Overhead verwendet wird. –

Antwort

-1

Nun TCP ist ein festes Datengram, das von der MTU spezifiziert wird. Wenn Sie Ihre MTU kennen, können Sie herausfinden, wie viele Datengramme Sie übertragen müssen, und TCP folgt einem Standardmodell für die Bestätigung.

Here is a good article auf dieser Hilfe herauszufinden, den Overhead der Datenübertragung, die den Overhead von Ethernet und den anderen Schichten des Stapels enthält.

+0

Nun, nicht genau. Führen Sie tcpdump auf Ihrer SSH-Verbindung - sind alle Segmente der gleichen Größe? –

+0

Ich sollte klarstellen, dass es eine maximale Segmentgröße gibt, die von der MTU bestimmt wird. Wenn die Menge der Daten, die die Anwendung senden möchte, das von der MTU bestimmte MSS überschreitet, wird das Paket "fragmentiert". Aber im Wesentlichen, wenn Sie wissen, wie viel Sie gleichzeitig senden möchten und die MTU im Netzwerk, können Sie herausfinden, wie viel Overhead für die Übertragung Ihrer Daten benötigt wird. – Kitson

+2

Ja ... das wäre der * minimale * mögliche Overhead, nicht der tatsächliche, der davon abhängt, wie die App das Netzwerk im Laufe der Zeit nutzt. Sagen wir, ich muss jede Minute 40 Bytes Einweg übertragen. Wenn ich Verbindungs-Handshake und -Abbruch ignoriere, würde ich wahrscheinlich mit 80-Byte-Paketen enden (20 für IPv4-Header, 20 für TCP-Header ohne Optionen, 40 für Daten). Das sind bereits 100% des Overheads, nicht einmal die zurückkommenden ACKs, die überhaupt keine Anwendungsdaten enthalten. –

-1

Wenn dieser TCP-Stream die einzige Sache ist, die Ihre Schnittstelle durchläuft, können Sie einfach die Schnittstellenstatistik abfragen (gesendete/empfangene Bytes) und die Zeit selbst messen (+ rechnen).

1

Kann nicht für Windows sprechen, aber der Linux-Kernel, ab 2.6.37, sammelt nicht die Statistiken, nach denen Sie suchen. Per-Buchse müsste Statistiken oder seine Nachkommen in struct Socke sein und ich sehe keine Sende-/Empfangs dort Zähler:

http://lxr.linux.no/linux+v2.6.37.3/include/net/sock.h#L224

+0

Einige davon werden nach/proc/net/tcp exportiert, siehe [hier] (http://lkml.indiana.edu/hypermail/linux/kernel/0409.1/2166.html). Aber es gibt keine expliziten Zähler ... –

2

[Windows-spezifische Antwort]

Unter Windows können Sie Betrachten Sie ETW (Event Tracing for Windows). Im Allgemeinen ist ETW die Technologie, die verwendet wird, um Informationen zur Ablaufverfolgung/Protokollierung unter Windows bereitzustellen, und die meisten Microsoft-Software sind bereits mit ETW-Anbietern ausgestattet, die Sie verwenden können. In Ihrem Fall denke ich, dass der Microsoft-Windows-TCPIP-Anbieter Informationen (z. B. lokale/entfernte Adresse und Port, Operation, gesendete/empfangene Bytes usw.) enthält, die für Sie hilfreich sein könnten.

Zum Beispiel konnte ich die TCPIP Ereignisse in einer Datei starten Sammeln der Befehl:

logman start MyTcpipLog -p Microsoft-Windows-TCPIP -ets

Und hör mit

logman stop MyTcpipLog -ets

Dann wird die Datei MyTcipipLog.etl kann mit einer Reihe von verschiedenen Tools (zB xperf) geöffnet werden, aber es gibt APIs, mit denen Sie diese Datei selbst analysieren können.

Wenn Sie wollten dies zur Laufzeit zu tun, können Sie eine "real-time" ETW session erstellen, um die Ereignisse zu verarbeiten, wie sie hereinkommen.

Wenn Sie ETW neu sind, ist hier a helpful article on MSDN, die ich verwendet.

0

Unter Linux ist dies eine ziemlich triviale Information für root zu erhalten (erstellen Sie einfach eine Netfilter-Kette, die Ihrem Traffic entspricht, können Sie beispielsweise eine Prozess-ID-Übereinstimmung verwenden, lesen Sie später die mit der Kette verbundenen Zähler).Dies mit eingeschränkten Berechtigungen zu tun, kann durchaus unmöglich sein.

Nicht sicher für Windows.

0

Es sollte möglich sein, Conntrack Accounting zu verwenden, um Pakete und Bytes pro Verbindung zu messen. Dann sollte die Information über Netlink-Sockets abgefragt werden. Rufen Sie die Informationen zu Ihrem Socket mit getsockname und getpeername ab und verwenden Sie diese Informationen, um den Verbindungsverfolgungseintrag zu suchen.

Dies erfordert kürzliche genug Kernel, Conntrack-Modul geladen und libnetfilter_conntrack.

Die gleichen Informationen sind auch in/proc/net/nf_conntrack verfügbar, aber diese Datei sollte nicht zu oft geparst werden.

Und es gibt ein Tool namens "Conntrack", mit dem Sie Zugriff auf diese Informationen über die Befehlszeile erhalten.

0

Sie könnten in Perfumer Leistungsindikatoren zu konsumieren. Der Zähler für die Netzwerkschnittstelle/aktuelle Bandbreite könnte das sein, was Sie brauchen. Sie können Leistungsindikatoren aus .NET-Code erstellen und verwenden.

+0

http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.aspx –

+0

http://www.codeproject.com/KB/system/networkmonitorl. aspx –

Verwandte Themen