Fragen Sie die TCP-Puffergrößen nach einem Socket unter Linux ab


7

Gibt es eine Möglichkeit, die Sende- / Empfangspuffergrößen für TCP-Sockets zu ermitteln?

Ich habe sowohl mit netstat und ss als auch mit raw / proc / net / tcp herumgestöbert. Dort gibt es viele Extras, einschließlich der Anzahl der Bytes im Flug, der Timer, des Prozessnamens usw.

Aber ich möchte in der Lage sein zu diagnostizieren, ob einige Prozesse SO_ {SND, RCV} BUF setzen ... und interessanter, welche Werte der Kernel tatsächlich für jede SKB verwendet.


1
Suchen Sie nach den Konfigurationseinstellungen (min / max / default) oder der aktuell verwendeten Speichermenge?
Hyppy

Antworten:


5

In den lsof-FAQ (Suche nach "Warum meldet lsof keine Socket-Optionen") glaube ich, dass Linux die gewünschten Informationen nicht verfügbar macht. (zumindest nicht über / proc)

Wenn ja, könnten Sie verwenden lsof -i <pid> -a -i tcp -T f, aber -T nimmt nur "qs", nicht f unter Linux. Sie können einige andere Informationen von netstat ( netstat --tcp -p -o -e -e -v | grep <pid>) erhalten, einschließlich der Sendewarteschlange und der Empfangswarteschlange sowie einiger Timer-Informationen.

Was Sie tun könnten, ist Strace verwenden. Sie müssten das Programm entweder über strace ( strace -ff -e network,ioctl PROGRAM) oder vor dem Einrichten des TCP- Sockets ( ) ausführen strace -fff -e network,ioctl -p PID. ioctlAuf diese Weise würden diese Optionen festgelegt und networksollten genug erfassen, um festzustellen, um welche Verbindungen es sich handelt. (aber nur ioctl und dann lsof, um herauszufinden, wo die Verbindungen auch funktionieren sollen)


Dieser Beitrag ist alt, aber jetzt unter Linux können Sie zu lsof -T qs verwenden, um den Socket-Buff, ich habe Debian Jessie ausprobiert und es funktioniert
c4f4t0r

2

Sie können das tatsächlich mit tun https://github.com/veithen/knetstat.

ZB nc -I 8192 -O 8192 www.google.com 80dafür würde man geben (siehe SO_RCVBUFund SO_SNDBUFin der dritten Reihe):

$ cat /proc/net/tcpstat
Recv-Q Send-Q Local Address           Foreign Address         Stat Diag Options
     0      0 0.0.0.0:22              0.0.0.0:*               LSTN      SO_REUSEADDR=1,SO_REUSEPORT=0,SO_KEEPALIVE=0,TCP_NODELAY=0
     0      0 10.132.0.4:22           74.125.73.164:38922     ESTB      SO_REUSEADDR=1,SO_REUSEPORT=0,SO_KEEPALIVE=1,TCP_NODELAY=1
     0      0 10.132.0.4:44058        74.125.206.103:80       ESTB      SO_REUSEADDR=0,SO_REUSEPORT=0,SO_KEEPALIVE=0,SO_RCVBUF=8192,SO_SNDBUF=8192,TCP_NODELAY=0
     0      0 10.132.0.4:44054        74.125.206.103:80       TIMW 
     0      0 10.132.0.4:22           74.125.73.96:45722      ESTB      SO_REUSEADDR=1,SO_REUSEPORT=0,SO_KEEPALIVE=1,TCP_NODELAY=1

0

Sie können die Größe des Empfangs- und des Sendepuffers wie folgt ändern (Sendepuffer wird angezeigt):

int buffersize = 64*1024;  // 64k
setsockopt(socket, SOL_SOCKET, SO_SNDBUF, (char *) &buffersize, sizeof(buffersize));

und um die aktuelle Größe zu erhalten, verwenden Sie:

socklen_t buffersize_len = sizeof(buffersize); // in/out parameter
getsockopt(socket, SOL_SOCKET, SO_SNDBUF, (char *) &buffersize, &buffersize_len);

Unter Linux ist ein Fehler bekannt, der die aktuelle Puffergröße als 1/2 des eingestellten Werts angibt. Ich kann mich nicht erinnern, ob der interne Wert die Hälfte dessen ist, was angefordert wurde, oder ob der Bericht die Hälfte dessen ist, was er wirklich ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.