TCP 重传和单向通信(仅限服务器到客户端)

TCP 重传和单向通信(仅限服务器到客户端)

我正在从一个用 Dart 语言编写的客户端连接到一个用 Golang 编写的 TCP 服务器,出现了这种奇怪的行为;

建立从客户端到服务器的连接后,如果客户端发送任何数据,连接就会冻结。我使用 Wireshark 检查了一下,发现有以下重传错误:

Wireshark 日志

同样在这种状态下,服务器也无法向客户端发送任何东西。

但是,如果客户端在连接后不发送任何内容,服务器可以毫无问题地传输数据。有时通信至少需要 2 个数据包才能正常工作,这种情况是随机发生的。

现在我住在伊朗,使用政府赞助的 ISP(TCI)的 ADSL2+,这个问题只发生在这家提供商身上,我的朋友也遇到了。但 4G/LTE 运营商没有问题,使用我的 SIM 卡,我可以毫无问题地双向与服务器通信。

使用带有 ADSL2+ 的 VPN,我也可以顺利进行通信。

我使用 Golang 实现了客户端,以确保问题不在于编程语言,我也将服务器移到了另一个 IP 并在那里尝试,但问题仍然存在。

由于这里的互联网审查非常严格,特别是对 Telegram 以及更多 ADSL 服务的审查,我猜测他们的系统错误地将这些数据包检测为非法并将其丢弃。

这不会发生在 websocket 或 http 等协议上,但会发生在我用于通信的原始 tcp 上。

我怎样才能确定我的问题与我的 ISP 有关,以便从技术上说服他们?

笔记:

  • 伊朗政府严格审查互联网内容,尤其是 Twitter 和 Facebook 等社交网络平台以及 Telegram 和 Signal 等即时通讯应用。
  • 我的应用程序似乎没有任何问题,因为它确实有效在其他网络(如 4G/LTE 和 VPN)上。不过可能还有一些我不知道的额外配置。
  • 使用 Websockets 时,我没有遇到同样的问题,我认为这是因为协议的第一个 HTTP 请求。这可能为政府提供了线索,表明这是一个已知的 websocket 数据包。

相关内容