consulta tamanhos de buffer TCP para um socket no linux

6

Existe alguma maneira de procurar os tamanhos de buffer de envio / recebimento para soquetes TCP?

Eu andei por aí com netstat e ss, assim como o raw / proc / net / tcp. Lotes de guloseimas lá, incluindo as contagens de bytes em vôo, temporizadores, nome do processo, etc.

Mas eu gostaria de ser capaz de diagnosticar se alguns processos estão configurando SO_ {SND, RCV} BUF ... e mais interessante que valores o kernel está realmente usando para cada SKB.

    
por Curtis Doty 14.03.2011 / 21:04

3 respostas

5

A partir do lsof FAQ (procure por "Por que lsof report socket opções "), acredito que o Linux não faz a informação que você está depois disponível. (pelo menos não via / proc)

Se assim fosse, você poderia usar lsof -i <pid> -a -i tcp -T f , mas -T só usa "qs", não f no Linux. Você pode obter algumas outras informações do netstat ( netstat --tcp -p -o -e -e -v | grep <pid> ) que inclui a Fila de Envio e a Fila de Recebimento e algumas informações do cronômetro.

O que você poderia fazer é usar strace. Você terá que executar o programa via strace ( strace -ff -e network,ioctl PROGRAM ) ou antes de configurar o soquete TCP ( strace -fff -e network,ioctl -p PID ). ioctl é como essas opções seriam definidas, e network deveria capturar o suficiente para dizer quais conexões são essas. (mas apenas ioctl e, em seguida, use o lsof para descobrir onde as conexões devem funcionar também)

    
por 14.03.2011 / 21:58
2

Você pode fazer isso usando https://github.com/veithen/knetstat .

Por exemplo para nc -I 8192 -O 8192 www.google.com 80 isso daria (veja o SO_RCVBUF e SO_SNDBUF na terceira linha):

$ 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
    
por 08.01.2017 / 17:51
0

Você pode alterar o tamanho da recepção e do buffer de envio da seguinte forma (enviar buffer mostrado):

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

e para obter o tamanho atual, use:

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

Existe um bug conhecido no Linux que informa o tamanho atual do buffer como 1/2 do valor definido. Não me lembro se o valor interno é 1/2 do que foi solicitado ou se o relatório é 1/2 do que realmente é.

    
por 08.02.2013 / 23:12