4

UDP データグラムが小さい場合に UDP スループットがどのように影響を受けるかを確認するために、デフォルトのソケット送信バッファ サイズを小さいサイズに変更しようとしています。これを行うにはsetsockopt、オプションを指定して関数を使用しSO_SNDBUF、バッファ サイズを 64 バイトに設定しようとしています。getsockoptまた、関数の結果を確認するためにも使用しsetsockoptます。

私が使用するコードは次のとおりです。

int sock_fd;
struct sockaddr_in server_addr;
static int target_port = PORT;
int curr_snd_buff = 0;
int sk_snd_buff = 64;
socklen_t optlen;

if( (sock_fd=socket(AF_INET,SOCK_DGRAM,0)) == -1)
 fatal("in socket (client_udp)");

memset(&server_addr, 0, sizeof(struct sockaddr_in));

server_addr.sin_family = AF_INET;                                                                                          
server_addr.sin_addr.s_addr=inet_addr(args->a_ip);
server_addr.sin_port=htons(target_port); 

if ( sk_snd_buff > 0 )                                                                                                     >{                                                                                                     
  optlen = sizeof(sk_snd_buff);
  // get the default socketh send buffer size
 if (getsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, &curr_snd_buff, &optlen) == -1) {
    fatal("getting the socket send buffer");
  }
  printf("* default socket send buffer: %d\n", curr_snd_buff);
  printf("* attempting to change it to: %d\n", sk_snd_buff);
  if (setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, &sk_snd_buff, optlen) == -1) {
    fatal("changing the socket send buffer");
  }
  if (getsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, &curr_snd_buff, &optlen) == -1) {
    fatal("getting the socket send buffer");
  }
  printf("* new socket send buffer: %d\n", curr_snd_buff);
}

しかし、小さな値を設定しようとするたびに、バッファ サイズの下限が 4608 バイトに設定されていることがわかります。上記のコードの出力は次のとおりです。

  • デフォルトのソケット送信バッファ: 212992
  • 次のように変更しようとしています: 2304
  • 新しいソケット送信バッファ: 4608

さまざまなサイズを試してみたところ、これは 2304 以下のサイズで発生することがわかりました。2305 などのより大きなサイズの場合は、より大きなサイズが得られます。

  • デフォルトのソケット送信バッファ: 212992
  • 次のように変更しようとしています: 2305
  • 新しいソケット送信バッファ: 4610

3000 など、いくつかの大きなサイズの場合は、要求したサイズの 2 倍になります。

  • デフォルトのソケット送信バッファ: 212992
  • に変更しようとしています: 3000
  • 新しいソケット送信バッファ: 6000

ネットを検索すると、Linux はカーネル内で値を設定すると 2 倍になり、クエリを実行すると 2 倍の値が返されることが わかりました。 set/getsockopt SO_SNDBUF について

ソケット送信バッファ サイズの最小下限を減らす方法はありますか? たとえば、64 バイトに設定するには?

4

1 に答える 1