запросите буферные размеры TCP для сокета на Linux

Дрожание меньше затем 5 мс, вероятно, будет разбито любой ОС общего назначения (подсистема планирования) на конце соединения.

В общем дрожании ~10% RTT разумно, особенно долго, спорил, или ненадежные ссылки могут, очевидно, влиять на это.

7
задан 14 March 2011 в 22:04
3 ответа

От lsof FAQ (ищут, "Почему не делает lsof, сообщают об опциях сокета"), я полагаю, что Linux не делает информацию, Вы после доступны. (по крайней мере, не через/proc)

Если бы это сделало, то Вы могли бы использовать lsof -i <pid> -a -i tcp -T f, но-T только берет "qs", не f на Linux. Можно получить некоторую другую информацию от netstat (netstat --tcp -p -o -e -e -v | grep <pid>) который включает Отправить Очередь, и Примите Очередь и некоторую информацию о таймере.

То, что Вы могли сделать, использовать strace. Необходимо было бы или запустить программу через strace (strace -ff -e network,ioctl PROGRAM) или прежде чем это настраивает сокет TCP (strace -fff -e network,ioctl -p PID). ioctl то, как те опции были бы установлены, и network должен поймать достаточно для сообщения, каково соединения это. (но просто ioctl и затем используют lsof для выяснения, где соединения с должны работать, также),

5
ответ дан 2 December 2019 в 23:39

Вы можете изменить размер буфера приема и отправки следующим образом (показан буфер отправки):

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

и для получения текущего размера используйте:

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

Существует известная ошибка в Linux, который сообщает текущий размер буфера как 1/2 установленного значения. Я не могу вспомнить, составляет ли внутреннее значение половину запрошенного или отчет составляет половину того, что есть на самом деле.

0
ответ дан 2 December 2019 в 23:39

Вы действительно можете сделать это, используя https://github.com/veithen/knetstat .

Например. для nc -I 8192 -O 8192 www.google.com 80 это даст (см. SO_RCVBUF и SO_SNDBUF в третьей строке):

$ 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
2
ответ дан 2 December 2019 в 23:39

Теги

Похожие вопросы