连接后无法访问服务器的tcp连接问题

时间:2015-12-12 07:26:43

标签: sockets tcp

我遇到了tcp连接的问题..

我有很多客户端通过tcp连接到远程服务器。 现在,如果由于任何问题我无法访问我的服务器,成功建立tcp连接后,我在客户端没有收到任何错误。

在客户端,如果我使用netstat,它会显示客户端已连接远程服务器,即使我无法ping服务器。

所以,现在我处于服务器显示它没有连接到任何客户端的情况下,另一端客户端显示它已连接到服务器。

我已经使用node.js对websocket进行了测试,但同样的行为也存在。

我试过谷歌,但没有运气。 那有什么标准的解决方案吗?

1 个答案:

答案 0 :(得分:1)

这是设计的。

如果两个端点之间的套接字(TCP)连接成功,但未发送任何数据,则两个端点上的TCP状态机仍处于CONNECTED状态。

想象一下,如果您在PC上的终端窗口中打开了一个shell连接,则可以通过Internet连接到远程Unix计算机。那天晚上,当终端窗口仍然登录并在远程服务器上的shell提示符下离开工作。

一夜之间,你的电脑和远程电脑之间的一些路由器熄灭了。几小时后,路由器被修复了。您第二天开始工作并开始在shell提示符下键入内容。就像失去连接从未发生过一样。这怎么可能?因为在中断期间,任一端点上的套接字都没有任何内容可以发送。鉴于此,TCP状态机无法检测到连接故障 - 因为实际上没有发生流量。现在,如果您在停机期间尝试在提示符下键入内容,则套接字连接最终会在一两分钟内超时,终端会话将结束。

一种解决方法是在套接字上启用SO_KEEPALIVE选项。带有此套接字选项的YMMV - 因为此TCP模式并不总是以您控制的速率发送保持活动消息。

更常见的方法是让套接字定期发送数据。为了这个目的,我使用的TCP之上的一些协议有自己的“ping”消息概念。也就是说,客户端每分钟通过TCP套接字发送一个“ping”消息,服务器以“pong”或某些等效的方式响应。如果双方都没有在N分钟内获得预期的ping / pong消息,那么无论套接字错误状态如何,连接都被认为是死的。这种发送周期性消息的方法也有助于NAT在一段时间内没有观察到流量时往往会丢弃非常安静协议的TCP连接。