C#获取系统上Socket.ReceiveBufferSize和Socket.SendBufferSize的最大值

本文关键字:Socket SendBufferSize 最大值 ReceiveBufferSize 系统 获取 | 更新日期: 2023-09-27 17:58:52

我们的高吞吐量应用程序(~1gbps)从大的ReceiveBufferSize和SendBufferSize中受益匪浅。

我注意到在我的机器上,我可以有一个100 MB的缓冲区大小,没有任何问题,但在一些客户端和测试机器上,最大值略高于10 MB,而且似乎是可变的。

有没有任何方法可以查询系统最大tx/rx缓冲区大小。

C#获取系统上Socket.ReceiveBufferSize和Socket.SendBufferSize的最大值

实际上,根据KB181611:,对于高性能网络,SO_RCVBUFSO_SNDBUF选项应设置为0以避免缓冲区复制

如果使用SO_RCVBUF和SO_SNDBUF设置零TCP堆栈接收的选项和发送缓冲区,你基本上指示TCP堆栈直接使用提供的缓冲区执行I/O在您的I/O呼叫中。因此,在除了非阻塞优势对于重叠的套接字I/O另一个优点是性能更好因为您在TCP堆栈缓冲区和用户每个I/O调用的缓冲区。但你有以确保您不会访问该用户一旦提交缓冲区重叠操作和重叠操作完成。

您可以设置这些选项的最大值(这是托管Socket.ReceiveBufferSize背后的实际设置)是"依赖于实现的"。其他TCP参数记录在TCP/IP注册表设置中。

这两个属性在内部使用套接字选项(通过SetSocketOption,最终到本地setsockopt)。如果内存提供服务,这些将取决于可用的非分页池内存(这会改变机器之间的关系),以及每台机器上可能存在的网络驱动程序。

不管怎样,你实际上不能保证你请求的缓冲区大小被使用,你必须在事实发生后检索当前的缓冲区尺寸,以确保它被使用。此外,据我所知,在Windows 7和2008机器上,您的缓冲区可能会动态增加/减少。

简而言之,您可能只能测试不断增加的缓冲区大小,并取不会导致错误的最大值。有太多的变量在起作用,这可能决定最大大小。