【发布时间】:2016-05-08 14:35:20
【问题描述】:
在我写的torrent client 中,我不接受连接,除非我真的想要或需要更多连接。这导致netstat 显示很多SYN_RECV,这似乎是合理的,因为我还没有完成连接。这些会消耗服务器上可用的文件描述符吗?在我真正想要接受之前让积压工作填满是不好的做法吗?有更好的做法吗?
【问题讨论】:
标签: sockets tcp server bittorrent backlog
在我写的torrent client 中,我不接受连接,除非我真的想要或需要更多连接。这导致netstat 显示很多SYN_RECV,这似乎是合理的,因为我还没有完成连接。这些会消耗服务器上可用的文件描述符吗?在我真正想要接受之前让积压工作填满是不好的做法吗?有更好的做法吗?
【问题讨论】:
标签: sockets tcp server bittorrent backlog
没有。连接由 TCP 堆栈完成,可能早在您调用 accept(), 并放入积压队列之前。 accept() 所做的只是在 backlog 队列为空时阻塞,然后将 head 元素作为套接字 FD 移除并返回。它与连接握手没有任何关系。
积压队列中的连接不消耗文件描述符。 FD由accept().分配
一般来说,您应该尽快处理积压队列。如果您从不接受积压队列中的连接,它最终会在您关闭侦听套接字时重置,这会使对等方感到困惑。与此同时,它一直在消耗对等端的一个套接字和一个线程,从而浪费了那里的资源。如果您不想要该连接,请接受它并关闭它。
特定平台上的 YMMV。
【讨论】:
有更好的做法吗?
如果您暂时不想接受处理其他连接,请接受并立即关闭它们。
但在 bittorrent 的上下文中,您可能希望改为实现 BEP 40,并至少执行一次 bittorrent 握手以查看连接属于哪个群以及是否应该放弃现有的连接以支持新连接并仅关闭如果您确定连接的优先级低于现有连接,则连接。
【讨论】: