设置接受套接字的缓冲区大小
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)设置最大缓冲区大小