10 Stimmen

Wie erhalte ich die Menge der nicht-ACK-ed TCP-Daten für den Socket?

Linux hat das ioctl SIOCOUTQ, das in der Man-Page tcp(7) beschrieben ist und die Menge der nicht gesendeten Daten in Socket-Puffern zurückgibt. Wenn ich den Kernel-Code richtig verstehe, werden alle nicht-ACKed-Daten als "ungesendet" gezählt. Der ioctl ist mindestens seit 2.4.x verfügbar.

Gibt es etwas Ähnliches für {Free,Net,Open,*}BSD, Solaris, Windows?

10voto

Nathaniel J. Smith Punkte 10107

Es gibt (mindestens) zwei verschiedene Informationen, die Sie benötigen: die Menge der noch nicht gesendeten Daten und die Menge der gesendeten, aber noch nicht bestätigten Daten.

Unter Linux: SIOCOUTQ wird dokumentiert, um die Menge der nicht gesendeten Daten anzugeben, gibt aber tatsächlich die Summe von (nicht gesendete Daten + gesendete-aber-nicht-ACK-ed Daten) an. A neuester Patch (Februar 2016) ermöglichte es, die tatsächlich nicht gesendeten Daten aus dem tcpi_notsent_bytes Feld in der TCP_INFO Struktur.

Unter macOS und iOS: getsockopt(fd, SOL_SOCKET, SO_NWRITE, ...) ist genau wie SIOCOUTQ Es ist dokumentiert, dass es die Menge der nicht gesendeten Daten angibt, aber es gibt tatsächlich die Summe von (nicht gesendete Daten + gesendete, aber nicht bestätigte Daten). Ich kenne keine Möglichkeit, feinere Informationen zu erhalten.

Unter Windows: GetPerTcpConnectionEStats mit dem TcpConnectionEstatsSendBuff Option gibt Ihnen sowohl ungesendete Daten als auch gesendete, aber nicht bestätigte Daten als zwei separate Zahlen .

Ich weiß nicht, wie ich diese Informationen auf anderen Betriebssystemen erhalten kann.

0voto

Twelvestring Punkte 31

Da TCP/IP als Stream-Device implementiert ist, könnte es möglich sein, einen Kernel-Tauchgang zu machen und die queue->q_count (Anzahl der Bytes in der Warteschlange) zu erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X