udp套接字接收缓冲区大小

udp socket receive buffer size

我正在使用 Netty(一个 java 网络框架)来处理 UDP 请求。

我找到了

SO_RCVBUF

/proc/sys/net/core/rmem_default

/proc/net/udp

输出混乱:

根据socket的手册(man 7 socket)是这样解释的:

rmem_default contains the default setting in bytes of the socket receive buffer.

rmem_max contains the maximum socket receive buffer size in bytes which a user may set by using the SO_RCVBUF socket option.

和 /proc/net/udp 显示 udp 接收队列大小:

 sl  local_address rem_address   st tx_queue          rx_queue    tr         tm->when   retrnsmt uid     timeout inode                                           
 60: 00000000:2F3C 00000000:0000 07 00000000:0003E094 00:00000000 00000000   500        0        2224362 2       ffff810066908cc0 

我可以得到 SO_RCVBUF = 12904,但是 rx_queue 大小是 254100(3E094) , 而 rmem_default 是 262142

我的困惑是,为什么 SO_RCVBUF 不等于 rmem_default,为什么队列大小不等于 SO_RCVBUF(但大于它)?

它接缝 ctx.channel().config().getOption(ChannelOption.SO_RCVBUF) 的值是 /proc/sys/net/core/rmem_default 的一半,实际接收缓冲区大小(队列大小)也是 /proc/sys/net/core/rmem_default

的值

那么为什么 ctx.channel().config().getOption(ChannelOption.SO_RCVBUF) 不等于系统的配置?

您似乎误读了输出。当您正确排列列时,rx_queue 为零。

接受的答案是错误的。正确的对齐方式是:

tx_queue rx_queue
00000000:0003E094

所以 rx_queue0x0003E094254100。这可以使用 netstat -unlp | grep pid 来确认,Recv-Q 是第二列。示例输出:

cat /proc/net/udp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops             
 8101: 41FD080A:06A5 00000000:0000 07 00000000:00005A00 00:00000000 00000000  1000        0 3892411 2 0000000000000000 0 

netstat --udp -nl
Proto Recv-Q Send-Q Local Address           Foreign Address         State
udp    23040      0 10.8.253.65:1701        0.0.0.0:*

这里,0x00005A00==23040