当数据以“1c”开头时,TCP 数据包不会从俄罗斯传输到加拿大

本文关键字:数据包 俄罗斯 加拿大 传输 TCP 数据 1c 开头 | 更新日期: 2023-09-27 17:55:33

我们有一个TCP流协议,我们用大小作为数据有效负载的前缀。因此,数据在接收时可以正确解码。非常标准的东西。

这对成千上万的人来说效果很好。不幸的是,我们至少有 4 个客户报告了连接问题的案例,都在偏远国家。俄罗斯的一位客户已经能够帮助我们进行大量测试并缩小问题范围。如果我们发送前缀大小强制为 0 的数据包,则整个数据包将通过。如果数据包数据以 1c 开头,则数据包将无法通过。

我从他的电脑中截取了两张并排的Wireshark截图,显示了这一点:

Working
-------
Russia -> Toronto [SYN]
Toronto -> Russia [SYN, ACK]
Russia -> Toronto [ACK]
Russia -> Toronto [PSH,ACK] <- data is sent here
00000000000000001c0000000000000000000000000000000000000000000000
Toronto -> Rusion [PSH,ACK] <- server in toronto got the data, sent a reply!

Not-Working
--------
Russia -> Toronto [SYN]
Toronto -> Russia [SYN, ACK]
Russia -> Toronto [ACK]
Russia -> Toronto [PSH,ACK] <- data is sent here
1c000000000000001c0000000000000000000000000000000000000000000000
Russia -> Toronto [PSH,ACK] <- TCP Retransmission
Russia -> Toronto [PSH,ACK] <- TCP Retransmission
Russia -> Toronto [PSH,ACK] <- TCP Retransmission
Russia -> Toronto [PSH,ACK] <- TCP Retransmission
Server in Toronto never gets the packet from Russia!

实际的客户端和服务器使用 IOCP,但我的测试应用使用 C# TcpListenerTcpClient,根本没有自定义选项标志。

Not actual code
--------------
var client = new TcpClient()
client.Connect(host, port)
client.GetStream().Write()
client.GetStream().Read()
var listener = new TcpListener(port);
listener.Start();
var serverClient = listener.AcceptTcpClient();
serverClient.GetStream().Read()
serverClient.GetStream().Write()

是否有任何进一步的测试可以推荐以获取更多信息/解决此问题?我的预感是他的硬件/驱动程序已损坏,但他声称对任何其他应用程序或互联网都没有问题。

当数据以“1c”开头时,TCP 数据包不会从俄罗斯传输到加拿大

可能是其中一个末端链接是在移动运营商上吗?

我不再有数据了,但由于我们处于猜测领域,我记得不久前意大利移动运营商也出现了类似的问题:显然,数据连接上的某个位序列会丢弃运营商。隐约类似于 +++ATH0 旧的"ping"技巧。

您能否尝试通过另一种介质(例如 netcat 流)发送类似的序列(1c0000000...)?