Ich möchte einen Zähler für die TCP-Nutzlastaktivität (Gesamtanzahl an empfangenen Bytes) entweder für einen gegebenen Dateideskriptor oder für eine gegebene Schnittstelle suchen. Vorzugsweise wäre der angegebene Dateideskriptor aber für die Schnittstelle ausreichend. Idealerweise würde ich gerne wissen, welche Bytes ich gelesen habe, sogar solche, die ich noch nicht in den Userspace eingelesen habe.
Ich habe das TCP_INFO
-Feature von getsockopt()
gesehen, aber keines der Felder scheint "Total Bytes received" oder "Total Bytes übertragen (acked, zB)" zu speichern, soweit ich das beurteilen kann.
Ich habe auch die netlink
IFLA_STATS
+ RTNL_TC_BYTES
und die SIOCETHTOOL
+ ETHTOOL_GSTATS
ioctl()
( rx_bytes
-Feld) für die Schnittstellen gesehen, und diese sind großartig, aber ich weiß nicht ' Ich denke, sie werden in der Lage sein, zwischen den Overhead / Headern der anderen Schichten und den tatsächlichen Payload-Bytes zu unterscheiden.
procfs
hat /proc/net/tcp
, aber das scheint auch nicht das zu enthalten, wonach ich suche.
Gibt es eine Möglichkeit, diese bestimmten Daten zu erhalten?
EDIT: Promiscuous-Modus hat einen unerträglichen Einfluss auf den Durchsatz, daher kann ich nichts nutzen, was es nutzt. Ganz zu schweigen davon, dass das Implementieren großer Teile des IP-Stacks, um zu bestimmen, welche Pakete geeignet sind, über meinen beabsichtigten Umfang für diese Lösung hinausgeht.
Das Ziel ist es, eine übergreifende / keine Vertrauenswürdigkeit / Zweitschätzung der Werte zu haben, die ich in recvmsg () hinterlasse.
Die richtige Sache ist es, diese Werte korrekt zu verfolgen, aber es wäre wertvoll, ein einfaches "Hey OS? Wie viele Bytes habe ich wirklich auf diesem Sockel erhalten?"
Man könnte auch ioctl Aufruf mit SIOCINQ verwenden, um die Menge der ungelesenen ungelesenen Daten im Empfangspuffer zu erhalten. Hier ist die Verwendung von der Manpage: Ссылка
%Vor%Für Schnittstellen-TCP-Statistiken können wir "netstat -i -p tcp" verwenden, um Statistiken pro Schnittstelle zu finden.
Möchten Sie dies zur Diagnose oder zur Entwicklung?
Wenn Diagnose vorhanden ist, kann tcpdump Ihnen anhand der Port- und Host-Details genau sagen, was im Netzwerk passiert.
Wenn für die Entwicklung vielleicht ein bisschen mehr Informationen über das, was Sie erreichen möchten, helfen würden ...
ifconfig gibt RX- und TX-Summen aus.
ifconfig ruft diese Details von / proc / net / dev ab (wie Sie über strace ifconfig sehen können).
Es gibt auch die Send / Receive-Q-Werte, die von netstat -t angegeben werden, wenn das näher an dem ist, was Sie wollen.
Vielleicht kann die Statistik in / proc / net / dev helfen. Ich bin nicht vertraut mit Payload im Vergleich zu vollen Paketen einschließlich Header, so dass die Frage schwieriger zu beantworten ist.
Was Statistiken über einzelne Dateideskriptoren angeht, sind mir keine Standardmittel bekannt, um diese Informationen zu erhalten.
Wenn es möglich ist, den Start der Programme zu steuern, für die Statistiken benötigt werden, ist es möglich, eine "Interzeptor" -Bibliothek zu verwenden, die ihre eigenen Aufrufe read (), write (), sendto () und recvfrom () implementiert Übergeben Sie die Aufrufe der Standard-C-Bibliothek (oder direkt an den Systemaufruf), führen Sie Leistungsindikatoren für die Aktivität und suchen Sie nach Möglichkeiten, diese Werte zu veröffentlichen.
Wenn Sie nicht nur den gesamten RX / TX pro Schnittstelle zählen möchten (was bereits in ifconfig / iproute2-Tools verfügbar ist) ...
Wenn Sie ein wenig mehr in / proc suchen, können Sie etwas mehr Informationen bekommen. Genauer gesagt /proc/<pid>/net/dev
.
Beispielausgabe:
%Vor% Wenn Sie anfangen zu suchen, kommen die Informationen von net/core/net-procfs.c
von Linux-Kernel (procfs verwendet diese Informationen nur). All dies bedeutet natürlich, dass Sie einen bestimmten Prozess benötigen, den Sie verfolgen können.
Sie können entweder die in /proc
verfügbaren Informationen durchsuchen oder wenn Sie etwas Stabileres benötigen, dann kann die Duplizierung der net-procfs-Funktionalität für Ihre Anwendung sinnvoll sein.
Tags und Links linux networking tcp