web-dev-qa-db-ja.com

クエリTCP Linux上のソケットのバッファサイズ

TCPソケットの送信/受信バッファサイズを検索する方法はありますか?

私はnetstatとssの両方、および生の/ proc/net/tcpを試しました。飛行中のバイト数、タイマー、プロセス名など、たくさんの便利な機能があります。

しかし、いくつかのプロセスがSO_ {SND、RCV} BUFを設定しているかどうか、さらに興味深いことに、カーネルが各SKBに実際に使用している値を診断できるようにしたいと思います。

7
Curtis Doty

lsof FAQ (「なぜlsofがソケットオプションをレポートしないのか」を検索)から、Linuxはあなたが入手した情報を入手できないと思います。 (少なくとも/ proc経由ではない)

その場合、lsof -i <pid> -a -i tcp -T fを使用できますが、-Tは "qs"のみを取り、Linuxでは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を使用して、接続先が機能する場所も特定します)。

5
freiheit

実際にはhttps://github.com/veithen/knetstat

例えば。ために nc -I 8192 -O 8192 www.google.com 80これは与えるでしょう(SO_RCVBUFおよびSO_SNDBUF 3行目):

$ 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
Andreas Veithen

次のように、受信バッファと送信バッファのサイズを変更できます(送信バッファを示しています)。

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として報告する既知のバグがあります。内部値が要求されたものの1/2であるのか、またはレポートが実際のものの1/2であるのかを思い出せません。

0
erict