查询Linux上套接字的TCP缓冲区大小

有什么方法可以查找TCP套接字的发送/接收缓冲区大小吗?

我使用netstat和ss,以及raw / proc / net / tcp。 那里有很多好东西,包括飞行中的字节数,定时器,进程名等等。

但是我希望能够诊断某些过程是否设置了SO_ {SND,RCV} BUF …以及更有趣的内核实际上为每个SKB使用的值。

从lsof常见问题解答 (search“为什么不报告套接字选项”),我相信Linux不会使您的信息可用。 (至less不是通过/ proc)

如果是的话,你可以使用lsof -i <pid> -a -i tcp -T f ,但是-T只在Linux上使用“qs”而不是f。 您可以从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来找出连接应该在哪里工作)

你可以使用https://github.com/veithen/knetstat来做到这一点。

例如,对于nc -I 8192 -O 8192 www.google.com 80这将给(参见第三行的SO_RCVBUFSO_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 

您可以按如下方式更改接收和发送缓冲区的大小(显示发送缓冲区):

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

并获得当前的大小,使用:

 getsockopt(socket, SOL_SOCKET, SO_SNDBUF, (char &) &buffersize, sizeof(buffersize)); 

Linux中有一个已知的错误,报告当前缓冲区大小为设置值的1/2。 我不记得内部价值是要求的1/2,还是报告是实际的1/2。