设置接受套接字的缓冲区大小

Posted

技术标签:

【中文标题】设置接受套接字的缓冲区大小【英文标题】:Setting buffer size of accepted sockets 【发布时间】:2016-09-29 13:33:38 【问题描述】:

在 Linux 下设置 accept() 的套接字的缓冲区(即 SO_RCVBUF、SO_SNDBUF)大小的正确方法是什么?

显而易见的答案是在新创建的套接字上调用 setsockopt(),但是 tcp 手册页指出:

在单个连接上,套接字缓冲区大小必须在 listen(2) 或 connect(2) 调用之前设置,以使其生效。有关详细信息,请参见 socket(7)。

这是有道理的,因为缓冲区可能是在创建时分配的,因此我必须通过设置缓冲区大小来依赖监听套接字的继承语义,除了手册页(也不是套接字的手册页)没有提及继承和实际状态:

在 Linux 上,accept() 返回的新套接字不会从侦听套接字继承文件状态标志,例如 O_NONBLOCK 和 O_ASYNC。此行为不同于规范的 BSD 套接字实现。可移植程序不应依赖于文件状态标志的继承或非继承,并始终在从 accept() 返回的套接字上显式设置所有必需的标志

目前尚不清楚“文件状态标志”指的是什么以及它是否包含套接字选项,并且在阅读 a few related *** questions 时,我一点也不聪明。

【问题讨论】:

我不认为“标志”包括套接字缓冲区大小。无论如何,您真正需要做的是对其进行测试。为此,您可以运行 ss -aie 来查看缓冲区大小等等——对于监听套接字和接受的套接字。 @JohnZwinck 不,我也不这么认为,但这是我能找到的对套接字继承细节的最接近的参考。 It's not clear what "file status flags" refer to 很清楚:accept() 系统调用实际上分配(创建)一个文件描述符,它从listen() 套接字继承(部分)其属性。大多数继承是指 IP 堆栈(首先出现,至少:启动所有这些事件),其中一些没有。 “文件状态标志”表示以 O_ 开头的布尔值。 【参考方案1】:

第一个引用仅适用于接收缓冲区,真正的原因是如果它> = 64k,则可以在连接握手期间协商窗口比例。答案确实是在监听套接字上设置它,所有接受的套接字都会从那里继承它,不,它不是文件状态标志。

【讨论】:

以上是关于设置接受套接字的缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中为 Web 套接字客户端(Jetty)设置最大缓冲区大小

Python网络编程——修改套接字发送和接收的缓冲区大小

TcpWindowSize 与 Windows 上的套接字缓冲区大小

在 Windows 下更改默认套接字缓冲区大小 [关闭]

套接字描述符就绪条件

Linux UDP 接收缓冲区的最大大小