OpenVPN sndbuf 和 rcvbuf

OpenVPN sndbuf 和 rcvbuf

我想知道OpenVPN 使用的 sndbuf 和 rcvbuf 缓冲区与 net.core.w/rmem_default 或 net.ipv4.tcp_r/wmem 之间有什么区别。

当配置中为这些参数提供了某些值时,OpenVPN 会做什么?我读到,如果使用 0,它会使用 OS 默认缓冲区大小,但它从哪个缓冲区获取大小?或者它是一个额外的层,当您将其设置为 0 时,这个额外的布局会消失吗?

我的问题是,当我将 sndbuf 和 rcvbuf 设置为 0 并将 net.core.w/rmem_default 或 net.ipv4.tcp_r/wmem 设置为 64k 时,我期望的吞吐量与未设置 sndbuf 和 rcvbuf 时相同,因为 sndbuf 和 rcvbuf 的默认值为 64k

不幸的是事实并非如此,使用 OS 缓冲区时吞吐量较低。

这可能是因为我没有设置正确的 OS 缓冲区,或者 OpenVPN 在使用 sndbuf 和 rcvbuf 时做了一些特殊的事情。

如果有人能详细解释我将不胜感激

谢谢

阿洛

-----------------------------------------

经过一番研究,我发现 OpenVPN 使用 setsockopt 来设置配置文件中 sndbuf 和 rcvbuf 值的 SO_SNDBUF 和 SO_RCVBUF 的值。这只会影响 OpenVPN 创建的套接字,而不会影响所有 TCP /UDP 套接字。

SO_SNDBUF 和 SO_RCVBUF 相当于设置:

  • /proc/sys/net/core/rmem_max
  • /proc/sys/net/core/wmem_max
  • /proc/sys/net/net.ipv4/tcp_rmem
  • /proc/sys/net/net/ipv4/tcp_wmem

对于 openvpn 使用的协议(tcp 或 udp)(可能是 _default 而不是 _max 我仍然不确定)。

使用 setsockopt() 手动调整套接字缓冲区大小会禁用 TCP 自动调整。(可能不是真的)

关于 TCP 受到 r/wmem_default 缓冲区大小的影响,我发现两个答案说相反:

  • 您不需要调整 rmem_default 或 wmem_default(至少对于 TCP 调整不需要)。这些是非 TCP 套接字(例如 unix 域和 UDP 套接字)的默认缓冲区大小。

  • wmem_default 和 wmem_max 这些设置是修复所有网络流量(UDP 和 TCP)的默认发送和接收窗口大小

欢迎任何有更多知识的人纠正我:)

相关内容