在我有兴趣接受之前,我可以将套接字留在 SYN_RECV 中吗?
Can I leave sockets in SYN_RECV until I'm interested in accepting?
在我写的 torrent client 中,我不接受连接,除非我真的想要或需要更多连接。这导致 netstat
显示很多 SYN_RECV
,这似乎是合理的,因为我还没有完成连接。这些是否消耗服务器上的可用文件描述符?在我真正想要接受之前让积压填满是不好的做法吗?有更好的做法吗?
没有。连接由 TCP 堆栈完成,可能在您调用 accept(),
之前很久就已完成,并被放置在积压队列中。 accept()
所做的只是在 backlog 队列为空时阻塞,然后移除并 return 头元素作为套接字 FD。它与连接握手没有任何关系。
积压队列中的连接不消耗文件描述符。 FD由accept().
分配
一般来说,您应该尽快处理积压队列。如果您从不接受积压队列中的连接,它最终会在您关闭侦听套接字时重置,这会使对等方感到困惑。与此同时,它一直在消耗一个套接字,可能还消耗了对等方的一个线程,浪费了那里的资源。如果您不想连接,请接受它并关闭它。
特定平台上的 YMMV。
Is there a better practice?
如果您暂时不想接受处理额外的连接,请接受并立即关闭它们。
但是在 bittorrent 的上下文中,您可能想要实现 BEP 40 并且至少执行一次 bittorrent 握手以查看连接属于哪个群以及您是否应该放弃现有的以支持新的一个并且只有在您确定连接的优先级低于现有连接时才关闭连接。
在我写的 torrent client 中,我不接受连接,除非我真的想要或需要更多连接。这导致 netstat
显示很多 SYN_RECV
,这似乎是合理的,因为我还没有完成连接。这些是否消耗服务器上的可用文件描述符?在我真正想要接受之前让积压填满是不好的做法吗?有更好的做法吗?
没有。连接由 TCP 堆栈完成,可能在您调用 accept(),
之前很久就已完成,并被放置在积压队列中。 accept()
所做的只是在 backlog 队列为空时阻塞,然后移除并 return 头元素作为套接字 FD。它与连接握手没有任何关系。
积压队列中的连接不消耗文件描述符。 FD由accept().
一般来说,您应该尽快处理积压队列。如果您从不接受积压队列中的连接,它最终会在您关闭侦听套接字时重置,这会使对等方感到困惑。与此同时,它一直在消耗一个套接字,可能还消耗了对等方的一个线程,浪费了那里的资源。如果您不想连接,请接受它并关闭它。
特定平台上的 YMMV。
Is there a better practice?
如果您暂时不想接受处理额外的连接,请接受并立即关闭它们。
但是在 bittorrent 的上下文中,您可能想要实现 BEP 40 并且至少执行一次 bittorrent 握手以查看连接属于哪个群以及您是否应该放弃现有的以支持新的一个并且只有在您确定连接的优先级低于现有连接时才关闭连接。