我正在尝试使用一个服务器,多个客户端需要使用该服务器打开websocket并发送数据。但看起来许多客户端无法建立连接。
在服务器机器上,当我执行lsof
或netstat -an
时,我看到除了连接处于ESTABLISHED
状态外,很多连接都显示在状态FIN_WAIT1
和FIN_WAIT2
中。截至目前,打开文件的 ulimit 为 1024。卡在这 2 种状态下的连接会计入打开的文件列表中吗?如果是这样的话,1024 的限制很快就会耗尽。
/proc/sys/net/ipv4/tcp_orphan_retries
是0
,相当于看起来8
https://serverfault.com/questions/274212/what-does-tcp-orphan-retries-set-to-0-mean/408882#408882
我已经查阅了这个链接:https://serverfault.com/questions/7689/how-do-i-get-rid-of-sockets-in-fin-wait1-state
但我不太明白。我已经在网上阅读了有关这两种状态的信息,我意识到它们是协议的 aprt,但我宁愿连接不要卡在它们没有用的状态中。我可以以某种方式做到这一点吗?我应该更改 ulimit 吗?但这只意味着问题将在时间 x+y 而不是 x 发生。
每当您看到Fin_Wait状态或任何等待状态时,我们通常将这些称为 1/2 会话。 TCP 堆栈在请求和响应的顺序上遵循非常严格的协议。 正是由于这些规则,它知道如何、何时以及尝试通过发送重试来恢复的难度。 在任何等待状态的实例中,堆栈都知道它正在等待某些东西。 只有两件事可以满足这个条件:1)某种适当的响应或2)超时。
当然,最好的方法是得到适当的回应。应该努力找出为什么有这么多等待。 有时是由于不稳定的交换、路由和其他与网络相关的活动。 但是,这也可能是拒绝服务攻击的结果,因为他们不关心状态。 释放应用程序层必要资源的唯一方法是在应用程序重新获得控制权时。 TCP 仅在 1) 工作流正常或 2) 发生超时或其他异常情况时提供控制。 例如,FIN 和 RST 可以随时不按顺序发送。 他们都被认为胜过任何其他州。 请记住,并非所有客户端或主机的行为方式都与我们讨论不同的TCP堆栈实现相同。
根据系统的不同,可以配置一些、许多或很少的 TCP 堆栈参数。 鳍等待和 RST 等待的超时值有可配置的参数。 也许您可以调整这些来解决您的问题。