TCP连接:一段时间后,服务器无法将数据包发送到客户端。客户可以

问题描述 投票:0回答:1

我认为它仅与TCP层有关,但是我在以下段落中描述了我的设置:

在Google计算引擎上,我设置了http和websocket服务器(python,geventwebsocket + gevent.WSGIServer)。在家里,我有我的计算机(esp8266)使用websockets连接到它。

我使用websockets是因为我需要双向通信(每天几条消息,就像这样:server发出的消息,client发出的响应。)连接本身是由客户端发起的,因为它位于NAT之后。

问题是从最后一次数据包交换开始几秒钟后,来自[[服务器的消息没有到达客户端。但是,client甚至可以在数分钟后(甚至更长)将数据包发送到服务器。然后有趣的是,来自server的可能重新传输的数据包终于到达了。

我检查了数据包的确是通过Wireshark从服务器发送的(如果没有得到确认,则会重新传输)并在客户端记录所有网络通信,因此问题可能出在应用程序软件上。我在应用程序中没有例外。连接已打开。

我测试了时间服务器通常可以在连接发起/最后传送的数据包之后发送数据包,时间在6到20秒之间,不同测试之间有所不同。在测试服务器中,发送的数据包之间具有固定的固定延迟。

在具有单个设置延迟的测试(一对数据包中,通常要么所有数据包都到达,要么都不到达(是的,如果一个没有到达,则下一个不会到达。)

我怀疑这可能是因为NAT。但是我看到的一种解决方案是定期(每6秒或更短)从

client

发送保持活动的数据包(Websocket中的Ping和Pongs,或TCP的keepalive)。但这似乎并不优雅,因为一天中应该只有几条数据消息。而且从我的桌面到服务器ssh时也会发生类似的事情:在我的[[和服务器端不活动了几秒钟之后,服务器停止发送任何东西(例如用watch -n20 date测试。有时冻结,并且直到我按下一个键才更新=从客户端发送一个数据包。但是对于ssh来说更新不是立即的,在按键后需要几秒钟才能看到新内容编辑:当然,必须由于重传计时器算法)

因此,我研究了TCP保持活动数据包等的用途,而事实是路由器和NAT忘记了连接或映射或在某个时间之内/仅保留最新的内容。 (因此,我猜想在client-> server的情况下,由于目标ip是公共的并且是实际的服务器,因此映射只是重新创建。而在相反的方向,则不可能,因此不起作用。)


但是没有想到它会像6秒内那样糟糕。网络套接字几乎减少到轮询(尽管滞后可能更小)。
networking websocket tcp firewall nat
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.