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

Cur*_*oty 7 tcp linux-networking

有没有办法查找 TCP 套接字的发送/接收缓冲区大小?

我已经研究过 netstat 和 ss,以及原始的 /proc/net/tcp。那里有很多好东西,包括传输中的字节数、计时器、进程名称等。

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

fre*_*eit 5

lsof 常见问题解答(搜索“为什么 lsof 不报告套接字选项”),我相信 Linux 不会提供您想要的信息。(至少不是通过 /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 找出连接到的位置也应该工作)