WebSocket连接卡在FIN_WAIT1和FIN_WAIT2状态

3
我正在尝试创建一个服务器,多个客户端需要打开websocket并发送数据。但似乎许多客户端无法建立连接。
在服务器上,当我执行lsofnetstat -an时,除了连接处于ESTABLISHED状态外,还显示了很多连接处于FIN_WAIT1FIN_WAIT2状态。目前打开文件的ulimit为1024。那些卡在这两种状态中的连接会计入打开文件列表吗?如果是这样,1024限制很快就会用完。 /proc/sys/net/ipv4/tcp_orphan_retries0,似乎相当于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 但是我不太理解。 我在网上读到了关于这两种状态的信息,我意识到它们是协议的一部分,但我希望连接不会被卡在无用的状态中。 我能做些什么吗?我应该改变ulimit吗?但那只是意味着问题会在x+y的时间发生而不是x。
1个回答

3
任何时候,当您看到Fin_Wait状态或任何等待状态时,我们通常将它们称为1/2会话。 TCP堆栈遵循非常严格的协议,请求和响应的顺序是其知道如何以及何时以及以何种难度尝试通过发送重试来恢复的原因。在任何等待状态下,堆栈都知道它正在等待某些东西。只有两件事情能满足这个条件:1)某种适当的响应;2)超时。

当然,最好的方法是获得适当的响应。应该进行一些工作,以找出为什么有这么多等待。有时由于不稳定的交换、路由和其他网络相关活动导致。但是,这也可能是拒绝服务攻击的结果,因为它们不关心状态。必要的应用程序层资源可以释放的唯一方法是当应用程序重新控制时。TCP仅在以下情况下给出控制权:1)工作流程正常;2)发生了超时或其他异常情况。例如,FIN和RST可以无须顺序地随时发送,它们都被认为优先于任何其他状态。请记住,并非所有客户端或主机都像我们所说的那样行事,因为我们正在谈论不同的TCP堆栈实现。

根据系统的不同,可以配置一些、许多或非常少的TCP堆栈参数。有关Fin_Wait和RST_Wait的超时值也有可配置参数。也许您可以调整这些来解决您的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接