我正在尝试使用多个客户端需要打开websocket并发送数据的服务器。但看起来很多客户都无法建立连接..
在服务器计算机上,当我执行lsof
或netstat -an
时,我发现除了连接之外,状态FIN_WAIT1
和FIN_WAIT2
中显示了很多连接处于ESTABLISHED
州。截至目前,打开文件的ulimit为1024。
陷入这两种状态的连接是否会在打开文件列表中计算?如果是这样,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
但我不太了解。 我已经在网上看到了这两个状态,我意识到它们是协议的一部分,但是我更喜欢这些连接不会陷入它们没有用的状态。 我能以某种方式这样做吗?我应该改变ulimit吗?但这只是意味着问题将发生在时间x + y而不是x。
答案 0 :(得分:2)
每当您看到Fin_Wait状态或任何等待状态时,我们通常会将这些状态称为1/2会话。 TCP堆栈遵循请求和响应顺序的非常严格的协议。正是由于这些规则,它知道如何以及何时以及如何通过发送重试来尝试恢复。在任何等待状态的情况下,堆栈知道它正在等待某事。只有两件事能满足这种条件1)某种正确的反应或2)超时。
当然,最好的方法是获得适当的回应。应该做的工作是找出为什么有这么多等待。有时这是由于不稳定的切换,路由和/或其他网络相关的活动。但是,它也可能是拒绝服务攻击的结果,因为他们不关心国家。可以释放应用程序层中必要资源的唯一方法是应用程序重新获得控制权。 TCP仅在以下情况下进行控制:1)工作流程正常或2)发生超时或其他异常情况。例如,FIN和RST可以在任何时候不按顺序发送。他们都被认为胜过任何其他州。请记住,并非所有客户端或主机的行为方式都与我们讨论不同的TCP堆栈实现方式相同。
根据系统的不同,可以配置一些,很多或很少的TCP Stack参数。 Fin Waits上的Timeout值以及RST Waits都有可配置的参数。也许您可以调整这些来解决您的问题。